Некоторая ошибка с кодом адаптивного медианного фильтра - PullRequest
0 голосов
/ 13 декабря 2011
%% Adaptive Median Filtering - The Code

ip1 = imread ('lena.gif');                  %% Undistorted image
ip = imnoise (ip1,'salt & pepper',0.25);    %% Image corrupted with 'Salt and Pepper Noise'

ip_median_filt1 = medfilt2(ip);             %% Apply median filter to noisy image with window dimensions of 3x3 pixels
ip_median_filt2 = medfilt2(ip,[4,4]);       %% Apply median filter to noisy image with window dimensions of 4x4 pixels
figure(1), clf;
subplot (2, 1, 1), imshow (ip, []);
subplot (2, 1, 2), imshow (ip_median_filt1, []);

%% We now proceed with the adaptive median filtering of the noisy image and 
%% prove that the results are better than those of the standard median filter 
%% shown above

%% Packing zeros around the edge pixels of the noisy input image so as to 
%% allow the facilitate the processing of edge-pixels of the image

ip_edge = zeros (212,276);

ip_convert = double (ip);

%%%%%%%%%% there seems to be error on the following line
ip_edge (11:202, 11:266) = ip_edge (11:202, 11:266) + ip_convert;

smax=9;

for i=11:202
    for j=11:266
        sx=3;
        sy=3;
        while ((sx<=smax) && (sy<=smax))
            ip_edge_min = ip_edge (i, j);
            ip_edge_max = ip_edge (i, j);
            ip_edge_median = median(median(ip_edge((i-floor(sx/2)):(i+floor(sx/2)),(j-floor(sy/2)):(j+floor(sy/2)))));
            for k= (i-floor (sx/2)) :( i+floor (sx/2))
                for l= (j-floor (sy/2)) :( j+floor (sy/2))
                    if ip_edge (k, l) < ip_edge_min
                        ip_edge_min = ip_edge (k, l);
                    end 
                    if ip_edge (k, l) > ip_edge_max
                        ip_edge_max = ip_edge (k, l);
                    end 
                End 
            end 
            A = ip_edge_median - ip_edge_min;
            B = ip_edge_median - ip_edge_max;
            if (A>0) && (B<0)
                C = ip_edge (i, j) - ip_edge_min;
                D = ip_edge (I) - ip_edge_max;
                if (C>0) && (D<0)
                    pledge (i, j) = ip_edge (i, j);
                    break
                else
                    ip_edge (i, j) = ip_edge_median;
                    break
                end 
            else 
                sx=sx+2;
                sy=sy+2;
                if (sx>smax) && (sy>smax)
                    ip_edge(i,j) = ip_edge(i,j);
                end 
            end
        end 
    end 
  end 
end


figure(2), clf;
imshow(ip_edge,[]);

Я получаю сообщение об ошибке в строке с %%%%%%%%%%:

???Ошибка при использовании ==> плюс размеры матрицы должны совпадать.Ошибка в ==> адаптивном в 22 ip_edge (11: 202, 11: 266) = ip_edge (11: 202, 11: 266) + ip_convert;

Ответы [ 2 ]

3 голосов
/ 14 декабря 2011

Ваша ошибка не имеет ничего общего с адаптивной фильтрацией. Просто размеры матрицы не совпадают!

Совет: вам не нужно явно указывать размеры изображения. Используйте что-то вроде:

ip_edge = zeros(size(ip1) + 20);
ip_edge(11:end-10,11:end-10) = double(ip);

В качестве альтернативы вы можете использовать встроенную функцию padarray

ip_edge = padarray(double(ip), [10 10])

Кстати, ваш код крайне неэффективен. Правило № 1 Matlab: никогда не зацикливаться! Хорошо, это не всегда возможно, но это то, к чему вы должны стремиться. Вот «худой» код для скользящей медианной фильтрации:

A = imread('lena.gif');
fun = @(x) median(x(:));
B = nlfilter(A,[3 3],fun);
imshow(A), figure, imshow(B)

Это то, что вы имели в виду под "адаптивным"? Удачи в изучении Matlab: -)

3 голосов
/ 14 декабря 2011

Matlab говорит вам, в чем проблема, чтобы иметь возможность добавить регион (11: 202,11: 266) из ip_edge и ip_convert, они должны иметь одинаковые размеры.

Размер области ip_edge равен 192 x 256. Я предполагаю, что ваша матрица ip_convert, если в этот момент имеет другой размер (не могу знать наверняка, поскольку загружаемая вами lena gif не является стандартным изображением Matlab).

...