简单的多斑点检测二进制图像?

5
如果给出一个二维数组的图像,已经进行了阈值处理,现在是二进制信息。有没有特定的方法来处理这个图像,以便我可以在图像上获得多个Blob的坐标?
我不能使用OpenCV,因为这个过程需要同时在10多个模拟机器人上在C中运行。
我需要Blob的xy坐标,但首先需要找到多个Blob。
像素组大小的最简单标准应该足够了。但我不知道如何开始编码。
PS:单个Blob应该没有问题。问题是多个Blob。
能给个头绪吗?

尝试在谷歌上搜索连通组件。您还可以查找基于高斯拉普拉斯算子的斑点检测。 - Zaphod
嗯,高斯拉普拉斯算子,我不明白如何在代码中实现它... - ivanwong888899999
3个回答

5
请看一下QuickBlob,它是一个小型的、独立的C库,听起来非常适合你的需求。
QuickBlob配备了一个小型命令行工具(csv-blobs),该工具输出输入图像中找到的每个blob的位置和大小:
./csv-blobs white image.png
X,Y,size,color
28.37,10.90,41,white
51.64,10.36,42,white
...

这里有一个例子(输出图像是由QuickBlob附带的show-blobs.py小型Python工具生成的): 输入图像 输出图像

1
你可以通过以下算法来遍历二进制图像并标记连接的部分:
1. 创建一个2D int数组labelArray,用于保存连接区域的标签,并将其初始化为零。 2. 逐行迭代每个二进制像素p A. 如果p为true且labelArray中对应位置的值为0(未标记),则将其分配给一个新标签,并进行广度优先搜索,将所有周围也为真的二进制像素添加到相同的标签中。
现在唯一的问题是如果有多个接触彼此的blob。因为你知道blob的大小,所以应该能够确定给定连接区域中有多少个blob。这是棘手的部分。你可以尝试在这一点上做k-means聚类。你也可以尝试其他方法,比如使用二进制膨胀。

1

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