我正在使用 opencv houghcircle 函数来检测圆圈。
http://docs.opencv.org/doc/tutorials/imgproc/imgtrans/hough_circle/hough_circle.html
问题是,如果我将最小半径设置为空,它会检测到错误的中心并绘制更小的半径圆或有时更大的半径圆。我正在寻找通过调整阈值参数 1 和 2 来提高检测精度。
我正在使用 opencv houghcircle 函数来检测圆圈。
http://docs.opencv.org/doc/tutorials/imgproc/imgtrans/hough_circle/hough_circle.html
问题是,如果我将最小半径设置为空,它会检测到错误的中心并绘制更小的半径圆或有时更大的半径圆。我正在寻找通过调整阈值参数 1 和 2 来提高检测精度。
图像: 8 位,单通道图像。如果使用彩色图像,请先转换为灰度。
方法:定义检测图像中圆圈的方法。目前,唯一实现的方法是cv2.HOUGH_GRADIENT
,对应于 Yuen 等人。纸。
dp:累加器数组的分辨率。投票被分成由 dp 大小设置的正方形。设置太小,只能找到完美的圆圈,设置太高,噪音会协同投票给非圆圈。
minDist:检测到的圆的中心 (x, y) 坐标之间的最小距离。如果 minDist 太小,则可能(错误地)检测到与原始值相同的邻域中的多个圆。如果 minDist 太大,则可能根本无法检测到某些圆圈。
param1:是转发给 Canny 边缘检测器(应用于灰度图像)的数字,表示传递给的阈值 1 Canny(...)
。Canny 使用该数字来指导边缘检测:http ://docs.opencv.org/2.4/modules/imgproc/doc/feature_detection.html?highlight=canny
param2:该方法的累加器阈值cv2.HOUGH_GRADIENT
。阈值越小,检测到的圆圈越多(包括假圆圈)。阈值越大,可能返回的圆圈就越多。
minRadius:半径的最小尺寸(以像素为单位)。除非您想要在该范围内找到所有可能的圆圈,否则不要设置minRadius
和分开太远。maxRadius
maxRadius:半径的最大尺寸(以像素为单位)。除非您希望在该范围内找到所有可能的圆圈,否则不要设置minRadius
和maxRadius
分开太远。
如果您没有向 HoughCircles 提供正确的半径(+- 15 像素),则输出几乎是无用的,因为它会无缘无故地无缘无故地返回圆形。
但是,如果您不知道半径并且不知道最佳 dp 分辨率和累加器阵列阈值,则有一个技巧。HoughCircles 很快(线性时间?),把 HoughCircles 放在一个循环中,从一个大的 minDist、精细的 dp 分辨率和高累加器投票阈值开始,然后开始猜测你愿意找到的最大圆半径,HoughCircles 什么也不返回. 每次迭代,慢慢减小半径,减小阈值,增加 dp 分辨率。最终 HoughCircles 会找到一个像素完美的圆。
再次执行此过程并从另一侧接近,循环 HoughCircles 开始猜测最小半径,低分辨率,高投票阈值,最终将找到最小和最高质量的圆。如果两个圆在一个共同的圆上达成一致,您可以非常确信找到的圆是高质量的,否则在不同的范围和速度下增加/减少超参数。
HoughCircles 在数学上是精确且完全正确的,它已被证明即使在您不知道半径的情况下也能找到像素完美的圆。通过为您的图像自动调整超参数,找到的圆圈是像素完美的。
您不仅可以使用 HoughCircles 找到圆的中间,还可以使用它来定义圆的边缘渐变的外唇和内唇(亚像素精度)。例如,硬币圆周的外唇或内唇。
必须使用多次迭代的多次传递来为每个图像唯一地自动调整超参数,以慢慢发现哪些圆圈是您想要的。
证明像素完美的准确性:
如果必须证明性能对于工业环境来说是完美的亚像素,那么您无法直观地了解算法在做什么,因此您可以根据自己的需要调整其实现。有关深入指南,请参阅:David Forsyth 和 Jean Ponce 的“计算机视觉:现代方法”,第 2 版,第 10 章关于霍夫变换。
如果您知道要查找的圆的大小,那么最好相应地设置 min_radius 和 max_radius。否则,它将返回任何大小的圆形。
参数 1 和 2 本身不影响精度,可靠性更高。参数 1 将设置灵敏度;圆圈的边缘需要有多强。太高,它不会检测到任何东西,太低,它会发现太多的混乱。参数 2 将设置它需要找到多少个边缘点来声明它找到了一个圆。同样,太高不会检测到任何东西,太低会声明任何东西都是一个圆圈。参数 2 的理想值将与圆的周长有关。