用霍夫圆变换检测同心圆

时间:2012-12-19 12:38:07

标签: image-processing emgucv

我正在尝试从图像数据库中检测CD的图像。我想我可以在每个图像上使用圆形霍夫变换,并选择包含具有相似中心的同心圆的图像。

我已经尝试在EMGU中使用HoughCircles方法,如果圆圈不在外圆的中心,则可以正常工作,但如果它们不在,则工作正常。这是Hough变换本身的限制,还是只是实现的minDist限制的问题?

在以下2张图片上使用以下参数(我已经进行了大量的调整):

Gray cannyThresh = new Gray(180);
Gray accumulatorThresh = new Gray(300);
int dp = 3;
double minDist = 0.0000001 //Ideally higher, but ok for illustrating this point

CircleF[] circles = gray.HoughCircles(cannyThresh, accumulatorThresh, dp, minDist, 0, 0)[0]

偏移内圈(工作正常):

offset inner circle

中央内圈(未能正确检测外圈,大概是因为中心与内圈的接近程度?)

central inner circle

我能做些什么来检测圈子是否共享一个类似的中心?

4 个答案:

答案 0 :(得分:1)

你应该先做边缘检测。然后你将得到两个细圆圈,而不是一个大黑管。这些圈子很容易找到。

答案 1 :(得分:1)

好的,这可能是一个粗略的,准备好的方法来使这项工作(然后找出'为什么'以后)。

假设圈子没有碰到:

  1. 对它们执行边缘检测。 (如果你已经有,那么只需检查一次edgemap图像,以确定圈子没有碰到)
  2. 执行霍夫圆检测。存储检测到的圆圈的中心和半径
  3. 在边缘图像上找到连接组件(CoCo)。
  4. 对于检测到的每个此类组件,检查其中心是否接近检测到的霍夫圆之一。基本检查组件是否具有相应的检测到的霍夫圆。它不需要完全匹配。

    因此我们基本上可以避免使用Hough变换进行参数化。显然,连通组件将对应于CD的确切位置。

答案 2 :(得分:1)

对于其他通过谷歌来到这里寻找使用OpenCV检测同心圆的方法:似乎OpenCV Hough Circle检测无法做到这一点。 至少根据书中的一段“Learning OpenCV: Computer Vision with the OpenCV Library

  

最后,因为中心被认为是其相关累加器值的升序,并且因为如果它们太靠近先前接受的中心,则不保留新的中心,当多个圆同心或近似时,存在偏向于保持较大的圆。同心的。

出于性能原因,似乎已选择此实现细节。

答案 3 :(得分:0)

An algorithm for the detection of multiple concentric circles 提出了一种方法。

我的免费解释如下:

  • 获取边缘的二进制图像,可能Canny足够好
  • 查找已连接的组件
  • 在每个连接的组件中,随机选择3个点(但对这些点之间的最小距离设置一些约束)并将它们用于generate a circle。通过遍历所有连接的组件计算几个圆圈,并在每个连接的组件中 ,随机选择几组3个点。
  • 此外,您可以丢弃不能提供一致半径的连接组件
  • 所有这些圈子都会投票给一个中心,这些投票应该集中在图像的有效中心。
  • 返回由连接的组件生成的圆圈,并验证生成与找到的圆心一致的圆的连接组件。合并已生成具有相同半径的圆的已验证连接组件。