2015-09-10 3 views
1

Я реализовал 2D-срединный фильтр в C. Для изображения размера 1440X1440 значения с плавающей запятой. Для начала я попробовал его с простым размером ядра 3X3. Вот код.Измерение реализации срединного фильтра

#define  kernelSize  3 

void sort(float *array2sort, int n) 
{ 
    float  temp; 
    for(int i=0; i < n-1; i++) 
     for(int j=0; j < n-1-i; j++) 
      if(array2sort[j] > array2sort[j+1]) 
      { 
       temp = array2sort[j]; 
       array2sort[j] = array2sort[j+1]; 
       array2sort[j+1] = temp; 
      } 
} 


void medianFilter(float *input, float *output) 
{ 
    int  halfKernelSize = kernelSize/2; 

    float neighbourhood[kernelSize*kernelSize]; 

    for(int i=0+halfKernelSize; i<(1440-halfKernelSize); i++) 
     for(int j=0+halfKernelSize; j<(1440-halfKernelSize); j++) 
     { 
      for(int ii=-halfKernelSize; ii<halfKernelSize+1; ii++) 
       for(int jj=-halfKernelSize; jj<halfKernelSize+1; jj++) 
        neighbourhood[(ii+halfKernelSize)*kernelSize+(jj+halfKernelSize)] = input[(i+ii)*1440+(j+jj)]; 
      sort(neighbourhood, kernelSize*kernelSize); 
      output[(i)*1440+(j)] = neighbourhood[(kernelSize*kernelSize)/2+1]; 
     } 

} 

Теперь для того, чтобы проверить, если код хорошо, я взял изображение, добавил соль & перец шум к нему с помощью MATLAB. Затем попробовал приведенный выше код. Я вижу, что шум постепенно уменьшается, и осталось несколько точек. Если я увеличу размер ядра до 5X5, шум полностью фильтруется. Но тревожным фактом для меня является то, что MATLAB, средний фильтр, способен полностью удалить шум даже с ядром размером 3X3. Это оставляет мне сомнения. Пожалуйста, взгляните на код и сообщите мне, есть ли какая-либо ошибка в реализации фильтра или код MATLAB предпринимает некоторые дополнительные шаги.

+0

Теперь, чтобы убедиться, что код в порядке, я взял изображение, добавил соль и перечный шум к нему с помощью MATLAB. Затем попробовал приведенный выше код. Я вижу, что шум постепенно уменьшается, и осталось несколько точек. Если я увеличу размер ядра до 5X5, шум полностью фильтруется. Но тревожным фактом для меня является то, что MATLAB, средний фильтр, способен полностью удалить шум даже с ядром размером 3X3. Пожалуйста, взгляните на код и сообщите мне, есть ли какая-либо ошибка в реализации фильтра или код MATLAB предпринимает некоторые дополнительные шаги. –

+0

Не добавляйте важную информацию или то, что вы пробовали в комментариях, пожалуйста, * отредактируйте свой вопрос *. –

+0

Вот что, мне интересно, где вариант для редактирования вопроса. –

ответ

0

Я думаю, что медианное значение, вычисленное из буфера соседства, неверно. Это должно быть окрестности [(kernelSize * kernelSize)/2]. Можете ли вы попробовать с этой коррекцией?

+0

для ядра 3X3, окрестности - это массив размером 9 (kernelSize * kernelSize). после сортировки медианы будет иметь значение индекса 5., которое равно = 9/2 + 1. (9/2 = 4). Итак, эта осечка кода стоит хорошо, я думаю. –

+0

Я согласен, что пятое значение является медианным. Но в C индексирование массива начинается с 0. Поэтому, если вы хотите получить доступ к 5-му элементу, вам нужно использовать массив [4]. –

+0

Thnx, который отлично работает сейчас. Вы указали на ошибку правильно. –

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