基本原理
一条直线可由两个点A=(x1, y1)和B=(x2, y2)确定(笛卡尔坐标)
另一方面,y=kx+q也可写成关于(k, q)的函数表达式(霍夫空间)
对应的变换可以通过图形直观表示
变换后的空间称为霍夫空间。即:笛卡尔坐标系中一条直线,对应霍夫空间的一个点。
反过来同样成立(霍夫空间的一条直线,对应笛卡尔坐标系的一个点)
共线的A、B两个点,对应霍夫空间的情形
再看一下三个点共线的情况
可以看出如果笛卡尔坐标系的点共线,这些点在霍夫空间对应的直线交于一点,这也是必然的,因为共线的情况下斜率k和截距q是不变的。
如果不止一条直线呢?再看看多个点的情况(有两条直线)
其实(3, 2)与(4, 1)也能组成直线,只不过它由两个点确定。而图中A、B两点是三条直线的交点,这也是霍夫变换的后处理基本方式:选择由尽可能多直线汇成的点。
霍夫空间中选择由三条直线相交确定的点(中间图),对应笛卡尔坐标系的直线(右图)
到这里问题似乎解决了,已经完成了霍夫变换的求解,但是如果像下图这种情况呢?
k=∞是不方便表示的,因此考虑将笛卡尔坐标表示转换成极坐标表示。
在极坐标下其实是一样的,极坐标的点→霍夫空间的直线,只不过霍夫空间不再是(k, q)的参数,而是(ρ, θ)的参数,对比图如下
霍夫变换的步骤如下
一个具体的例子
如上图,假定在一张8×8大小的图片中有一条直线,首先从左上角(1, 8)像素点开始分别计算θ=0°、45°、90°、135°、180°时ρ的值分别为,并给这5个值分别计一票。同理计算像素(3, 6)点θ=0°、45°、90°、135°、180°时ρ的值,并分别计票,这时发现θ=45°, ρ=已经计了两票了。以此类推,遍历图片中的所有像素点,最终发现θ=45°, ρ=一共5票,而其它点票数均少于5票,所以得到图片中直线的极坐标方程为,至此该直线方程就求出来了,(实际中θ取值跨度不会这么大,一般是1度)。
参考
https://www.cnblogs.com/php-rearch/p/6760683.html
https://www.cnblogs.com/lvchaoshun/p/10645231.html
https://stackoverflow.com/questions/40531468/explanation-of-rho-and-theta-parameters-in-houghlines