算法来查找二维数组中有多少个圆

时间:2018-07-23 11:50:55

标签: arrays algorithm geometry

我得到了一个二维二进制数组。一些点点亮,一些点熄灭(1表示点亮,0表示熄灭)。

我知道“ on”点是通过在2d数组上放置圆来创建的。 圆具有相同的半径,并且每次放置圆时,其内部的点都将变为1而不是0。 所有的圆都在数组的边缘内,点触摸圆的边缘会亮起。

可以在下面看到插图。圆圈是随机排列的,可能会接触。

请注意,圆圈内的点是1,其他所有点都是0。

在放置了圆圈之后,仅查看二维数组就可以找到其中的圆圈吗?这个问题可以解决吗?

我解决这个问题的尝试是:

首先,我假设我的圆圈可以包含图中的点(半径足够大,可以包含4到7个点。 然后,我尝试对圆的可能方向进行归类,但是种类很多。

enter image description here

我想找到这两个圈子。请注意,它们不能重叠,而只能彼此重叠。

2 个答案:

答案 0 :(得分:1)

如果您的圈子不重叠,则可以使用connected component labeling algorithm并获得圈子数:

NCircles = (NComponents - 1) / 2

(如果圆形的内部空白区域和外部空白区域形成单独的组件)

编辑:使用这些点值得选择连接大小在一定范围内的连接元件,以排除点和其他错误区域。

适用于此图片的简单CCL:

scan image until black pixel is met   
do flood fill while possible, keep bounding box of scanned black pixels   
if  box corresponds to circle size, count it   
scan further from any unmarked pixel 

另一种可能的方法:您可以尝试Hough algorithm for circles的预定义半径。

例如,OpenCV库包含用于图像和数组的标签功能(也包括霍夫变换)

答案 1 :(得分:0)

为什么不只是随机生成圆圈并对其进行计数?

插入新的圆圈时,只需检查它们是否不重叠。 尝试了一段时间但无法插入新圈子后,请停止插入新圈子。有了这个最后的值,您可能需要玩一点。

您可能会重复几次,然后对结果进行平均。