1. 引言
直线检测有很多应用:例如,创建矢量化图、端点检测等。在这篇文章中,我们不讨论其具体的应用程序,而是重点关于于如何使用传统算法和深度学习的方法来进行直线检测,这里我们将对二者进行相关比较。
闲话少说,我们直接开始吧!
2. 霍夫变换
通过opencv-python
进行canny
边缘检测和hough
变换来进行直线检测是图像处理中最基本的思想。
其中,一个简单的读取图像并获取直线的样例代码如下:
import cv2
path = '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[:] = 255
cdstP = 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)
得到结果如下:
3. 神经网络
当然,直线检测在神经网络领域也有各种各样的实现方式,本文重点推荐两种最为常用的。
● 方案一:Deep Hough Transform for Semantic Line Detection
自然图像中的“语义线”指的是图像中能够勾勒出图像内容结构的直线,例如不同区域的分割线,建筑物的中轴线等等。语义线检测在摄影构图,图像处理等下游任务中有着广泛应用。如下图所示,将图像中的语义线置于照片的黄金分割比位置能拍出视觉效果更好的图片 。
而本文就是利用 神经网络在神经网络特征图上进行相应的霍夫变换,从而兼顾了CNN的特征学习能力和霍夫变换的高效性。
在线demo的一些测试效果如下:
● 方案二: LETR: Line Segment Detection Using Transformers without Edges
同样我们也有其他方法,如LETR
(线段检测),使用wireframe数据集来找到更多可以描述3D对象的分割线
论文地址:点我
GitHub: 点我
在线demo: 点我
在线demo的一些测试效果如下:
● 二者对比
第一种方法找到图像中所有的语义分界线,因此它可以用来找到更好的透视线;第二种方法是找到元素边界的分割线,这些分割线可以用来在很短的时间内创建一个3D模型,进而得到图像的纹理。
4. 总结
如果我们需要解决简单的任务,比如检测桌子、数独或网球场的线条,在特定的光线条件下,场景不会有太大的变化,那么传统的图像处理的方法就是最好的解决方案,特点为:简单、可控,不需要太多的计算资源。
但是,对于场景更为多变的任务,神经模型的表现可以更好,泛化能力更强。
最后,我上面展示的所有内容都是开源的,所以请使用它并为开源做出更多贡献!!!