【问题标题】:Why is the output of `conv2()` is divided by `sz^2`?为什么`conv2()`的输出除以`sz^2`?
【发布时间】:2019-02-08 05:38:41
【问题描述】:

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

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

此例程的工作原理:

  1. 图像首先转换为双精度图像。
  2. sz 的一半用作 pad-size 值(这意味着该例程将对图像应用卷积)。
  3. m 是图像的高度,n 是图像的宽度,o 是否。图像中的通道数。
  4. 大小为szxsz的二维数组初始化为1s。
  5. 声明了一个 for 循环,该循环适用于三个迭代,因为该例程将在每个通道上应用卷积操作。
  6. im(:,:,q) 表示过滤器已就地应用。
  7. same 表示卷积操作返回卷积的中心部分,与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

【问题讨论】:

标签: matlab image-processing octave


【解决方案1】:

注意

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

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

这是因为卷积和乘法可以交换。

因此,卷积运算计算局部均值。如果没有除法,这将是一个局部总和。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-06
    • 1970-01-01
    相关资源
    最近更新 更多