问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

霍夫直线检测原理详解

创作时间:
作者:
@小白创作中心

霍夫直线检测原理详解

引用
CSDN
1.
https://blog.csdn.net/qq_47233366/article/details/123639022

霍夫变换是图像处理中一种重要的特征检测算法,广泛应用于直线、圆等几何形状的检测。本文将通过详细的原理讲解和图示,帮助读者理解霍夫直线检测的核心思想和具体实现方法。

在自动驾驶检测车道线的过程中,利用霍夫变换是实现车道线检测的一个思路,下面将来详细介绍霍夫直线检测的原理。

霍夫变换的基本思想

首先明确霍夫变换的大体思想,其实就是利用坐标系的转换来产生一些神奇的效果。

我们先来看这样的一个例子,在直角坐标坐标系中有一点A(x0,y0),则过该点的直线有无数条,我们称这些过该点的直线为一簇直线。那么这些直线的方程是什么呢?是的,该簇直线的方程为y0=k*x0+b。需要注意的是这里不同直线的k和b是不同时相等的,否则不就是一条直线了嘛。

我们上面得到了一簇直线的方程y0=kx0+b,现考虑将其换到另一个坐标系中对其进行表示,怎么理解呢,即我们将方程改写为b=-x0k+y0。此时应变量是b,自变量是k,即上述方程是关于k-b的一个方程,而(x0,y0)是已知的点,则在k-b构成的坐标系下b=-x0*k+y0为一条直线。需要注意的是,b-k坐标系我们称之为霍夫空间或参数空间,而原来直角坐标系空间称为图像空间。

通过上例我们可以得到以下结论:

  • 图像空间x-y中的一点对应于参数空间k-b中的一条直线。
  • 图像空间中的一条直线对应于参数空间k-b中的一个点。

霍夫变换的原理

既然我们知道了图像空间一条直线对应参数空间上的一个点,那么对于图像空间来说,只要一系列点在一条直线上,那么都会在参数空间上交与同一点;而不再同一条直线上的一系列点,它们对应于参数空间中的交点将会很凌乱,即有许多不同的交点。

这里表述的稍微有点饶人,下面通过图来表达就一目了然了:


图3:图像空间与参数空间的对应关系

上图在图像空间中存在5个点,分别为(1,0)、(1,1)、(2,1)、(4,1)、(3,2)。然后这5个点将分别对应参数空间中的五条直线。我们可以看出这五条直线有2个点是三条直线的交点,那么这两个交点分别对应于三条直线,而这三条直线对应于图像空间中的3点,可以发现这三点在一条直线上。这样我们也就找出了图像空间中的直线。

霍夫变换的局限性与改进

我们在讲第二个例子的时候【对应图2】有说这样的一句话:两条线的交点会同时满足图像空间两点A、B所对应参数空间两条直线的方程。可是在参数方程中的两条直线一定会存在交点嘛?如若不一定什么情况下会没有交点呢?我们知道的是若俩直线平行,也即斜率相等,则没有交点。现参数空间中的直线方程为b=-xi*k+yi,其斜率为-xi。由上分析可知,若在图像空间中两点的横坐标xi相等,则对应在参数空间中的直线平行,如下图所示:


图4:图像空间中横坐标相同的点在参数空间中的表现

可以看出,当图像空间中3点的横坐标都为2时,对应的参数空间中的3条直线没有交点。

既然存在上述的缺陷,我们考虑换一种表示参数空间的方式——采用极坐标表示。具体怎么将原先的直角坐标系(图像空间)转换到极坐标系(参数空间)呢?通过下图理解:


图5:从直角坐标系到极坐标系的转换

上图(p,q)点为坐标原点到(x1,y1)、(x2,y2)所在直线的垂点。我们联立两种计算斜率的方式公式,可以得到关于r和θ的极坐标方程:r=xcosθ+ysinθ。对于这个极坐标方程,同样的,参数空间的每个点(r,θ)都对应于图像空间的一条直线;图像空间中的一个点(x,y)对应于参数空间中的一条曲线。

从上图可以看出:

  • 经过变换,图像空间中的每个点(x,y)被映射为极坐标空间的正弦曲线。
  • 在图像空间中共线的点对应到极坐标空间会相交于一点(θ’,r’)。

我们也可以来比较一下直角坐标系空间转换到直角坐标系空间和直角坐标系空间转换到极坐标空间的区别,如下图所示:


图6:两种坐标系转换方式的对比

霍夫直线检测的实现

霍夫直线检测的原理至此就全部讲完了,希望大家都能够理解。这里再次总结一下霍夫直线检测的原理:若一幅图像中的点构成一条直线,那么这些点在参数空间对应的曲线一定相交于一点,因此我们只需要将图像空间中的所有点变换到参数空间,得到一系列的曲线,然后我们只要检测这些曲线相交的点就可以确定直线了。

但是现在其实还是有些问题存在的,比如在一幅原始的图像中就没有完全在一条线上的点,即我们将这些点映射到参数空间后,多条直线共同的交点非常的少,几乎没有,那这样我们检测不到直线了。另一方面,我们计算很多条直线是否有共同的交点其实是不方便的,也比较消耗算力。因此,在实际过程中,我们往往将参数空间中的θ离散化为有限个等间距的离散值,这样参数r也就对应离散化为有限个值。然后我们会统计这些离散值r出现的频次来确实直线。


图7:参数空间的离散化处理

呼呼呼~~到这里终于算是真正的把理论部分给介绍完了,在下一讲我将讲述霍夫直线检测的代码实战,敬请期待。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号