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

Why is the output of `conv2()` is divided by `sz^2`?

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

这个例程的工作原理:

  1. 图像首先转换为double。
  2. sz 的一半用作 pad-size 值(这意味着此例程将在图像上应用卷积)。
  3. m是图片的高度,n是图片的宽度,o是没有。图像中的通道数。
  4. 大小为 szxsz 的二维数组初始化为 1s。
  5. 声明了一个 for 循环,它在三个迭代中工作,因为此例程将在每个通道上应用卷积运算。
  6. im(:,:,q) 表示就地应用过滤器。
  7. same表示卷积运算returns卷积的中心部分,与im大小相同。 IE。它正在裁剪卷积输出。

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

注意

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

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

这是因为卷积和乘法互换了。

因此,卷积运算计算局部均值。没有除法就是局部求和