OpenCV提供了函数cv2.HoughLines()cv2.HouLinesP()用来实现霍夫直线变换。本届主要介绍基本原理。函数的用法将在下一节讲解。

笛卡尔空间(线) → 霍夫空间(点)

首先,我们观察笛卡儿空间中的一条直线在霍夫空间内的映射情况。例如,在中,左图是笛卡尔x-y坐标系(笛卡尔空间),右图是霍夫k-b坐标系(霍夫空间)。在笛卡尔空间中,存在着一条直线y=kox+bo,该直线的截距ko是己知的常量,截距bo也是已知的常量。将该直线映射到霍夫空间内,找到已知的点(ko,bo),即完成映射。

将笛卡尔空间内的直线映射到霍夫空间

根据上面的映射,可以将关系表述为:

  • 笛卡尔空间内的一条直线确定了霍夫空间内的一个点
  • 霍夫空间内的一个点确定了笛卡尔空间内的一条直线

笛卡尔空间(点) → 霍夫空间(线)

观察笛卡尔空间中的一个点在霍夫空间内的映射情况。如图所示,在笛卡儿空间内存在一个点(xo,yo),通过该点的直线可以表示为yo=kxo+b。其中,(xo,yo)是已知的常量,(k,b)是变量。

对于表达式yo=k * x0 + b,通过算术运算的左右移项,可以表示为b = - xo * k + yo。将点(xo,yo)映射到霍夫空间时,可以认为对应的直线斜率为-xo,截距为yo,即b = - xo * k + yo,如右图的直线所示。

将笛卡尔空间内的点映射到霍夫空间

  • 笛卡尔空间的点(x0,y0)映射到霍夫空间,就是b = -x0 * k + y0
  • 霍夫空间内的直线b = -x0 * k + y0映射到笛卡尔坐标,就是点(x0,y0)

笛卡尔空间(两点) → 霍夫空间(两线)

笛卡尔空间内的两个点映射到霍夫空间中

  • 笛卡尔空间内的两个点会映射到霍夫空间内两条相交与(k1,b1)的直线
  • 这两个点对应的直线会映射为霍夫空间内的点(k1,b1)

这说明,如果在笛卡尔空间内有两个点A、B,他们能连成一条直线y = k1 * x + b1,那么在霍夫空间中的点(k1,b1)上会有两条直线,分别对应着笛卡尔空间内的两个点A、B

笛卡尔空间(N点) → 霍夫空间(N线)

以此类推,如果在笛卡尔空间内有三个点,并且它们能够连成一条y = k1 * x + b1的直线,那么在霍夫空间中,对应的点(k,b)上会有三条直线,分别对应着笛卡尔空间内的三个点。到此,我们已经发现,如果在笛卡尔空间内,有N个点能够连成一条直线y=k1x+b1,那么在霍夫空间内就会有N条直线穿过对应的点(k1,b1)。或者反过来说,如果在霍夫空间中,有越多的直线穿过点(k1,b1),就说明在笛卡儿空间内有越多的点位于斜率为k1,截距为b1的直线y=k1x+b1上。

现连接(0,1)(1,2)(2,3)(3,4)的线LineA,连接点(2,3)(3、2)(1,4)的线LineB,连接(0,1)(3,2)的线LineC,如下图所示:

绘制笛卡尔空间内点的连线

从图中可以看出,霍夫空间内的点A有四条直线穿过,点B有3条直线穿过,点C有2条直线穿过。


综上所述:如果一条直线是由越多的所构成的,那么它实际存在的可能性就越大,它的可靠性也就越高。

因此,霍夫变换选择直线的基本思路:选择有尽可能多直线交汇的点。


特殊情况

在笛卡尔坐标中,可能会出现类似x = x0这样特殊的情况:

笛卡尔中的特例

此时,斜率k为无穷大,节距b无法取值。因此,垂线x=x0无法映射到霍夫空间中。

为了解决这样的问题,可以将笛卡尔坐标映射到极坐标系上。在极坐标内,采用极径r和极角θ来表示,即(r,θ)来表示。

极坐标中的直线可以表示为:
$$
r = x cosθ + ysinθ
$$
极坐标系统

与笛卡儿空间和霍夫空间的映射关系类似:极坐标系内的一个点映射为霍夫坐标系(霍夫空间)内的一条线(曲线)。极坐标系内的一条线映射为霍夫坐标系内的一个点。

一般来说,在极坐标系内的一条直线能够通过在霍夫坐标系内相交于一点的线的数量来评估。在霍夫坐标系内,经过一个点的线越多,说明其映射在极坐标系内的直线,是由越多的点所构成(穿过)的。

因此,霍夫变换选择直线的基本思路是:选择由尽可能多条线汇成的点。

通常情况下,设置一个阈值,当霍夫坐标系内交于某点的曲线达到了阈值,就认为在对应的极坐标系内存在(检测到)一条直线。


博主个人公众号
版权声明 ▶ 本网站名称:陶小桃Blog
▶ 本文链接:https://www.52txr.cn/2022/OpenCV50.html
▶ 本网站的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,请联系站长进行核实删除。
▶ 转载本站文章需要遵守:商业转载请联系站长,非商业转载请注明出处!!

最后修改:2022 年 05 月 26 日
如果觉得我的文章对你有用,请随意赞赏