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

3
我有一张包含黑色圆形的BitMap图像。我已经找到了代表圆形的所有黑色像素,并将这些点保存到列表中。
但是我不知道如何从列表中保存的坐标中找到圆心。我认为我需要找到圆的直径,但是如何循环像素来确定直径呢?

这是一个填充的圆还是黑色像素代表边框? - Steve
这是一个填充的圆形。 - GoForIt
2个回答

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
一个天真的方法是找到圆的边界框。 既然您已经将所有点都存储在列表中,您可以找到上、下、左和右。
假设(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。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接