【问题标题】:Find the center coordinate of a circle from a list of pixel coordinates C#从像素坐标列表中找到圆的中心坐标 C#
【发布时间】:2019-06-29 20:43:11
【问题描述】:

我有一个位图图像,其中图像包含一个黑色圆圈。我从图像中找到了所有代表圆圈的黑色像素,并将这些点保存到一个列表中。

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

【问题讨论】:

  • 是实心圆还是黑色像素代表边框?
  • 这是一个实心圆。

标签: c# bitmap pixel


【解决方案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。

【讨论】:

    【解决方案2】:

    圆形是图片的相对术语,也就是说,您所指的形状以像素为单位显示,可能只代表一个圆形。

    但是要获得中点,您需要做的就是获得范围。

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

    注意:完全未经测试

    【讨论】:

      猜你喜欢
      • 2012-11-02
      • 1970-01-01
      • 2012-01-22
      • 2017-11-18
      • 2011-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-22
      相关资源
      最近更新 更多