为什么将conv2()的输出除以sz ^ 2`?

时间:2018-09-03 07:33:09

标签: matlab image-processing octave

以下例程从图像中减去平均值,使其更清晰。

  • im是图像矩阵。
  • sz是整数。

此例程的工作方式:

  1. 首先将图像转换为两倍。
  2. sz的一半用作填充大小值(这意味着此例程将在图像上应用卷积)。
  3. m是图像的高度,n是图像的宽度,o是否。图片中的通道数。
  4. 大小为sz x sz的2d数组初始化为1s。
  5. 声明了一个for循环,该循环可进行三个迭代,因为此例程将对每个通道应用卷积运算。
  6. im(:,:,q)表示就地应用了过滤器。
  7. same表示卷积操作返回卷积的中心部分,其大小与im相同。即正在裁剪卷积输出。

function pad = erase_mean(im, sz)    
    im = double(im);

    pad = floor(sz/2);
    [m,n,o] = size(im);

    mask = ones(sz,sz);

    for q=1:o       
        im(:,:,q)=double(im(:,:,q))-conv2(double(im(:,:,q)),mask,'same')./sz^2;

        mx=max(max(im(1+pad*2:m-pad*2,1+pad*2:n-pad*2,q)));

        im(:,:,q)=(im(:,:,q)./mx).*255;        
    end;

    mx = max(max(im(1+pad*2:m-pad*2,1+pad*2:n-pad*2,q)));
    im = uint8((im./mx(1)).*255);
    pad = im(1+pad*2:m-pad*2,1+pad*2:n-pad*2,:);

为什么conv2()的输出除以sz^2

1 个答案:

答案 0 :(得分:3)

请注意

conv2(double(im(:,:,q)),mask,'same')./sz^2

相同
conv2(double(im(:,:,q)),mask./sz^2,'same')

这是因为卷积和乘法通勤。

因此,卷积运算将计算局部均值。如果不进行除法,那将是一个本地和。