2014-06-27 5 views
0

Я должен разработать и внедрить адаптивный фильтр для удаления импульсных шумов из медицинских изображений! и я новичок в обработке изображений. и не знаю, как создать фильтр! Я проверил предопределенные фильтры ... они не то, что я хочу! , пожалуйста, помогите, это мой Б.С. проект!Как разработать и внедрить адаптивный фильтр для удаления импульсного шума?

+0

Немного расплывчатый. Я полагаю, вы должны решить, хотите ли вы линейный или нелинейный фильтр. Это может быть началом. – Jiminion

+0

Как я узнал об адаптивных фильтрах, они действуют как линейные фильтры в некотором случае и как нелинейные фильтры в других ... Что вы предлагаете? –

+0

Можете ли вы охарактеризовать импульс пространственно? Всегда ли они положительны или отрицательны? Или оба? Если у вас есть размер, я бы предложил либо линейный фильтр, чтобы сгладить его (сохраняет информацию), либо нелинейный, чтобы полностью удалить его (не сохраняет всю информацию). – Jiminion

ответ

0

Импульсный шум обычно обрабатывается с использованием фильтра median.
Чтобы построить адаптивный фильтр, я бы использовал статистику, чтобы понять, есть ли что-то, чтобы сгладить внутри окна.

Я работал бы с изображением, используя окна.
В каждом окне я бы посмотрел медианное и среднее.
Если они находятся далеко друг от друга, я бы применил фильтр median, в противном случае примените локальный фильтр LPF, чтобы ничего не делать.

Это просто ...

-1

я нашел статью об этом, это код, я реализовал

function adaptive() 
    I = imread('1.png'); 
    x = rgb2gray(I); 
    %%-------adding Noise----------------------- 
    disp('Noise density lies between 0 and 1'); 
    disp(' '); 
    ND = input('Enter Noise Density [0.5] : '); 
    if isempty(ND) 
     ND = 0.5; 
    end 
    y=x; 
    Narr = rand(size(y)); 
    N = Narr; 
    N(N>=ND)=0; 
    N1 = N; 
    N1 = N1(N1>0); 
    Imn=min(N1(:)); 
    Imx=max(N1(:)); 
    N=(((N-Imn).*(255-0))./(Imx-Imn)); 
    y(Narr<ND) = N(Narr<ND); 
    y=double(y); 
    %%------noise detection------------------------ 
    adj = imadjust(y); 
    L = max(adj); 
    [M,N] = size(y); 
    for i = 1:M 
     for j = 1:N 
      if y(i,j) == L(j)-1 || y(i,j) == 0 
       alpha(i,j) = 1;  %%the value 1 presents the “noise pixel” 
      else 
       alpha(i,j) = 0;  %%the value 0 presents the “noise-free pixel”. 
      end 
     end 
    end 
    K=0; 
    for i = 1:M 
     for j = 1:N 
      if alpha(i,j) == 1; 
       K=K+1;  %%total number of the “noise pixel”, K. 
      end 
     end 
    end 
    n = K/(M*N);   %%the ratio of the “noise pixels” to 
          %%the total number of pixels contained in the image 

    %%------noise elimination------------------------ 
    %%R=1; 
    R = floor(0.5 * sqrt(7/(1-n))); 
    m = ones(size(y(:))); 
    for i = 1:M 
     for j = 1:N 
      if alpha(i,j) == 1 %% this is a noise pixel 
       nnum=0;  %%noise number 
       while nnum <= 8 
        R = R+1; %% This will make the filter window 2pixels larger 
        clear tmp; 
        if i-R <= 0 || i+R >= M 
         while i-R <= 0 
          R=R-1; 
         end 
         while i+R >= M 
          R=R-1; 
         end 
        end 
        if j-R <= 0 || j+R >= N 
         while i-R <= 0 
          R=R-1; 
         end 
         while i+R >= M 
          R=R-1; 
         end 
        end 
        tmp = y(i-R:i+R , j-R:j+R); %% filter window 
        w = 2*R +1 ; %% Size of filter window 
        for s = 1:w 
         for p = 1:w 
          if tmp(s,p) == 0 || tmp(s,p) == L(j)-1 
           nnum=nnum+1; %%number of free noise pixels in the window 
          end 
         end 
        end 
       end 

       clear temp; 
       temp = y(i-R:i+R , j-R:j+R); %% filter window 
       S = sort(temp(:)); 
       if S(1) < S(R+1) && S(R+1) < S(w) && 0 < S(R+1) && S(R+1) < L(j) 
        m(i,j) = S(R+1); 
       end 
       if S(1) >= S(R+1) || S(R+1) >= S(w) || S(R+1) == L(j) && S(R+1) == 0 
        t = y(i,j-1); 
        m(i,j) = t; 
       end 
      end 
     end 
    end 

    for i = 1:M 
     for j = 1:N 
      if alpha(i,j) == 0  %% the value of z(i,j) is copied directly as the value of y(i,j). 
       z = y(i,j); 
      else 
       z = m(i,j); %%the output value z(i,j) is equal to m(i,j). 
      end 
     end 
    end 
    imshow(x); 
    figure,imshow(y); 
    figure,imshow(z); 
end 

У меня была ошибка, пожалуйста, помогите!

ошибка: не хватает памяти. Введите HELP MEMORY для своих опций. Ошибка в адаптивной (строка 96) m (i, j) = t;

и

подстрочные индексы должны либо быть реальными положительными целыми числами или логические выражения. Ошибка в адаптивной (строка 73) tmp = y (i-R: i + R, j-R: j + R); %% фильтр

Смежные вопросы