图像直线识别:霍夫变换详解

详解霍夫变换:一种无需数据集即可识别图像中直线的经典机器视觉方法,将多点共线问题巧妙转化为多线共点问题。

原文标题:原创 | 一文读懂霍夫直线变换

原文作者:数据派THU

冷月清谈:

本文介绍了霍夫直线变换,一种用于在图像中识别直线的经典机器视觉方法。区别于依赖大量数据的深度学习方法,霍夫变换巧妙地利用图像空间和参数空间的映射转换,无需训练数据集即可实现直线检测。

其核心思想是将图像空间中的“多点共线”问题转化为参数空间中的“多线共点”问题。通过将图像中的每个点映射到参数空间中的一条直线,并将参数空间划分为网格进行投票统计,可以有效地识别出图像中的直线。

文章详细解释了霍夫变换的原理和具体步骤,包括笛卡尔坐标系下的参数表示和极坐标系下的参数表示,并通过示例图示说明了变换过程。此外,文章还列举了霍夫直线变换的优缺点,例如鲁棒性强、适用于复杂背景、可检测任意方向直线等优点,以及计算复杂度高、参数选择敏感等缺点。

OpenCV提供了霍夫变换的实现,文章也给出了代码示例和识别结果。最后,文章鼓励读者进一步探索霍夫变换的扩展应用,例如霍夫圆变换等。

怜星夜思:

1、文章提到霍夫变换的计算复杂度较高,尤其在高分辨率图像下。除了优化网格精度,还有哪些方法可以提高霍夫变换的效率?
2、霍夫变换除了能检测直线和圆,还能检测哪些其他几何形状?这些形状的检测原理是什么?
3、相比于基于深度学习的直线检测方法,霍夫变换有哪些优势和劣势?在实际应用中该如何选择?

原文内容

作者:贾恩东
本文约2000字,建议阅读5分钟
本文将会介绍一种传统而优雅的在图像中识别直线的模式识别方法。


本文将会介绍一种传统而优雅的在图像中识别直线的模式识别方法。该方法就是霍夫直线检测,是古早的一种机器视觉方法,该方法巧妙的使用了图像空间和参数空间的映射转换,而无需任何数据集,是一种经典的基于专家设计而非基于大量数据的统计或深度学习的方法。


假设我们有一副已经过二值化处理的图像,如下:

图片 


我们想识别出该图中出现的直线所在位置,应该去做呢?


可能有同学会说:我们需要很多这种图像,同时需要人工标注出图中出现的直线作为训练标签,之后我们就可以使用基于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 边缘检测),这会增加额外的计算步骤和时间。



编辑:于腾凯
校对:林亦霖

欢迎留言,有机会与本文作者互动哦~

数据派研究部介绍




数据派研究部成立于2017年初,以兴趣为核心划分多个组别,各组既遵循研究部整体的知识分享实践项目规划,又各具特色:


算法模型组:积极组队参加kaggle等比赛,原创手把手教系列文章;

调研分析组:通过专访等方式调研大数据的应用,探索数据产品之美;

系统平台组:追踪大数据&人工智能系统平台技术前沿,对话专家;

自然语言处理组:重于实践,积极参加比赛及策划各类文本分析项目;

制造业大数据组:秉工业强国之梦,产学研政结合,挖掘数据价值;

数据可视化组:将信息与艺术融合,探索数据之美,学用可视化讲故事;

网络爬虫组:爬取网络信息,配合其他各组开发创意项目。


点击文末“阅读原文”,报名数据派研究部志愿者,总有一组适合你~



转载须知


如需转载,请在开篇显著位置注明作者和出处(转自:数据派THUID:DatapiTHU),并在文章结尾放置数据派醒目二维码。有原创标识文章,请发送【文章名称-待授权公众号名称及ID】至联系邮箱,申请白名单授权并按要求编辑。

未经许可的转载以及改编者,我们将依法追究其法律责任。





关于我们

数据派THU作为数据科学类公众号,背靠清华大学大数据研究中心,分享前沿数据科学与大数据技术创新研究动态、持续传播数据科学知识,努力建设数据人才聚集平台、打造中国大数据最强集团军。




新浪微博:@数据派THU

微信视频号:数据派THU

今日头条:数据派THU

点击“阅读原文”加入组织~



“如果应用场景比较简单,比如只需要检测一些比较明显的直线,那么霍夫变换就足够了。如果场景很复杂,比如需要检测各种不同角度、不同长度的直线,那么深度学习方法可能更合适。” 当然,也有人尝试将霍夫变换和深度学习结合起来,利用霍夫变换提取特征,然后用深度学习模型进行分类,这样可以提高检测精度和鲁棒性。

除了直线和圆,霍夫变换还可以检测椭圆、抛物线等形状。其基本原理和直线、圆的检测类似,都是将图像空间的点映射到参数空间,然后在参数空间中寻找峰值。只不过参数空间的维度和表示方式会根据不同的形状而有所不同。

对,还可以检测一些简单的多边形。比如,可以先用霍夫变换检测出多边形的边,然后再根据边的交点关系确定多边形的形状。当然,这种方法对多边形的形状和复杂度有一定的限制。

还可以尝试使用GPU加速计算。霍夫变换的计算过程可以并行化,GPU可以显著提高计算速度,尤其是在处理高分辨率图像时。

霍夫变换的优势在于不需要训练数据,原理简单,实现容易。而深度学习方法需要大量的标注数据进行训练,训练过程也比较复杂。但是,深度学习方法的检测精度通常更高,鲁棒性更好,尤其是在复杂场景下。

我觉得选择哪种方法取决于具体的应用场景。如果对精度要求不高,或者没有足够的训练数据,那么霍夫变换是一个不错的选择。如果对精度要求很高,并且有足够的训练数据,那么深度学习方法更合适。

针对这个问题,可以考虑使用概率霍夫变换(Probabilistic Hough Transform)。它不是将所有点都映射到参数空间,而是随机选择一部分点进行变换,从而减少计算量,在实际应用中效果也不错。

我觉得可以先对图像进行降采样处理,降低图像分辨率,这样可以减少参与计算的点数,从而提高效率。当然,降采样可能会损失一些细节信息,需要根据实际情况权衡。

补充一下,其实霍夫变换的思想还可以推广到任意形状的检测。只要能找到一种合适的参数化表示方法,就可以将形状检测问题转化为参数空间的峰值搜索问题。不过,对于复杂形状,参数空间的维度可能会很高,计算复杂度也会很大。