Как реализовать медианный фильтр с ядром в MATLAB для сглаживания изображения? - PullRequest
0 голосов
/ 24 мая 2018

Я не знаю, как реализовать медианный фильтр со скользящим окном (ядром) в MATLAB.Мне нужно знать, как выглядит реализация, чтобы я мог попытаться реализовать алгоритм BSE (блочное умное стирание), который очень похож на медианный фильтр.Мне нужно, чтобы стереть несколько черно-белых пикселей.Я знаю, что есть функция medfilt2 (), но мне нужно знать, как она реализована.

Алгоритм BSE работает следующим образом:

Алгоритм BSE основан на медианной технологии и занимает местопикселя с экстремальным значением (черный или белый) медианным значением окружающих его пикселей.

1) Для окна NxN с центром в тестовом пикселе, где обычно должно быть N, и следует предложить большее значение.

2) Если f (i, j) = 0 или f (i, j) = 255, f (i, j) - пиксель абсолютного экстремального значения, который необходимо оценить;переходите к шагу 3. В противном случае значение f (i, j) не изменяется;перейдите к шагу 4.

3) При обнаружении пикселя экстремального значения его уровень серого заменяется медианным значением окна.

4) Процедура повторяется для следующего окна.

Я понял, что мне нужно реализовать медианный фильтр с условием проверки, является ли текущее значение пикселя 0 или 255. Если это так, я изменяю это значение на медианное значение соседних пикселей.,

Я не знаю, достаточно ли я ясен, но мне нужна помощь с этим:).

Текущий алгоритм BSE:

function [outimg] = medianfilt(img,sz)
green  = img(:,:,2);
[rows,cols] = size(green);    % get size of grayscale image
pad = sz-1; % padding to be added
nimg = zeros(rows+pad,cols+pad); % padded image
nimg(pad/2+1:rows+pad/2, pad/2+1:cols+pad/2) = green;
outimg = zeros(rows,cols);  % output / median filtered image
for x = pad/2 + 1 : cols + pad/2  % loop over columns
    for y = pad/2 + 1 : rows + pad/2   % loop over rows
        if nimg(y,x) == 0 || nimg(y,x) == 255
            win = nimg(y-pad/2:y+pad/2, x-pad/2:x+pad/2);  % get mxm window
            outimg(y-pad/2,x-pad/2) = median(win(:));      % find median
        else
            outimg(y-pad/2,x-pad/2) = nimg(y,x);
        end
        win = nimg(y-pad/2:y+pad/2, x-pad/2:x+pad/2);  % get mxm window
        outimg(y-pad/2,x-pad/2) = median(win(:));      % find median
    end
end
imshow(outimg);
end

Ответы [ 2 ]

0 голосов
/ 24 мая 2018

Как вы заметили, у MATLAB medfilt2.Вы можете использовать эту функцию для создания вашего фильтра:

img = imread(...);
med = medfilt2(img);
mask = img==0 | img==255;
img(mask) = med(mask);

То, что код выше делает

  1. , вычисляет медианное фильтрованное изображение med,
  2. .пиксели, которые необходимо заменить (пиксели со значением 0 или 255), что приводит к логическому массиву mask, который можно использовать для индексации, и, наконец,
  3. заменяет указанные пиксели во входном изображении насоответствующие пиксели из отфильтрованного по медиане изображения.
0 голосов
/ 24 мая 2018

Вы можете реализовать медианный фильтр, как показано ниже:

function [outimg] = medianfilt(img,sz)
    [rows,cols] = size(img);    % get size of grayscale image
    pad = sz-1; % padding to be added
    nimg = zeros(rows+pad,cols+pad); % padded image
    nimg(pad/2+1:rows+pad/2, pad/2+1:cols+pad/2) = img;
    outimg = zeros(rows,cols);  % output / median filtered image
    for x = pad/2 + 1 : cols + pad/2  % loop over columns
        for y = pad/2 + 1 : rows + pad/2   % loop over rows 
            win = nimg(y-pad/2:y+pad/2, x-pad/2:x+pad/2);  % get mxm window
            outimg(y-pad/2,x-pad/2) = median(win(:));      % find median
        end
    end
end

Вы можете проверить для BSE, как показано ниже:

if nimg(y,x) == 0 || nimg(y,x) == 255
    win = nimg(y-pad/2:y+pad/2, x-pad/2:x+pad/2);  % get mxm window
    outimg(y-pad/2,x-pad/2) = median(win(:));      % find median
else
    outimg(y-pad/2,x-pad/2) = nimg(y,x);
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...