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