OpenCV做图像FFT时报错无法将(480,640,3)数组广播到(480,640)怎么修复
错误修复方案
错误根因
cv2.imread默认返回三通道BGR彩色图像,数组形状为(480,640,3),但你FFT处理逻辑中创建的填充矩阵imgPadded是仅包含高、宽两个维度的单通道数组,形状为(rPadded, cPadded),三维数组无法直接赋值给二维数组,因此触发广播错误。
修复步骤
- 修改图像读取代码,指定读取为单通道灰度图:
将原代码:
img_gray = cv2.imread("/content/hinh1.jpg")
修改为:
# 传入IMREAD_GRAYSCALE参数,直接读取为二维单通道灰度数组 img_gray = cv2.imread("/content/hinh1.jpg", cv2.IMREAD_GRAYSCALE)
修改后图像数组维度和后续处理逻辑匹配,即可解决报错。
可选性能优化
你当前中心化逻辑用的Python原生双重循环效率很低,可替换为numpy广播运算,运行速度提升明显:
将stdFftImage函数内的循环部分替换为如下代码即可:
# 用numpy广播实现逐像素乘(-1)^(r+c),无需逐行逐列遍历 fimg = img_gray.astype(np.float32) * ((-1) ** np.indices((rows, cols)).sum(axis=0))
内容的提问来源于stack exchange,提问作者Nam Hoang
相关产品推荐
相关产品推荐

