arrays - 查找二维数组中有多少个圆的算法

标签 arrays algorithm geometry

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

我知道“on”点之前是通过在二维数组上放置圆圈创建的。 圆圈的半径相同,每放置一个圆圈,圆圈内的点就会从 0 变为 1。 所有的圆圈都在阵列的边缘内,并且点亮了接触圆圈边缘的点。

如下图所示。圆圈是随机排列的,可能会接触。

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

在我放置圆圈之后,你可以通过查看没有圆圈的二维数组来找出有多少个圆圈吗?这个问题可以解决吗?

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

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

enter image description here

我想找到这两个圆圈。请注意,它们不能重叠,但可以彼此靠近。

最佳答案

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

NCircles = (NComponents - 1) / 2

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

编辑:对于这些点,值得只选择尺寸在某个范围内的连通成分,以排除点和其他错误区域。

适合这张图的简单类型的覆铜板:

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 库包含适用于图像和数组(以及霍夫变换)的标记功能

关于arrays - 查找二维数组中有多少个圆的算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51478118/

相关文章:

arrays - 为什么 cap 不打印底层数组的长度?

字符串的 C++ fwrite 和 fread

c - 扫描包含多个单词的字符串

javascript - 以迭代方式查找对象的深度

c++ - 查找最接近质心的几何内部点

python - python-numpy 矩阵中的像素平均值

algorithm - 用大于或等于该节点的节点之和替换BST节点

java复杂逻辑条件解析器

java - 检查轴对齐的边界框是否位于视锥体内

javascript - 如何在 p5.js 中的点数组之间绘制正方形?