opencv轮廓检测之椭圆检测-----算法篇(7)--Hough transform检测圆

关于霍夫变换,  首先看看wiki的介绍

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

    http://www.iro.umontreal.ca/~mignotte/IFT6150/ComplementCours/HoughTransform.pdf

http://www.dtic.mil/dtic/tr/fulltext/u2/a457992.pdf   -------[Duda,Hart71], 介绍霍夫变换的使用,后面部分将应用拓展到圆

http://comp-eng.binus.ac.id/files/2012/04/D.H.-Ballard-Generalizing-the-Hough-Transform-to-Detect-Arbitrary-Shapes1.pdf

    在圆中, 

  

    对于任一点,  


未知的参数有三个

 each figure point will be transformed into a right circularcone in a three-dimensional parameter space.

 If the cones correspondingto many figure points intersect at a single point , say the point (a0, b0, c0),

 then all the figure points lie on the circle defined by those three parameters.

就像这样,  当然,  这是一个圆心对应半径从零到无穷变化的圆锥

opencv轮廓检测之椭圆检测-----算法篇(7)--Hough transform检测圆_第1张图片

注: 本篇以上所有图来源于上面给出链接的最后两个链接


但是这样计算量过大, 出现了很多基于霍夫变换的改进算法

    基于霍夫变换检测圆, 有 以下两种情况

1.圆的半径已知

    前面讲的sobel算子,  因为都链接了wiki,  就没有细说,  如果不明白,  不妨先看看wiki .

由于计算量太大,  这里面用了sobel算子来计算梯度

由sobel算子,  我们可以求得梯度大小, 以及方向.



当已知半径估计圆心的时候,  

    对于圆上某一点,  已知梯度方向,  那么圆心( Xc, Yc)就在该点的法线上距离该点为半径R

那么有                    Rcosθ = X - Xc 

而                              cosθ = Gx/ G

所以就有                       Xc = X - R · Gx/ G

不好意思阿在ubuntu下使用特殊符号不太方便,  也没精力去研究怎么写好公式

  类似的                         Yc = Y - R · Gy/ G

这样,  圆心坐标(Xc, Yc)就可以定位出来了


使用霍夫变换检测圆的具体过程可以是

       1.边缘检测

       2.连接边缘

       3.细化边缘

       4.对于每个边缘计算它的圆心

       5.对于这些点簇求平均值,  即为圆心


这个算法避免了霍夫变换过程中

相对于原本去求edge上每个点以R为半径的圆(由点构成的圆),  然后求其交点定位为圆心的方法 

   这样做只需要edge上每个点的法线方向找两个点,   减少了计算量


实际上opencv上就用了这样的优化算法

当然不止这一种改进算法,  sobel本身就有一定的误差, 而且受到噪声的影响

使用具体的算法还是要查相关论文为好


2.圆的半径未知

     对于不确定圆的半径,  对于霍夫变换是要创建3维的parameter space, 就像前面说的那样.


针对不同的方面(比如计算量阿, 精确度阿,  鲁棒性阿)都有基于hough变换的论文

至于效果我也不太清楚,  以前使用过opencv1中的houghcircle, 效果很差

老实说没看过几篇论文,  看了也不能马上理解

还怕写完这个半个月都过去了

脱离了写这整篇文章的原旨:      椭圆检测

觉得了解了霍夫变换就够了,  后面文章肯定有基于hough变换的

用到哪里学到哪里吧


如果我没记错,  opencv里的hough变换是不能直接检测椭圆的,   

所以应该会自己试着写写算法看看的,  或者至少知道原理

你可能感兴趣的:(opencv与图像处理,hough变换,opencv,circle,算法)