Функция минимального фильтра не представляет правильный результат
Я сделал минимальную функцию фильтра, которая должна работать для изображений PGM P2. Проблема в том, что вывод неправильный. Все описано ниже.
Алгоритм: http://www.roborealm.com/help/Min.php и https://www.youtube.com/watch?v=Y_QF0Xq8zGM
Пример отладки:
Начальная часть моего изображения:
matrixSize = 3
offset = 1
Первая итерация цикла:
j = 1, i = 1
neighboursNumbers = Count = 9
neighboursNumbers
значения: (обратите внимание, что это перед сортировкой)
Итерация второго цикла:
j = 1, i = 2
neighboursNumbers = Count = 9
neighboursNumbers
значения: (снова перед сортировкой)
Код:
// 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;
}
}
Результат:
Ожидаемый (этот результат использует радиус 7.0 в ImageJ):
1 ответ
Вы заменяете данные исходного изображения Pixels
в цикле с выходом фильтра. Вы не должны этого делать, потому что фильтр должен применяться ко всему исходному изображению.
Чтобы увидеть проблему, представьте, что вы применяете фильтр к пикселю. (X,Y)
и получить вывод M
, Следующим шагом в вашем алгоритме является применение фильтра к (X+1,Y)
, Соседство этого пикселя включает в себя (X,Y)
, но вы заменили его значение на M
на более раннем этапе. Таким образом, локальное минимальное значение будет сохраняться до тех пор, пока не будет найден новый минимум. Это создает структуру вашего результирующего изображения.
Чтобы исправить это, просто создайте новое изображение, в которое вы поместите выходные данные фильтра, и не изменяйте входные данные фильтра.