用cv :: HoughCircles()近距离检测许多小圆圈

时间:2013-07-27 02:21:04

标签: c++ opencv computer-vision mask noise-reduction

我正在尝试使用OpenCV检测大量相互靠近的小圆圈(相距仅约20个像素)。我已设法使用cv::inRange()cv::Canny()创建此掩码。

原始图片

enter image description here

面膜

circle mask

但是,当我使用cv::HoughCircles()时,只能准确检测到某些圆圈。目前,我正在使用cv::HoughCircles()以下参数:

cv::HoughCircles(mat, circles, CV_HOUGH_GRADIENT, 2, mat.rows / 256, 100, 8, 2, 8);

这种方法效果不足以检测这么小且靠得很近的圆,或者我只是需要修改cv :: HoughCircles()的参数吗?

此外,摆脱掩模中间圆圈阵列周围的“噪音”将是有用的,因为在掩模的边缘周围检测到一些“假圆圈”。有一种简单的方法可以做到这一点吗?

2 个答案:

答案 0 :(得分:3)

摆脱噪音:

如果您可以确保始终具有相同的环境参数(例如距离圆圈的距离,亮度......),那么您可以使用cvAnd在Canny边缘检测之后屏蔽图像;这是面具的样子:

enter image description here

霍夫圈检测:

现在,关于HoughCircle。首先,此函数执行自己的Canny边缘检测。在打电话给HoughCircle之前你也在做一个。由于the way Canny works(即二进制图像上的强度渐变......),它可能会影响圆圈的形状。

谈到你圈子的形状,下面是你的“圈子”的特写;如果HoughCircle确实检测到所有这些甚至只是其中的一部分,我会非常感动。它在Hough space中无法提供任何好处。只是为了确保将最后两个参数设置为0(最小/最大半径),并尝试降低中心之间的最小距离。但老实说,我认为你需要找到解决问题的另一种方法。

<强> [编辑]

可能的方法是执行connected component labeling(例如blob检测)。据我所知,单独使用OpenCV是不可能做到这一点的,你需要像cvblob这样的东西,这是一个非常好的基于OpenCV的blob库。特别是,您可能对cvCentroid(CvBlob *blob)感兴趣。

干杯

enter image description here

答案 1 :(得分:1)

嗯,你真的需要将它们检测为圆圈吗? (而不是将它们建模为圆圈)。

如果这是某种校准模式,并且您只对估计中心的图像位置感兴趣,首先将它们检测为点状特征,然后单独处理每个检测到的特征可能会更有效率 - 例如将圆圈拟合到每个检测到的特征附近的一串白色像素。