为什么在使用非局部均值算法后我的去噪图像变得更暗,为什么噪声没有显着降低?
Why does my denoised image get darker after using non local means algorithm and why is the noise not reduced significantly?
我已经实现了没有积分图像的非局部手段的朴素版本。
第一次图像采集:
row = 10;
col = 10;
% Patchsize - make sure if code works for different values
patchSize = 4;
% Search window size - make sure if code works for different values
searchWindowSize = 10;
image = imread('r.jpg');
new=imnoise(image,'gaussian');
imshow(new)
ws=floor(searchWindowSize/2);
ps=floor(patchSize/2);
new= padarray(new, [searchWindowSize,searchWindowSize], 'both');
new= padarray(new, [patchSize,patchSize], 'both');
现在,主要的非局部手段函数:
unew=zeros(size(new,1),size(new,2));
for i=1+ws+ps:size(new,1)-ws-ps
for j=1+ws+ps:size(new,2)-ws-ps
sear=new(i-ws:i+ws,j-ws:j+ws);
%imshow(new(i-ws:i+ws,j-ws:j+ws))
sear=padarray(sear,[ps,ps],'both');
patch=new(i-ps:i+ps,j-ps:j+ps);
dis=[];
ind=1;
sums=0;
for ii=1+ps:size(sear,1)-ps
for jj=1+ps:size(sear,1)-ps
patchn=new(ii-ps:ii+ps,jj-ps:jj+ps);
ssd=(patchn-patch).*2;
psum=0;
for mj=1:patchSize
for gj=1:patchSize
psum= psum+ssd(mj,gj);
end
end
dis(ind)=psum;
sums=sums+exp(-max(dis(ind)*dis(ind)-2*0.1*0.1,0)/0.75*0.75);
ind=ind+1;
end
end
new(i,j)=sums;
end
end
我的初始图片:
我的最终形象:
代码有很多问题。这是一个非详尽的列表:
你没有对颜色做任何处理,看起来你的代码是为灰度图像编写的。但是你把彩色图像放在它上面。因此,只有红色通道被修改。
您写入的图像与您读取的图像相同。你不能这样做,因为你正在使用输入和输出像素的组合来生成下一个输出像素。相反,从一张图像读取,写入另一张图像。
加权平均值的计算方法是对 value*weight
求和,然后除以最后的权重总和。你不做这个除法
您从图像中裁剪搜索区域,然后填充它。这是没有意义的。您应该从图像中裁剪更大的区域。
你有一个数组dis
,你写给它,但你没有使用它。也就是你写了一个新元素,那么只读这个新元素;你永远不会回头看看旧的价值观。为什么会有这个数组?
你的内部两个循环可以写成psum = sum(ssd(:))
.
ssd
相差两倍。您可能想查看平方差或绝对差。
我已经实现了没有积分图像的非局部手段的朴素版本。 第一次图像采集:
row = 10;
col = 10;
% Patchsize - make sure if code works for different values
patchSize = 4;
% Search window size - make sure if code works for different values
searchWindowSize = 10;
image = imread('r.jpg');
new=imnoise(image,'gaussian');
imshow(new)
ws=floor(searchWindowSize/2);
ps=floor(patchSize/2);
new= padarray(new, [searchWindowSize,searchWindowSize], 'both');
new= padarray(new, [patchSize,patchSize], 'both');
现在,主要的非局部手段函数:
unew=zeros(size(new,1),size(new,2));
for i=1+ws+ps:size(new,1)-ws-ps
for j=1+ws+ps:size(new,2)-ws-ps
sear=new(i-ws:i+ws,j-ws:j+ws);
%imshow(new(i-ws:i+ws,j-ws:j+ws))
sear=padarray(sear,[ps,ps],'both');
patch=new(i-ps:i+ps,j-ps:j+ps);
dis=[];
ind=1;
sums=0;
for ii=1+ps:size(sear,1)-ps
for jj=1+ps:size(sear,1)-ps
patchn=new(ii-ps:ii+ps,jj-ps:jj+ps);
ssd=(patchn-patch).*2;
psum=0;
for mj=1:patchSize
for gj=1:patchSize
psum= psum+ssd(mj,gj);
end
end
dis(ind)=psum;
sums=sums+exp(-max(dis(ind)*dis(ind)-2*0.1*0.1,0)/0.75*0.75);
ind=ind+1;
end
end
new(i,j)=sums;
end
end
我的初始图片:
我的最终形象:
代码有很多问题。这是一个非详尽的列表:
你没有对颜色做任何处理,看起来你的代码是为灰度图像编写的。但是你把彩色图像放在它上面。因此,只有红色通道被修改。
您写入的图像与您读取的图像相同。你不能这样做,因为你正在使用输入和输出像素的组合来生成下一个输出像素。相反,从一张图像读取,写入另一张图像。
加权平均值的计算方法是对
value*weight
求和,然后除以最后的权重总和。你不做这个除法您从图像中裁剪搜索区域,然后填充它。这是没有意义的。您应该从图像中裁剪更大的区域。
你有一个数组
dis
,你写给它,但你没有使用它。也就是你写了一个新元素,那么只读这个新元素;你永远不会回头看看旧的价值观。为什么会有这个数组?你的内部两个循环可以写成
psum = sum(ssd(:))
.ssd
相差两倍。您可能想查看平方差或绝对差。