前言
Hough变换也是在图像处理、计算机视觉领域应用很广泛的技术。
经常是用Hough来检测直线,今天想学习下Hough检测圆。
用官网的代码,自己在网上找了幅有圆的图片,却检测出不来
然后重新找了一幅图片,就可以,如下图所示(dp =2 , minDist =Image.rows/8)
整个代码中,最重要的就是HoughCircles()函数,
来看它的定义:
void HoughCircles( InputArray image, OutputArray circles,
int method, double dp, double minDist,
double param1=100, double param2=100,
int minRadius=0, int maxRadius=0 );
//dp,用来检测圆心的累加器图像的分辨率与输入图像之比的倒数,例如如果dp= 1时,累加器和输入图像具有相同的分辨率。如果dp=2,累加器便只有输入图像一半的分辨率
//minDist 检测到的圆的圆心之间的最小距离,即让我们的算法能明显区分的两个不同圆之间的最小距离。如果这个参数设置过大,某些圆就不能被检测出来。
如上图,按照官网上设置为Image.rows/8 , 该图像 Image.rows = 279, 即 minDist = 34点多
当参数 minDist 设置为20时,结果如下,的确把上面没有检测到的圆检测出来了
当改变参数为dp = 3,minDist仍然为Image.rows/8时,
回到最初遇到的那个问题
为什么那个建筑物的圆没检测出来呢?,原因在这里
//采用高斯滤波去除噪声
GaussianBlur(tmp,tmp,Size(9,9),2,2);
特意显示了下滤波后的效果图,如下图,图片变得很模糊,
于是不执行这一行,即不进行降噪处理,发现可以检测出来了!说明降噪处理要因图而异,并不是所有都需要!
至于为什么只检测出一个圆,博主@ 浅墨_毛星云描述:当有许多同心圆或者是近似的同心圆时,霍夫梯度法(CV_HOUGH_GRADIENT)的倾向是保留最大的一个圆 。