首页 文章

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

提问于
浏览
-16

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

  • im是图像矩阵 .

  • sz是一个整数 .

这个例程如何工作:

  • 图像首先转换为double .

  • sz 的一半用作pad-size值(这意味着此例程将在图像上应用卷积) .

  • m是图像的高度,n是图像的宽度,o是否 . 图像中的通道 .

  • 2d数组大小 sz x sz 初始化为1秒 .

  • 声明for循环,它在三次迭代中起作用,因为此例程将在每个通道上应用卷积运算 .

  • im(:,:,q) 表示过滤器已就地应用 .

  • 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,:);

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

1 回答

  • 3

    注意

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

    是相同的

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

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

    因此,卷积运算计算局部均值 . 没有分裂,它将是一个本地的总和 .

相关问题