使用OpenCV复制图像后无法将其在扩大的黑色画布中居中
修复方案
现有代码核心问题
- 偏移量计算逻辑错误:你当前算的
shift是画布高度的一半,正确的居中偏移应该是画布尺寸减去原图像尺寸的差值的一半,这样才能保证原图上下左右的黑边宽度一致 - 像素赋值坐标错误:直接把原图像像素放到空画布的左上角对应位置,没有叠加偏移量
- 存在冗余错误代码:
emptyIm[i,j] = emptyIm[j,i] - image[int(shift)-1, int(shift1)-1]这行逻辑完全错误,会导致像素值异常,需要删除 - 空画布数据类型未指定:默认创建的是float类型数组,和图像需要的uint8类型不匹配,容易出现显示异常
修正后可运行代码
import cv2 import numpy as np # 读取图像 image = cv2.imread("cones11.png") numRows = image.shape[0] # 原图高度 numCols = image.shape[1] # 原图宽度 # 放大系数 scalar = 1.2 # 计算新画布尺寸 new_h = int(scalar * numRows) new_w = int(scalar * numCols) # 计算居中偏移量(取整避免小数坐标) offset_y = (new_h - numRows) // 2 offset_x = (new_w - numCols) // 2 # 创建uint8类型的黑色空白画布 emptyIm = np.zeros((new_h, new_w, 3), dtype=np.uint8) # 像素赋值,叠加偏移量实现居中 for i in range(numRows): for j in range(numCols): emptyIm[offset_y + i, offset_x + j] = image[i, j] # 也可以不用循环直接切片赋值,效率更高: # emptyIm[offset_y:offset_y+numRows, offset_x:offset_x+numCols] = image # 显示图像 cv2.imshow("original", image) cv2.imshow("enlarged with border", emptyIm) cv2.waitKey(0) cv2.destroyAllWindows()
优化说明
直接用numpy切片赋值的方式可以替代双层for循环,运行效率会高很多,尤其处理大尺寸图像的时候优势明显。
内容的提问来源于stack exchange,提问作者Zach Bando
相关产品推荐
相关产品推荐

