Функция минимального фильтра не представляет правильный результат - PullRequest
0 голосов
/ 21 декабря 2018

Я сделал минимальную функцию фильтра, которая должна работать для изображений PGM P2.Проблема в том, что вывод неправильный.Все описано ниже.

Алгоритм: http://www.roborealm.com/help/Min.php и https://www.youtube.com/watch?v=Y_QF0Xq8zGM

Пример отладки:

Начальная часть моего изображения:

PGM P2 Image

matrixSize = 3

offset = 1

Итерация первого цикла:

j = 1, i = 1 neighboursNumbers = Count = 9

neighboursNumbers значения: (обратите внимание, что это перед сортировкой)

first iteration

Итерация второго цикла:

j = 1, i = 2 neighboursNumbers = Count = 9

neighboursNumbers значения: (снова перед сортировкой)

second iteration

Код:

// Properties
public string Format { get; set; }
public int Width { get; set; }
public int Height { get; set; }
public int MaxGrayLevel { get; set; }
public int[] Pixels { get; set; }

// Minimum Filter Code
int matrixSize = 3;

int offset = (matrixSize - 1) / 2;

for (int j = offset; j < image.Height - offset; j++)
{
    for (int i = offset; i < image.Width - offset; i++)
    {
        List<int> neighboursNumbers = (from x in Enumerable.Range(i - offset, matrixSize)
                                       from y in Enumerable.Range(j - offset, matrixSize)
                                       where (x >= 0) && (x < image.Width) && (y >= 0) && (y < image.Height)
                                       select image.Pixels[y * Width + x]).ToList();

        neighboursNumbers.Sort();

        int minIndex = neighboursNumbers[0];
        image.Pixels[j * image.Width + i] = minIndex;
    }
}

Результат:

Output

Ожидается (этот результат использует радиус 7.0 в ImageJ):

Expected result

1 Ответ

0 голосов
/ 21 декабря 2018

Вы заменяете данные исходного изображения Pixels в цикле на выход фильтра.Вы не должны этого делать, поскольку фильтр должен применяться ко всему исходному изображению.

Чтобы увидеть проблему, представьте, что вы применяете фильтр к пикселю (X,Y) и получаете вывод M.Следующий шаг в вашем алгоритме - применить фильтр к (X+1,Y).Окрестность этого пикселя включает (X,Y), но вы заменили его значение на M на предыдущем шаге.Таким образом, локальное минимальное значение будет сохраняться до тех пор, пока не будет найден новый минимум.Это создает структуру вашего получающегося изображения.

Чтобы исправить это, просто создайте новое изображение, в которое вы помещаете выходные данные фильтра, и не изменяйте входные данные фильтра.

...