
01
引言
直线检测有很多应用:例如,创建矢量化图、端点检测等。在这篇文章中,我们不讨论其具体的应用程序,而是重点关于于如何使用传统算法和深度学习的方法来进行直线检测,这里我们将对二者进行相关比较。
02
霍夫变换
其中,一个简单的读取图像并获取直线的样例代码如下:
import cv2path = 'sudoku-png-6.png'src = cv.imread(cv.samples.findFile(path), cv.IMREAD_GRAYSCALE)dst = cv.Canny(src, 50, 200, None, 3)linesP = cv.HoughLinesP(dst, 1, np.pi / 180, 50, None, 50, 10)cdstP = np.zeros(src.shape,dtype=np.uint8)cdstP.fill(255) # or img[:] = 255cdstP = cv.cvtColor(cdstP, cv.COLOR_GRAY2BGR)if linesP is not None:for i in range(0, len(linesP)):l = linesP[i][0]cv.line(cdstP, (l[0], l[1]), (l[2], l[3]), (0,0,255), 3, cv.LINE_AA)cv.imwrite('lines.png', cdstP)
得到结果如下:
03
用于语义分界线检测的深度霍夫变换
当然,直线检测在神经网络领域也有各种各样的实现方式,本文重点推荐两种最为常用的。
方案一:
Deep Hough Transform for Semantic Line Detection
自然图像中的“语义线”指的是图像中能够勾勒出图像内容结构的直线,例如不同区域的分割线,建筑物的中轴线等等。语义线检测在摄影构图,图像处理等下游任务中有着广泛应用。如下图所示,将图像中的语义线置于照片的黄金分割比位置能拍出视觉效果更好的图片 。

而本文就是利用 神经网络在神经网络特征图上进行相应的霍夫变换,从而兼顾了CNN的特征学习能力和霍夫变换的高效性。
论文地址:https://arxiv.org/abs/2003.04676
GitHub: https://github.com/Hanqer/deep-hough-transform
在线demo: http://mc.nankai.edu.cn/dht
在线demo的一些测试效果如下:
04
LETR
同样我们也有其他方法,如LETR(线段检测),使用wireframe数据集来找到更多可以描述3D对象的分割线。

论文名称:LETR: Line Segment Detection Using Transformers without Edges
论文地址:https://arxiv.org/abs/2101.01909
GitHub: https://github.com/Hanqer/deep-hough-transform
在线demo: https://huggingface.co/spaces/z-uo/LETR
在线demo的一些测试效果如下:
● 深度霍夫变换和LETR的对比
05
总结
点击上方小卡片关注我
万水千山总关情,点个在看行不行。

