You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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);

问题排查与原因分析

  1. 变量名不一致导致输入图像不同
    官方conv2函数使用的输入图像是grayfun,但手动实现部分用的是grayman——如果这两个变量不是指向同一幅图像矩阵,那两次卷积的输入本身就不一样,结果自然会有差异。这是最可能导致HPF结果不同的原因。

  2. padding矩阵未初始化
    代码中直接对padding进行赋值,但没有提前创建一个尺寸为(row+2)×(col+2)的全零矩阵。如果padding在之前的代码中已经存在其他数据,会导致图像边缘的padding区域被错误值覆盖,进而影响卷积计算结果。

修复建议

  • 统一输入图像变量名:将grayman改为grayfun,确保两次卷积使用同一输入。
  • 初始化padding矩阵:在赋值前添加padding = zeros(row+2, col+2);,确保边缘区域为零填充。

修改后重新运行代码,应该就能得到和conv2一致的HPF卷积结果。

内容的提问来源于stack exchange,提问作者asdjkh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 17:10:10