9

检测图像中圆圈的可能快速方法是什么?

例如:我有一个带有一个大圆圈的图像,并且在大圆圈中有 6 个小圆圈。

我需要在不使用霍夫圆(OpencV)的情况下找到一个大圆。

4

2 回答 2

13

寻找圆圈的标准算法是 Hough(在评论中提到过)和 RANSAC。参数化这些算法将为您的应用程序设置基线速度。

http://en.wikipedia.org/wiki/Hough_transform

http://en.wikipedia.org/wiki/RANSAC

为了加快这些算法的速度,您可以查看您的图像集合并决定限制搜索范围是否有助于加快搜索速度。这很简单:只在合理范围内搜索半径。由于它们将边缘点作为输入,因此您还可以查看减少检查的边缘点数量的方法。

但是,还有一些其他技巧可以加快处理速度。

  • 仔细设置检查半径的范围。例如,您可能不会简单地从可能的最小半径到可能的最大半径进行检查,而是可能会将搜索分成两个不同的范围:从半径 R1 到 R2,然后从半径 R3 到 R4。
  • 放弃 Canny 边缘检测,转而采用您的应用程序可以容忍的最快边缘检测。(你可以放弃 Canny 以获得很多应用程序。)
  • 预处理边缘点的图像以消除异常值。消除异常值的适当算法将特定于您的图像集,但您可能会找到一种消除明显异常值的算法,从而在更昂贵的圆拟合算法中节省一些搜索时间。
  • 如果您的圆圈定义非常明确,并且所有或几乎所有点都存在,请弄清楚您如何仅匹配四分之一圆或半圆而不是整圆。

长话短说:从一个完整的实现开始并对其进行基准测试,然后逐渐收紧参数设置并限制搜索范围,同时确保您仍然可以为您的应用程序和图像集找到圆圈。

如果您的图像适合缩放,那么一种可能性是创建不同比例的图像金字塔:1/2 比例、1/4 比例、1/8 比例等。您需要一种边缘保留缩放方法在较小的尺度上。

建立图像金字塔后,请尝试以下操作:

  1. 找到最小比例的圆圈。图像会很小,可能的半径范围会受到限制,所以这应该是一个快速的操作。
  2. 如果您在小尺度上使用初始拟合找到一个圆,请通过在下一个较大比例的图像中进行测试来改进拟合 - 或者 - 继续并在全尺寸图像中进行搜索。
  3. 检查下一个最大的比例。在较小比例图像中不可见的圆圈可能会突然“出现”在当前比例中。
  4. 对图像中的所有比例重复上述步骤。

图像缩放将是一种快速操作,您可以看到,如果至少有一个圆圈出现在较小比例的图像中,您应该能够通过在小比例图像中执行粗略的圆圈拟合来减少循环总数,并且然后在全尺寸图像中单独优化这些边缘点的拟合。

边缘保留缩放还可以使用相关类型的工具来查找圆,但能否做到这一点取决于图像的内容,包括噪声、边缘点表示圆的完整程度等等。

于 2013-04-09T13:47:28.680 回答
1

也许,检测轮廓并检查它们的属性,例如尝试使用cv::isContourConvex或另一种方法是使用协方差矩阵的特征值并检查轮廓的代表性椭圆第一偏心率是否为~0。

于 2013-04-08T12:02:11.367 回答