opencv--imgproc模块·Hough 检测圆

官网:http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/tutorials/imgproc/imgtrans/hough_circle/hough_circle.html#hough-circle

前言

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)的倾向是保留最大的一个圆 。

猜你喜欢

转载自blog.csdn.net/naozhuo0615/article/details/82691368