Найти координату центра круга из списка координат пикселей C # - PullRequest
0 голосов
/ 06 февраля 2019

У меня есть изображение BitMap, где изображение содержит черный круг.Я нашел все черные пиксели изображения, которые представляют круг и сохранили точки в списке.

Я теряюсь, находя центр круга из координат, сохраненных в списке.Я думаю, что мне нужно как-то найти диаметр круга, но как мне сделать цикл по пикселям, чтобы определить это?

Ответы [ 2 ]

0 голосов
/ 06 февраля 2019

Один наивный подход может заключаться в том, чтобы найти ограничивающую рамку для круга.

Поскольку у вас уже есть все точки в списке, вы можете найти верхнюю, нижнюю, левую и правую.

Предполагая, что (0,0) - это верхний левый угол системы координат:

  • Вверху - точка с минимальным Y.
  • Внизу - точкас максимальным Y.
  • Слева - точка с минимальным X.
  • Справа - точка с максимальным X.

Центр ограничивающего прямоугольникацентр круга.Точно так же ширина / высота ограничительной рамки равна ее диаметру.

Редактировать: альтернативное решение

Найти среднее значение всех точек в окружности.Это даст вам центр круга.

var aggregate = points.Aggregate((point, result) => new Point{ X = point.X + result.X, Y = point.Y + result.Y });
var center = new Point { X = aggregate.X / points.Count, Y = aggregate.Y / points.Count }; 

Это может быть более оптимальным решением, поскольку это можно сделать, пока вы сканируете изображение на наличие черных пикселей.Вместо того, чтобы найти черные пиксели и затем использовать LINQ.

0 голосов
/ 06 февраля 2019

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

Однако для получения средней точки всевам нужно получить экстенты.

Предполагая, что у вас есть List<Point>

var left = list.Min(x => x.X);
var right = list.Max(x => x.X);
var top= list.Min(x => x.Y);
var bottom = list.Max(x => x.Y);

Point mid = new Point();
mid.X = left + (right-left) / 2; //calculate mid point x
mid.Y = top + (bottom-top) / 2; //calculate mid point y

Примечание : полностью не проверено

...