【问题标题】:Why does my denoised image get darker after using non local means algorithm and why is the noise not reduced significantly?为什么我的去噪图像在使用非局部均值算法后会变暗,为什么噪声没有显着降低?
【发布时间】:2019-04-20 23:40:26
【问题描述】:

我已经实现了没有完整图像的非本地手段的天真版本。 第一次图像采集:

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

我的初始图片:

我的最终形象:

【问题讨论】:

    标签: matlab image-processing noise-reduction


    【解决方案1】:

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

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

    • 您写入您读取的同一个图像。您不能这样做,因为您正在使用输入和输出像素的组合来生成下一个输出像素。相反,从一个图像读取,写入另一个图像。

    • 加权平均值的计算方法是将value*weight 相加,然后除以最后的权重之和。你不做这个除法。

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

    • 你保留一个数组dis,你写它,但你没有使用它。也就是说,你写一个新元素,然后只读取这个新元素;你永远不会回头看看旧的价值观。为什么会存在这个数组?

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

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

    【讨论】:

    • ideone.com/P1Kqbg 我修正了前两点。你能帮我解决第三点(加权平均值)吗?
    • 我也实现了称重。您能否建议我的代码是否正确?:ideone.com/7497Ht
    • @UjjayantaBhaumik:我认为您只需 rcn(i,j)=sums/sums2 而不是 rcn(i,j)=rcn(i,j)-sums/sums2。但是您现在有未使用的newunew,因此您正在从未填充的输入图像而不是填充的new 中读取。而你的patchn 没有考虑到ij。这里有很多工作要做......另外,请不要复制粘贴相同的代码3次,编写一个函数并调用它3次。前期工作要多一些,但后期工作要少得多。
    • 并不是说这一定是好的代码,但您可以将您的实现与原始非本地手段论文作者的实现进行比较:mathworks.com/matlabcentral/fileexchange/…
    • 非常感谢。您能否向我推荐一个使用积分图像的非本地方法的良好来源?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-14
    • 2013-12-08
    • 2011-04-28
    • 2016-03-26
    • 1970-01-01
    • 1970-01-01
    • 2021-11-07
    相关资源
    最近更新 更多