本文将会介绍一种传统而优雅的在图像中识别直线的模式识别方法。
本文将会介绍一种传统而优雅的在图像中识别直线的模式识别方法。该方法就是霍夫直线检测,是古早的一种机器视觉方法,该方法巧妙的使用了图像空间和参数空间的映射转换,而无需任何数据集,是一种经典的基于专家设计而非基于大量数据的统计或深度学习的方法。
假设我们有一副已经过二值化处理的图像,如下:
我们想识别出该图中出现的直线所在位置,应该去做呢?
可能有同学会说:我们需要很多这种图像,同时需要人工标注出图中出现的直线作为训练标签,之后我们就可以使用基于CNN或Transformer的神经网络进行训练,最终会得到一个可以用来识别直线的模型。
但是对于直线或圆这种经典的,特征明显的几何图形,很久以前我们就有了更加直观且简洁的一种方法:霍夫直线检测(Hough Line Detection)
该方法虽然数学公式看起来较为突兀,但其根本逻辑仍然可以用一句话来说清:我们对于多个点共直线是比较难寻找的,但是我们对于多条线共点则是可以很快找到的。
那么如果我们能找到一种变换方法,使得原图像中的多点共(直)线问题转化为多线共点问题,然后我们把后者的空间划分网格,统计计算网格内的线之间的交点个数,就可以很快找到是哪些原图像中的点共(直)线,也就解决了原图像中的直线检测问题了。
接下来我们迅速了解一下这种巧妙的变换方法。
Hough Transform:
原图像,我们使用笛卡尔直角坐标系,某一个点我们可以记作$(x_0,y_0)$,而某一个直线我们可以记作$y=mx+b$,其中$m$ 和 $b$ ,是该直线的固定参数,一旦确定下来则该直线就确定了。因此,每一组参数$(m,b)$ 对应了原图像中的一条直线。
换句话说,经过点$(x_0,y_0)$ 上的某条直线方程$y=mx+b$,也应该满足$y_0=mx_0+b$ ,变形得到$b=-x_0 m - y_0$。因此,每一个原图像的某个点,也可以对应到参数空间上的某条直线。
这样看起来,我们就可以把在原图像中的多点共线问题,转化为了新的参数空间上的多线共点问题。而多点共线问题就比较难寻找的,而多线共点则可以使用网格投票法简单找到。
如上图,原图像空间的蓝色点和红色点,分别对应到参数空间上的蓝色线和蓝色点,而原图像空间的蓝色线和红色线,分别对应到参数空间上的蓝色点和蓝色线。而原图像空间上的蓝色点和红色点的连线(二点共线),则对应到参数空间上蓝色线和红色线的交点(紫色点)。当我们把所有的原图像点都映射到参数空间上时,就可以得到所有的参数空间上的直线。假设我们把参数空间上划分了很多NxN的网格,然后我们统计每个网格内直线出现的条数,则出现的越多则意味着原图像中有越多的点共线了,则该参数空间内的该网格对应的原图像空间的直线则就是一条由很多点组成的直线。当网格划分更细时,直线位置越准确,但对于噪声更敏感,一旦某些点略微偏差直线就难以识别;当网格划分更粗时,直线位置越不精确,但可以识别近似形成直线的情形。
最后就是一个可以优化的细节,我们会发现$(m,b)$,或者更具体的,对于斜率来说,其取值范围是难以封闭的,这对于我们划分有限的网格来说是困难的。所以我们可以把这种直线形式改变为 $xcos\theta+ysin\theta=\rho$ ,我们可以关注参数空间$(\theta,\rho)$上的网格划分,然后统计原图像在该参数空间上的线共点情况。不过这种变换下,原图像空间下的多点共直线就转换为参数空间下的多(正弦)线共点了。比如三点共线在参数空间下就会如下图。
OpenCV就提供了该方法的实现:
运行后,该代码对于一开始的图片的直线识别结果如下。
到这里我们就了解了霍夫直线检测的具体细节原理了。甚至悟性高的同学可以自行设计推出其他几何模式检测方法(比如霍夫圆变换)。这里笔者将这种古典的方法的优缺点罗列如下,让大家对其有更笼统的认识。
优点
鲁棒性强:
霍夫直线变换对噪声和部分遮挡具有较强的鲁棒性。即使图像中的直线不完整或受到干扰,仍然能够检测到直线。
适用于复杂背景:
在复杂背景中,霍夫直线变换能够有效地提取出直线特征,例如在自然场景中检测道路边缘或建筑物轮廓。
可检测任意方向的直线:
霍夫直线变换不受直线方向的限制,能够检测任意角度的直线(水平、垂直、斜向等)。
参数化表示:
霍夫直线变换将直线表示为参数空间中的点 $(\theta,\rho)$,这种表示方式便于后续处理和分析。
可扩展性强:
霍夫直线变换可以扩展到检测其他几何形状,例如圆(霍夫圆变换)、椭圆等。
易于实现:
霍夫直线变换的算法逻辑简单,易于实现,并且有成熟的库支持(如 OpenCV)。
缺点
1. 计算复杂度高:
- 霍夫直线变换的计算复杂度较高,尤其是在高分辨率图像或参数空间精度要求较高的情况下,计算量会显著增加。
2. 参数选择敏感:
- 霍夫直线变换的效果依赖于参数的选择,例如累加器阈值、最小直线长度、最大直线间隙等。不合适的参数可能导致漏检或误检。
3. 对噪声敏感:
- 虽然霍夫直线变换对部分噪声具有鲁棒性,但在噪声较多的情况下,可能会检测到大量虚假直线。
4. 无法处理重叠直线
:- 如果图像中存在多条重叠或接近的直线,霍夫直线变换可能难以准确区分它们。
5. 需要边缘检测预处理:
- 霍夫直线变换通常需要先对图像进行边缘检测(如 Canny 边缘检测),这会增加额外的计算步骤和时间。