MATLAB手动实现卷积与conv2结果差异:HPF为何不一致?
手动实现conv2时HPF卷积结果与官方函数不一致的问题分析
我正在学习MATLAB中的卷积操作,尝试用for循环手动实现conv2函数。但对比图像与HPF(高通滤波器)分别通过conv2和手动代码的卷积结果时,发现存在差异;而用相同方式实现LPF(低通滤波器)时,结果完全一致。不确定错误出在哪里,请问为何HPF会产生不同结果?
相关代码如下:
HPF = [-1 -1 -1; -1 8 -1; -1 -1 -1]; %--------------------------using function--------------------------------- HPFimage1 = conv2(grayfun,HPF,'same'); %--------------------------without funtion--------------------------------- %--------------------------zero padding--------------------------------- for i = 1 : row for j = 1 : col padding(i+1,j+1) = grayman(i,j); end end % ------------------------------HPF------------------------- i = 2; j = 2; HPFimage2 = zeros(row,col); for x = 0 : row-1 for y = 0 : col-1 % Extracting and calculating a 3x3 matrix sumval = 0; for m = 0 : 2 for n = 0 : 2 sumval = sumval + (padding(x+m+i-1,y+n+j-1)*HPF(m+1,n+1)); end end HPFimage2(x+1,y+1) = sumval; end end HPFsubresult = abs(HPFimage1) - abs(HPFimage2);
问题排查与原因分析
变量名不一致导致输入图像不同
官方conv2函数使用的输入图像是grayfun,但手动实现部分用的是grayman——如果这两个变量不是指向同一幅图像矩阵,那两次卷积的输入本身就不一样,结果自然会有差异。这是最可能导致HPF结果不同的原因。padding矩阵未初始化
代码中直接对padding进行赋值,但没有提前创建一个尺寸为(row+2)×(col+2)的全零矩阵。如果padding在之前的代码中已经存在其他数据,会导致图像边缘的padding区域被错误值覆盖,进而影响卷积计算结果。
修复建议
- 统一输入图像变量名:将
grayman改为grayfun,确保两次卷积使用同一输入。 - 初始化padding矩阵:在赋值前添加
padding = zeros(row+2, col+2);,确保边缘区域为零填充。
修改后重新运行代码,应该就能得到和conv2一致的HPF卷积结果。
内容的提问来源于stack exchange,提问作者asdjkh
相关产品推荐
相关产品推荐

