从像素坐标C#列表中找到圆的中心坐标

时间:2019-02-05 23:10:43

标签: c# bitmap pixel

我有一个BitMap图像,其中图像包含黑色圆圈。我发现图像中所有黑色的像素(代表圆圈)并将点保存到列表中。

我迷路的地方是从列表中保存的坐标中找到圆的中心。我以为我需要以某种方式找到圆的直径,但是如何遍历像素来确定呢?

2 个答案:

答案 0 :(得分:1)

圆形是图像的相对术语,也就是说,您所指的形状以像素显示,并且只能代表圆形。

但是获得中点只是获得范围。

假设您有一个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

注意 :完全未经测试

答案 1 :(得分:1)

一种幼稚的方法可能是找到圆的边界框。

看到列表中已经包含所有点,您可以找到顶部,底部,左侧和右侧。

假设(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。