Hough(霍夫)变换是一种用于检测线、圆或者图像中其它简单形状的方法。最初Hough变换是一种线变换,这是一种相对较快的检测二值图像中直线的方法。
Hough线变换的基本理论是:二进制图像中的任何点都可能属于某些可能的线。如果我们将每一条线参数化,如斜率为a,截距为b,原始图像中的点就可以转换为对应于通过该点的所有线在该平面(a,b)中的点的轨迹。当然也可能是一部分轨迹。如果我们将原图中每个非0像素转换成输出图像中这样的一系列点,并将所有这些贡献相加,那么原图((x,y)平面)中的线将显示为输出图像((a,b)平面)中的局部最大值。由于我们将每个点的贡献进行求和,所以(a,b)平面通常称为"累加器平面"。
斜截式方程并不是代表所有穿过某个点的线的最佳方式(因为图像中线的密度与斜率有很大的不同),还有一个相关事实是,斜率的区间可能从负无穷到正无穷。正因如此,图像变换时数值计算实际用到的参数有所不同。最好的参数形式是用极坐标中的点(ρ,θ)表示线,每条直线经过这个点并且垂直于它与原点的连线。
斜率,亦称“角系数”,表示一条直线相对于横轴的倾斜程度。一条直线与某平面直角坐标系横轴正半轴方向的夹角的正切值即该直线相对于该坐标系的斜率。在四个象限的直线方程,如果知道原点到这条直线的代数距离ρ和与x轴的夹角θ,则直线方程可由以下方式表示:
ρ=xcosθ+ysinθ
当然,反过来也可以,如果知道平面内的一条直线,那么可以计算出唯一的ρ和θ, 即xoy平面内的任意一条直线对应参数空间(或称霍夫空间)θoρ中的一点(ρ,θ)。从另个角度考虑,过xoy平面内的一点(x1,y1)有无数条直线,则对应霍夫空间中的无数个点,这无数个点连接起来就是θoρ平面内的曲线ρ=x1cosθ+y1sinθ.
通过上述讨论可以解答一个问题:如何验证xoy平面内的(x1,y1),(x2,y2),…是否共线?只要曲线ρ=xicosθ+yisinθ,i=1,2,…在θoρ平面内相交于一个点就可以了。
标准霍夫直线检测的核心思想:判断xoy平面内哪些点共线的,首先求出每一个点对应到霍夫空间的曲线,然后判断哪几条曲线相较于一点,最后将相交于一点的曲线反过来对应到xoy平面内的点。