Может кто-нибудь, пожалуйста, помогите мне понять этот код Matlab о медианных фильтрах? - PullRequest
1 голос
/ 17 декабря 2011
  function imOut = medianFilter(imIn,windowWidth)

     if mod(windowWidth, 2 ) == 0
          disp('Window has even size');
     return
     end

     imageSize = size(imIn);
     imOut = imIn;

     windowBreadth = (windowWidth - 1)/2;
  for m=windowBreadth+1:imageSize(1) - windowBreadth
    for n=windowBreadth+1:imageSize(2) - windowBreadth
      t1 = imIn(m-windowBreadth:m+windowBreadth,n-windowBreadth:n+windowBreadth);
      t2 = reshape(t1,windowWidth*windowWidth,1);
      t3 = median(t2);
      imOut(m,n) = t3;
    end
  end

мое объяснение:

функция medianFilter принимает изображение (imIn) в качестве входных данных, а ширина окна медианного фильтра

, тогда я не уверенпочему нам нужен оператор if

, после чего мы берем размер входного изображения и сохраняем его в переменной с именем imageSize

, затем копируем все значения imIn в imOut

тогда я все потерялся

что такое ширина окна?и разве ширина и ширина не одно и то же?

спасибо!

1 Ответ

2 голосов
/ 17 декабря 2011

Условие if проверяет, что размер окна нечетен; если даже тогда нет «центрального» пикселя.

windowbreadth кажется плохим именем. Но его значение должно быть ясно из диаграммы ниже:

|<--B-->|
+---+---+---+---+---+
|   |   |   |   |   |
+---+---+---+---+---+
|   |   |   |   |   |
+---+---+---+---+---+
|   |   | * |   |   |
+---+---+---+---+---+
|   |   |   |   |   |
+---+---+---+---+---+
|   |   |   |   |   |
+---+---+---+---+---+
|<--------S-------->|

, где S - это размер окна, B - это ширина окна, а * обозначает "центральный" пиксель.

Итак, t1 - это все сэмплы в текущем окне. t2 - это выборки, переставленные как одномерный вектор, а не как двумерный массив.

...