为什么使用非局部均值算法后,我的去噪图像会变得更暗,为什么噪声没有显着降低?

时间:2018-11-18 12:00:16

标签: matlab image-processing noise-reduction

我已经实现了没有局部图像的非本地方法的朴素版本。 第一次图像获取:

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

我的初始图片:

enter image description here

我的最终照片:

enter image description here

1 个答案:

答案 0 :(得分:1)

代码有很多问题。这是一个非详尽的清单:

  • 您没有对颜色做任何事情,看起来您的代码是为灰度图像编写的。但是您通过它放置了彩色图像。因此,只有红色通道会被修改。

  • 您将写入读取的图像。您无法执行此操作,因为您正在使用输入和输出像素的组合来生成下一个输出像素。而是从一幅图像中读取,然后写入另一幅图像。

  • 通过对value*weight求和,然后除以最后的权重之和来计算加权平均值。您无需进行此划分。

  • 您从图像中裁剪出搜索区域,然后进行填充。这是没有道理的。您应该从图像中裁剪更大的区域。

  • 您保留了一个数组dis,并对其进行了写入,但没有使用它。也就是说,您编写了一个新元素,然后仅读取了该新元素。您再也不会回头看旧的价值观了。为什么这个数组存在?

  • 您内部的两个循环可以写为psum = sum(ssd(:))

  • ssd相差两倍。您可能想看看平方差或绝对差。