霍夫变换其实就是坐标变换,将实际图像的xy投影到参数空间,有多少个参数就投影到多少维空间,然后利用投票算法来决定所需的参数。
最简单的霍夫变换就是直线检测,y=kx+b。这里参数就是k,b,所以它是一个二维参数空间,我们可以建立一个“投票器”,其实就是一个二维数组。
b=y-kx 这么写比较容易分辨参数空间,但是当直线竖直时我们就求解不到k,b参数所以我们利用极坐标公式r=x*sin(a)+y*cos(a) a--<-pi~pi>
这样我们得到r和a两个参数,同样的还是投票二维参数空间。
第一步就是寻找边缘,可以用sobel也可以用canny。
第二步将边缘的点xy分别带入极坐标公式,带入不同的a分别求出r,对不同的a和r,在投票器中进行投票,比如在(0,0)点 a为pi/20时 r为30 就将投票器中表示 (pi/20,30)的点加1,这样当有一个点超过设定阈值票数时,我们就可以认定其为直线。
第三步就可以将参数带回笛卡尔坐标空间,图像中标明即可。
当然找圆也一样。
而广义霍夫变换就将这个参数空间扩展到椭圆甚至所有有方程的轮廓中,不管多少维参数都能将其找出,不过是时间比较浪费,其实霍夫变换的寻找方法类似于蛮力寻找,只不过利用数学方法提取而已,时间耗费相当可观。