我得到了一个二维二进制数组。一些点处于打开状态,一些点处于关闭状态(1表示打开,0表示关闭)。
我知道" on“点之前是通过在2d数组上放置圆圈来创建的。这些圆具有相同的半径,每次放置一个圆时,圆内的点都会变为1而不是0。所有的圆圈都在数组的边缘内,接触圆圈边缘的点被点亮。
下面可以看到一个插图。圆圈是随机排列的,可能会相碰。
请注意,圆内的点为1,其他所有点均为0。
你能找出有多少个圆圈,仅仅通过观察二维数组,在我放置它们之后,没有圆圈?这个问题是可以解决的吗?
我解决这个问题的尝试是:
首先,我假设我的圆可以包含如图所示的点(半径足够大,可以包含4到7个点。然后我试着对圆圈可能有的方向进行分类,但是有很多种。

我想找到这两个圆圈。请注意,它们不能重叠,但可以只是一个靠近另一个。
发布于 2018-07-23 21:11:46
如果圆不重叠,则可以使用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库包含处理图像和数组(以及霍夫变换)的标签函数。
发布于 2018-07-23 21:52:23
为什么不随机生成圆圈并计算它们呢?
当你插入一个新的圆时,只要检查它们是否重叠即可。如果您尝试了一定的次数,但未能插入新的圆,请停止插入新的圆。对于最后一个值,您可能需要尝试一下。
你可以重复这个过程几次,然后像这样平均结果。
https://stackoverflow.com/questions/51478118
复制相似问题