为什么 `conv2()` 的输出要除以 `sz^2`?
Why is the output of `conv2()` is divided by `sz^2`?
以下例程从图像中减去平均值,使其更清晰。
- im 是一个图像矩阵。
- sz 是一个整数。
这个例程的工作原理:
- 图像首先转换为double。
sz
的一半用作 pad-size 值(这意味着此例程将在图像上应用卷积)。
- m是图片的高度,n是图片的宽度,o是没有。图像中的通道数。
- 大小为
sz
xsz
的二维数组初始化为 1s。
- 声明了一个 for 循环,它在三个迭代中工作,因为此例程将在每个通道上应用卷积运算。
im(:,:,q)
表示就地应用过滤器。
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')
这是因为卷积和乘法互换了。
因此,卷积运算计算局部均值。没有除法就是局部求和
以下例程从图像中减去平均值,使其更清晰。
- im 是一个图像矩阵。
- sz 是一个整数。
这个例程的工作原理:
- 图像首先转换为double。
sz
的一半用作 pad-size 值(这意味着此例程将在图像上应用卷积)。- m是图片的高度,n是图片的宽度,o是没有。图像中的通道数。
- 大小为
sz
xsz
的二维数组初始化为 1s。 - 声明了一个 for 循环,它在三个迭代中工作,因为此例程将在每个通道上应用卷积运算。
im(:,:,q)
表示就地应用过滤器。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')
这是因为卷积和乘法互换了。
因此,卷积运算计算局部均值。没有除法就是局部求和