4

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

我曾尝试在 EMGU 中使用 HoughCircles 方法,如果圆圈不在外圈的中心,该方法可以正常工作,但如果在外圈中心则不起作用。这是霍夫变换本身的限制,还是只是实现的 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]

偏移内圈(工作正常):

偏移内圆

中心内圈(无法正确检测外圈,大概是因为中心靠近内圈?)

中央内圈

我可以做些什么来检测圆圈是否共享相似的中心?

4

4 回答 4

3

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

最后,因为中心是按其相关累加器值的升序考虑的,并且如果新中心与先前接受的中心太接近,则不会保留新中心,因此当多个圆同心或近似同心时,倾向于保留较大的圆。

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

于 2016-06-08T15:20:17.707 回答
1

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

于 2012-12-20T08:17:33.463 回答
1

好的,这可能是一种粗略且现成的方法来完成这项工作(然后稍后找出“为什么”)。

假设圆圈不接触:

  1. 对它们执行边缘检测。(如果你已经有,那么只需检查一次边缘图图像,以确定圆圈没有接触)

  2. 执行霍夫圆检测。存储检测到的圆的中心和半径

  3. 在边缘图像上进行连通分量 (CoCo) 查找。

  4. 对于检测到的每个此类组件,检查其中心是否靠近检测到的霍夫圆之一。基本上检查组件是否有相应的检测到的霍夫圆。它不需要完全匹配。

    所以我们基本上可以避免对霍夫变换的参数摆弄。显然,连接的组件将对应于 CD 的确切位置。

于 2012-12-20T15:27:40.473 回答
0

一种用于检测多个同心圆的算法 提出了一种方法。

我的自由解释如下:

  • 获取边缘的二值图像,可能 Canny 已经足够好了
  • 查找连接的组件
  • 在每个连接的组件中,随机选择 3 个点(但对这些点之间的最小距离施加一些限制)并使用它们生成一个圆。计算几个圆,通过所有连接的组件,并在每个连接的组件内,随机选择几组 3 个点。
  • 此外,您可以丢弃不提供一致半径的连接组件
  • 所有这些圆圈都会投票给一个中心,这些投票应该集中在图像的有效中心。
  • 回到连通分量生成的圆,验证生成圆的连通分量与找到的圆心一致。合并已生成具有相同半径的圆的经过验证的连接组件。
于 2016-06-15T17:19:36.367 回答