Hough Transformation (霍夫变换)

考虑以下一个图像处理问题:通过边缘检测我们得到了图像的edges,原本是一条直线的edge可能因为噪声或者其他原因导致断成几段edges,如何把他们连起来。(这还是我当初去ASTRI HK时候遇到的面试题)关键就在于判断图像中那些edges是属于一条直线的,或者说,那些edge points(称为前景点)是(近似地)落在一条直线上的。


 

霍夫变换提供了一种简单的方法去完成这个任务。所谓霍夫变换,就是将(描述图像的)笛卡尔坐标下的一类图形变换到参数空间上的一个点,不同位置,不同取向,不同尺寸的同一类图形(也就是说相似的一类图形)在同一个参数空间中对应了不同的点。


 

 

 

 

如果图形是线,那么对应的变换就是霍夫线变换。考虑图像笛卡尔坐标系下有一条直线

y=kx+b

则斜率k和截距b就是直线的两个参数,在b-k空间中,笛卡尔坐标系下的直线y=kx+b是一个点(k,b)。

考虑笛卡尔坐标系下一个定点(x0,y0),通过这个定点的直线有无数条,每一条直线在b-k空间中是都是一个点,那么这些点有什么性质?

因为这些直线都过定点(x0,y0),所以直线的k和b是不能任意选取的,必须满足y0=k*x0+b,也就是说必须满足b=-k*x0+y0,因此在笛卡尔坐标系下,过定点的一族直线,它们在b-k空间中是一条直线,直线上任一点是k和b的一组允许取值;反过来看,k-b空间中的一条直线,就表示笛卡尔坐标系下的一族直线,这族直线过同一个点。


如果笛卡尔坐标系下有两个定点(x1,y1)和(x2,y2),那么过(x1,y1)的那一族直线在b-k空间中是一条直线,过(x2,y2)的那一族直线在b-k空间中是另一条直线,这两条直线的交点(k,b),描述的就是笛卡尔坐标系中同时过两个定点(x1,y1)和(x2,y2)的直线了。由此类推,如果笛卡尔坐标系下有100个点,这些点(近似)共线,记为直线l,那么过这些点的直线族在b-k空间中分别是100条直线,这100条直线会(近似)交于一点(k,b),这点(k,b)就是描述l的参数。


因此,打个比方,将k从-99到100,以1为分割单位,b从-99到100,以1为分割单位,这样就构成了200*200个(b,k)对,每一个b-k对有自己的counter,对笛卡尔坐标系下每一个前景点做霍夫线变换,得到b-k空间中的一条直线q,k从-99到100,1为分割,计算出最接近这条直线q的{b},然后所有的这些(k,b)的counter+1。形象点说,就是b-k空间划分了200*200个小方格,直线q穿过的那些小方格,counter+1。对笛卡尔坐标系下每一个前景点完成这样的操作之后,看看这个200*200的小方格的counter矩阵哪里出现峰值,峰值对应的(k,b)就是笛卡尔坐标系下那些前景点(或部分这些前景点)共线的那一条直线。如果已知前景点分成N组,每组分别近似共线,那么就在counter矩阵中寻找N个峰值。


上边的方法有一个问题,就是k不能取无限大,所以垂直x轴的直线在b-k空间中无法表示出来。因而对于直线,参数方程我们通常用

x*cos(theta)+y*sin(theta)=rou

来表示,也就是极坐标表示,rou是笛卡尔坐标系原点到该直线的距离,theta是该直线与笛卡尔坐标系x轴夹角,这样参数空间就从b-k变为rou-theta,过笛卡尔坐标系下一定点的直线族,在rou-theta空间中是一条正弦曲线,其余概念和方法类似。


 

posted @ 2015-01-27 14:39  Cyrus Ho  阅读(1210)  评论(0编辑  收藏  举报