-
霍夫圆变换与霍夫直线变换的原理类似,也是将圆上的每个点转换到霍夫空间, -
其转换的参数方程如下:
-
对于圆来说,
θ的取值范围在0~360°,这样就有了三个参数,另外两个参数是圆心(x0,y0)与半径γ。 -
这里的
霍夫空间便是一个三维空间, 所以如果还是跟之前的累积计算一样,计算量就会大大增加, 这样显然不利于快速计算与检测, -
所以在OpenCV中,
霍夫圆检测不是基于二值图像或者边缘检测的结果, 而是基于灰度图像的梯度来找到候选区域, 然后基于候选区域实现霍夫圆检测, 这样就会大大减少计算量,提高程序的执行速度与性能,
但是基于梯度实现霍夫圆检测也带来了另外一个问题,那就是结果特别容易受到噪声影响, 对图像中的噪声特别敏感,
所以在OpenCV中使用相关API实现霍夫圆检测的时候, 首先需要通过模糊操作对图像进行噪声抑制处理。 一般来说,常见的均值、高斯、中值模糊对图像噪声的抑制已经比较有效, 但是在霍夫圆检测中有时候还会用到边缘保留滤波来抑制平坦区域噪声, 以便在进行梯度计算的时候能够更好地得到候选区域。
霍夫圆检测的API:
HoughCircles(Mat image, Mat circles, int method, double dp, double minDist, double param1, double param2, int minRadius, int maxRadius)image:8位单通道的灰度图像。circles:输出的三个向量的数组,圆心与半径(x,y,r)。method:唯一支持的方法就是基于梯度霍夫变换——HOUGH_GRADIENT。dp:图像分辨率,注意dp越大,图像就会相应减小分辨率;当dp等于1时,其跟原图的大小一致;当dp=2时,其为原图的一半。minDist:表示区分两个圆的圆心之间最小的距离,如果两个圆之间的距离小于给定的minDist,则认为是同一个圆,这个参数对霍夫圆检测来说非常有用,可以帮助降低噪声影响。param1:边缘检测Canny算法中使用的高阈值。param2:累加器阈值,值越大,说明越有可能是圆。minRadius:检测的最小圆半径,单位为像素。maxRadius:检测的最大圆半径,单位为像素。
使用API实现灰度图像圆检测:
private void houghCircleDemo(Mat src, Mat dst) {
Mat gray = new Mat();
Imgproc.pyrMeanShiftFiltering(src, gray, 15, 80);
Imgproc.cvtColor(gray, gray, Imgproc.COLOR_BGR2GRAY);
Imgproc.GaussianBlur(gray, gray, new Size(3, 3), 0);
// detect circles
Mat circles = new Mat();
dst.create(src.size(), src.type());
Imgproc.HoughCircles(gray, circles, Imgproc.HOUGH_GRADIENT, 1, 20, 100, 30, 10, 200);
for(int i=0; i<circles.cols(); i++) {
float[] info = new float[3];
circles.get(0, i, info);
Imgproc.circle(dst, new Point((int)info[0], (int)info[1]), (int)info[2],
new Scalar(0, 255, 0), 2, 8, 0);
}
circles.release();
gray.release();
}
运行结果如下图,左侧为原图,右侧是霍夫圆检测运行结果:
霍夫圆检测相比霍夫直线检测,计算量大,输出参数多, 因此一般都通过指定半径范围,指定边缘阈值与累积器阈值来减少计算量, 否则速度就会很慢,这个也是在使用的时候需要特别注意的。
#####上述三个指定参数如何影响霍夫圆检测的计算量
指定半径范围: minRadius:检测的最小圆半径,单位为像素。 maxRadius:检测的最大圆半径,单位为像素。 即函数只检测半径处于minRadius和maxRadius之间的圆,所以指定半径范围自然能够影响计算量了。指定边缘阈值霍夫圆检测的基于内部边缘检测的结果; 而边缘阈值影响边缘检测最终留下的边缘像素,即影响内部边缘检测的结果, 因而影响霍夫圆检测的计算量;累积器阈值此阈值的高低便是提取圆的要求的高低,高阈值高要求高计算量,反之亦然。
- 此外
广义霍夫变换通过拓展,可以实现任意形状的检测,可以查阅其他相关的资料了解,这里便不多说了。
参考材料
- 《OpenCV Android 开发实战》(贾志刚 著)
- 关于《OpenCV Android 开发实战》作者的GitHub项目
- 笔者基于作者GitHub维护的APP