Scipy convolve2d拒绝接收二维数组错误排查求助
解决方法
错误原因
你传入convolve2d的average不是二维数组——cv2.imread默认读取彩色图像,返回的是三维数组(高度×宽度×3个RGB通道),经过cv2.filter2D处理后,结果依然是三维结构,而convolve2d要求输入必须是二维单通道数组。
修复方案
有两种处理方式,根据你的需求选择:
方案1:转为灰度图处理(最直接)
在读取图像后,先转成单通道灰度图,后续所有处理都基于灰度图:
# 读取图像时直接转为灰度,或者读取后转换 img = cv2.imread('/content/mydata/circles.jpg', cv2.IMREAD_GRAYSCALE) # 或者: # img = cv2.imread('/content/mydata/circles.jpg') # img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
之后再执行cv2.filter2D和convolve2d操作,此时average就是二维数组,不会再触发报错。
方案2:保留彩色图,逐个通道处理
如果需要对彩色图像的每个通道分别做边缘检测,可以遍历RGB三个通道,逐个处理后再合并:
# 初始化存储结果的数组 d_horiz = np.zeros_like(average) d_vert = np.zeros_like(average) # 遍历每个通道 for i in range(average.shape[2]): d_horiz[:, :, i] = convolve2d(average[:, :, i], sobel_horiz, boundary='symm', mode='same', fillvalue=0) d_vert[:, :, i] = convolve2d(average[:, :, i], sobel_vert, boundary='symm', mode='same', fillvalue=0) # 计算边缘 edgel = np.sqrt(np.square(d_horiz) + np.square(d_vert)) edgel *= 255.0 / np.max(edgel)
验证数组维度的小技巧
以后遇到类似问题,可以在报错代码前加一行打印,确认数组维度:
print(average.shape) # 查看数组形状,灰度图是(H,W),彩色图是(H,W,3)
内容的提问来源于stack exchange,提问作者FinMartinez
相关产品推荐
相关产品推荐

