Почему мое изображение с шумом становится темнее после использования алгоритма не локальных средств и почему шум значительно не уменьшается? - PullRequest
0 голосов
/ 18 ноября 2018

Я реализовал наивную версию нелокальных средств без интегральных изображений.Первое получение изображения:

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 голосов
/ 18 ноября 2018

Есть много проблем с кодом.Вот неполный список:

  • Вы ничего не делаете с цветом, похоже, ваш код написан для серого изображения.Но вы положили цветное изображение через него.Следовательно, изменяется только красный канал.

  • Вы пишете в то же изображение, с которого читали.Вы не можете сделать это, так как вы используете комбинацию входных и выходных пикселей для генерации следующего выходного пикселя.Вместо этого читайте из одного изображения, записывайте в другое.

  • Взвешенное среднее значение вычисляется путем суммирования value*weight, а затем деления на сумму весов в конце.Вы не делаете это деление.

  • Вы обрезаете область поиска по изображению, а затем дополняете ее.Это не имеет никакого смысла.Вы должны вырезать большую область из вашего изображения.

  • У вас есть массив dis, вы пишете в него, но вы им не пользуетесь.То есть вы пишете новый элемент, затем читаете только этот новый элемент;Вы никогда не возвращаетесь и не смотрите на старые ценности.Почему существует этот массив?

  • Ваши два внутренних цикла можно записать как psum = sum(ssd(:)).

  • ssd - это двойная разница.Вы, вероятно, хотите посмотреть на квадратную разницу или абсолютную разницу.

...