(十六:2020.09.09)传统直线检测方法总结与修正(9.09更新)
传统直线检测方法总结与修正(9.07更新)
- 写在前面
- 一、cv2.HoughLines
- 二、cv2.HoughLineP
- 三、LSD直线检测
- 四、FLD直线检测
- 五、EDLine直线检测
- 六、LSWMS直线检测
- 七、CannyLines直线检测算法
- 八、MCMLSD直线检测算法
- 九、LSM直线检测算法
- 十、PPGNet直线检测算法
- 十一、《Learning Attraction Field Representation for Robust Line Segment Detection》
- 十二、《Semantic Line Detection and Its Applications》
- 最后
写在前面
在查找资料的过程中,发现很多博主未对直线检测的方法做总结,在本篇中,我会收集尽可能多的方法,来测试在医学图像上的检测效果,同时对当前可以使用的API进行分析(由于一些工具版本的变化,之前的使用方法可能不再适用)。
参考博客:https://blog.csdn.net/WZZ18191171661/article/details/101116949#3LSD_87
在没有关注这项技术之前我一直以为该领域已经具备了相当成熟的算法和理论,但是在查找资料以后发现,在CVPR这种顶会上各种算法也不断地推陈出新,这就说明该领域还有很长一步路需要走,应用在工业上的传统直线算法已经很多,前九篇论文是上文提到这个博主的总结,我会在后面添加顶会的相关算法,方便自己以后对现在的算法进行优化。
这里给出一个有意思的链接,里面都是近年来SOTA级别的直线检测算法。
一、cv2.HoughLines
- 简介:这个API的理论依据介绍有很多,在这里我们暂时不关注这个部分,只给出代码,后续会尽量给出一些检测的效果。
- 流程:
- 代码:
def HoughLines_detect(image):img_gray = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)edges = cv2.Canny(img_gray, 0, 255, apertureSize=3)lines = cv2.HoughLines(edges, 1, np.pi/20, 40) for i in range(0, len(lines)):rho, theta = lines[i][0][0], lines[i][0][1]a = np.cos(theta)b = np.sin(theta)x0 = a*rhoy0 = b*rhox1 = int(x0 + 1000*(-b))y1 = int(y0 + 1000*(a))x2 = int(x0 - 1000*(-b))y2 = int(y0 - 1000*(a))cv2.line(img_gray,(x1,y1),(x2,y2),(0,0,255),2)cv2.namedWindow("img", flags=cv2.WINDOW_NORMAL)cv2.imshow("img", img_gray) cv2.waitKey(0)cv2.destroyAllWindows()
二、cv2.HoughLineP
- 简介:这个API的理论依据介绍有很多,在这里我们暂时不关注这个部分,只给出代码,后续会尽量给出一些检测的效果。
- 流程:
- 代码:
def HoughLinesP_detect(image):img_gray = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)edges = cv2.Canny(img_gray, 0, 255, apertureSize=3)lines = cv2.HoughLinesP(edges, 1, np.pi/180, 50)for x1, y1, x2, y2 in lines[0]:cv2.line(region, (x1, y1), (x2, y2), (0, 255, 0), 1)cv2.namedWindow("img", flags=cv2.WINDOW_NORMAL)cv2.imshow("img", img_gray)cv2.waitKey(0)cv2.destroyAllWindows()
三、LSD直线检测
- 简介:这个方法之前也在opencv的库中,但是因为版本更新逐渐被淘汰,事实上对于一些更简单的检测,这个方法反而有更好的效果,规避了很多需要调参的地方。这个博客上面所阐述的方法和调用的API现在已经不支持4.0以上的openCV了,现在需要pip新的包来实现LSD的使用。
- 配置:
- ①
pip install ocrd-fork-pylsd==0.0.3一定要指定这个版本! - ② 代码前添加
from pylsd.lsd import lsd
- ①
- 流程:
- 代码:
def LSD_detect(image):img_gray = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)lines = lsd(region)for i in range(lines.shape[0]):pt1 = (int(lines[i, 0]), int(lines[i, 1]))pt2 = (int(lines[i, 2]), int(lines[i, 3]))width = lines[i, 4]cv2.line(image, pt1, pt2, (0, 0, 255), int(np.ceil(width / 2)))cv2.imshow("LSD", image)cv2.waitKey(0)cv2.destroyAllWindows()
四、FLD直线检测
- 简介:这个方法之前也在opencv的库中,但是因为版本更新逐渐被淘汰,事实上对于一些更简单的检测,这个方法反而有更好的效果,规避了很多需要调参的地方。这个博客上面所阐述的方法和调用的API现在已经不支持4.0以上的openCV了,现在需要pip新的包来实现LSD的使用。
- 配置:
- ① 开始使用时你可能会遇到这个错误
AttributeError: module cv2.cv2 has no attribute ximgproc,按照这个方法进行安装, - 但是这两个包
opencv-contrib-python和opencv-python好像会有冲突,会出现这个问题QObject::moveToThread: Current thread (0x563cb9d45e40) is not the object's thread (0x563cba3259c0).Cannot move to target thread (0x563cb9d45e40),暂时还没有解决这个问题,先看下效果而已。
- ① 开始使用时你可能会遇到这个错误
- 流程:
- 代码:
def FLD_detect(image):img_gray = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)fld = cv2.ximgproc.createFastLineDetector()dlines = fld.detect(img_gray)for dline in dlines:x0 = int(round(dline[0][0]))y0 = int(round(dline[0][1]))x1 = int(round(dline[0][2]))y1 = int(round(dline[0][3]))cv2.line(image, (x0, y0), (x1, y1), (0, 255, 0), 1, cv2.LINE_AA)cv2.imshow("FLD", image)cv2.waitKey(0)cv2.destroyAllWindows()
五、EDLine直线检测
- 简介:这篇论文提出的一种方法,具体思想还没有研究,之前的博主给出的是C++的代码,看的有点蛋疼。这里有python的实现代码,里面仍然调用了
cv2.HoughLineP()这个函数,除此之外使用了新的边缘检测算法(ED),其他的trick还没有看。暂时先放在这里,测试完了补一下。
六、LSWMS直线检测
- 简介:暂时先给出python代码地址,总结完之后再进行测试。
七、CannyLines直线检测算法
八、MCMLSD直线检测算法
- 简介:这是CVPR 2017的论文
九、LSM直线检测算法
- 简介:能够将空间角度性质相近的直线合并为一条直线。
十、PPGNet直线检测算法
- 简介:这是CVPR 2019的论文,使用卷积神经网络来检测直线的算法。这是Python源码地址。这个是需要训练的。
十一、《Learning Attraction Field Representation for Robust Line Segment Detection》
- 简介:同样是CVPR 2019的论文,源码地址。
十二、《Semantic Line Detection and Its Applications》
- 简介:ICCV 2017的论文,可能能满足我用语义分割来实现直线检测的目的。
最后
其实相关的研究还多的很,关键在于怎么能拿捏他们的优缺点,在你的专业领域发挥最大的作用,在之后的更新中,我会逐渐po出测试效果和各个算法的优劣势总结。
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
