自行实现的Python图像卷积函数返回带黑边空白图像是什么原因?
问题原因
遍历索引范围错误
你当前循环使用的range(kx, x - kx)范围完全不符合要求:以3x3尺寸的kernel为例,正确的遍历起始位置是start = floor(kx/2) = 1,结束位置是x - end = x - 2,而非从kx=3的位置开始。该错误会导致图像大部分区域的卷积结果保持初始化的0值,仅中间极小一块区域有计算结果。
输出数值类型与显示范围不匹配
OpenCV的cv2.filter2D传入ddepth=-1时,会自动将输出转换为和输入一致的uint8类型(取值范围0-255),同时自动完成数值截断。
而你自定义函数中convolved数组默认是float64类型:如果直接用图像展示工具输出float数组,工具默认会将0-1区间映射为黑到白,所有数值大于1的像素都会显示为纯白色,和你描述的现象完全吻合。
可选验证项:零填充是否正确执行
你的函数注释要求输入img已经完成对应尺寸的零填充,如果实际输入时没有做对应处理,也会导致边缘计算结果异常。
修正后的代码
import numpy as np from math import floor, ceil def convolve(img, kernel): # img should have zero padding kx, ky = kernel.shape # kernel is square so kx == ky start, end = floor(kx / 2), ceil(kx / 2) x, y = img.shape # 直接指定输出类型和输入图像一致为uint8 convolved = np.zeros((x, y), dtype=np.uint8) # 修正遍历范围 for i in range(start, x - end): for j in range(start, y - end): convolved_area = img[i - start:i + end, j - start:j + end] * kernel # 求和后做数值截断,避免溢出0-255范围,四舍五入后再赋值 convolved[i][j] = np.clip(np.sum(convolved_area), 0, 255).round() return convolved
内容的提问来源于stack exchange,提问作者Manusman
相关产品推荐
相关产品推荐

