C# Получить местоположение пикселя из изображения<,> EMGU CV 3.3
Я работал над проектом на основе EMGU, где мне нужно создать скелетное изображение с помощью алгоритма прореживания ZhangSuen, который прекрасно работает. Для дальнейшего анализа я хочу получить все пиксельные местоположения скелета и сохранить их в List<Point>
Я много исследовал проблемы производительности при использовании Bitmap.GetPixel()
а также Bitmap.SetPixel()
методы. Вот почему я следовал подходу использования byte[,,]
массив для получения местоположения пикселей. Мой подход до сих пор выглядит так:
public static List<Point> GetSkeletonPoints(Image<Gray, Byte> src, Byte color = 255)
{
var SkeletonPoints = new List<Point>();
int rows = src.Width;
int cols = src.Height;
byte[,,] data = src.Data;
for(int y = rows - 1; y >= 0; y--)
{
for(int x = cols - 1; x >= 0; x--)
{
if(data[x, y, 0] != 0)
{
SkeletonPoints.Add(new Point(x, y));
}
}
}
return SkeletonPoints;
}
Скелетные пиксели имеют значение 255, а фон черный (0). Теперь странная вещь, если я пытаюсь изменить входное изображение следующим образом:
src.Data[0,0,0] = 255;
абсолютно ничего не меняется, когда я смотрю на изображение с помощью CvInvoke.Imshow("test", src);
Запуск представленного метода приводит к тому, что точка Point не добавляется в список, что означает, что условие в операторе if никогда не выполняется. Выполнение if-оператора вроде этого if(data[x, y, 0] == 0)
приводит к условию, которое всегда выполняется, и я получаю каждую точку в изображении, несмотря на то, что она на самом деле черная (0) или белая (255).
Я думал, что по ошибке использовал полностью черное изображение.. Но потом я применил CvInvoke.FindNonZero()
Метод для ввода изображения и нашел 500 NonZero-пикселей, что для меня абсолютно бессмысленно.
Я уже отчаялся, может, я что-то упустил? Любая помощь или подсказка высоко ценится! (даже если это не решает мою проблему, но повышает производительность зацикливания изображений в целом)