Тестирование реализации медианного фильтра

Я реализовал 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 выполняет какие-то дополнительные шаги.


person Rumman Khan    schedule 10.09.2015    source источник
comment
Теперь, чтобы проверить, в порядке ли код, я взял изображение, добавил к нему шум соли и перца с помощью MATLAB. Затем попробовал приведенный выше код на нем. Я вижу, что шум уменьшается ПОЧТИ полностью, остается несколько точек. Если я увеличу размер ядра до 5X5, шум полностью отфильтруется. Но меня беспокоит тот факт, что код медианного фильтра MATLAB способен полностью удалить шум даже с ядром размером 3X3. Пожалуйста, взгляните на код и дайте мне знать, есть ли какая-то ошибка в реализации фильтра или код MATLAB выполняет какие-то дополнительные шаги.   -  person Rumman Khan    schedule 10.09.2015
comment
Не добавляйте в комментарии важную информацию или то, что вы пробовали, вместо этого отредактируйте свой вопрос.   -  person Some programmer dude    schedule 10.09.2015
comment
Вот что, мне интересно, где возможность редактирования вопроса.   -  person Rumman Khan    schedule 10.09.2015
comment
Посмотрите чуть ниже тегов, там строчка со ссылками, одна из них редактировать.   -  person Some programmer dude    schedule 10.09.2015
comment
Вы можете сначала написать/протестировать 9-точечную медианную функцию и снова протестировать реализацию Matlab со случайным вводом. Затем перейдите к медианному фильтру. Я рекомендую файлы MEX для такого рода разработки.   -  person user3528438    schedule 10.09.2015


Ответы (1)


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

person Prasad Sankaran    schedule 10.09.2015
comment
для ядра 3X3 окрестности представляют собой массив размером 9(kernelSize*kernelSize). после сортировки медиана будет иметь значение индекса 5, что = 9/2+1. (9/2 = 4). Итак, я думаю, что с этим кодом все в порядке. - person Rumman Khan; 10.09.2015
comment
Я согласен, что 5-е значение является медианой. Но в C индексация массива начинается с 0. Поэтому, если вы хотите получить доступ к 5-му элементу, вам нужно использовать array[4]. - person Prasad Sankaran; 10.09.2015
comment
Thnx, это отлично работает сейчас. Вы верно указали на ошибку. - person Rumman Khan; 10.09.2015