Я сделал минимальную функцию фильтра, которая должна работать для изображений 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):