以下例程从图像中减去平均值,使其更清晰。
此例程的工作方式:
sz
的一半用作填充大小值(这意味着此例程将在图像上应用卷积)。sz
x sz
的2d数组初始化为1s。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,:);
为什么conv2()
的输出除以sz^2
?
答案 0 :(得分:3)
请注意
conv2(double(im(:,:,q)),mask,'same')./sz^2
与
相同conv2(double(im(:,:,q)),mask./sz^2,'same')
这是因为卷积和乘法通勤。
因此,卷积运算将计算局部均值。如果不进行除法,那将是一个本地和。