检测直线方法 python
霍夫直线检测
import cv2 as cv
import numpy as np
img = cv.imread('1.png')def line_detection(image):gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)# apertureSize做Canny时梯度窗口的大小edges = cv.Canny(gray, 50, 150, apertureSize=3)# 返回的是r和thetalines = cv.HoughLines(edges, 1, np.pi/180, 200)for line in lines:print(type(line))rho, theta = line[0]a = np.cos(theta)b = np.sin(theta)x0 = a*rhoy0 = b*rho# 乘以1000,是根据源码乘的,通过x1、x2、y1、y2画一条直线x1 = int(x0+1000*(-b))y1 = int(y0+1000*a)x2 = int(x0-1000*(-b))y2 = int(y0-1000*a)cv.line(image, (x1, y1), (x2, y2), (0, 0, 255), 2) # 2是所画直线长度的宽print(x1,y1,x2,y2)cv.imshow('image_lines', image)line_detection(img);
cv.waitKey(0)
cv.destroyAllWindows()
结论 : 效果不好,漏检很多,不适合精密场合
使用lsd算法检测直线
http://www.ipol.im/pub/art/2012/gjmr-lsd/
LSD的基本实现流程是计算出图像的梯度和场方向,然后对梯度进行排序,然后从大到小进行区域增长,之后对增长得到的区域求最小外接矩形,如果矩形不满足要求,则修改参数重新生长或者修改矩形的大小和位置,若仍旧不满足,则放弃该区域,该方法由于版权问题在opencv中被剔除,有兴趣可以自行找到该作者的主页去
使用fld算法
注意这个算法再contrib包中,先要安装,pip install opencv-contrib-python
## 使用ximgproc的createFastLineDetector
import cv2
import numpy as np### 读取输入图片
img0 = cv2.imread("1.png")
### 将彩色图片转换为灰度图片
img = cv2.cvtColor(img0,cv2.COLOR_BGR2GRAY)### 创建一个LSD对象
fld = cv2.ximgproc.createFastLineDetector()
### 执行检测结果
dlines = fld.detect(img)
### 绘制检测结果
color = 100
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]))color=color+30if color>225:color= 10cv2.line(img0, (x0, y0), (x1,y1), (color,color,color), 1, cv2.LINE_AA)print(x0,y0,x1,y1)
# 显示并保存结果
cv2.imwrite('res.jpg', img0)
cv2.imshow("LSD", img0)
cv2.waitKey(0)
cv2.destroyAllWindows()
结论,较好,但是要自行合并直线
EDlines算法原理
1 运行一个灰度图像,运行边缘检测、边缘绘制ED算法,产生像素相邻的链,称之为边缘。边缘线段直观地反应对象的边界。
2 利用直线度准则,即最小二乘直线拟合法,从生成的像素链中提取线段。
3 线的验证步骤定于亥姆霍兹原理Helmholtz principle ,用来消除虚假线段的检测。
edlines算法无论是速度和效果都是可以的,可以自行研究该算法,该算法研究完毕应该会得到很多东西。
halcon 带通滤波
如果有钱可以考虑halcon商业软件
read_image (Bk45, 'bk45')*带通滤波
bandpass_image (Bk45, Lines, 'lines')
threshold (Lines, Region, 128, 255)*计算划痕
skeleton (Region, Skeleton)
dev_set_colored (12)*生成轮廓
gen_contours_skeleton_xld (Skeleton, Contours, 5, 'filter')
dev_display (Bk45)
dev_display (Contours)
检测直线方法 python相关推荐
- python霍夫变换检测直线_OpenCV-Python教程(9、使用霍夫变换检测直线)
相比C++而言,Python适合做原型.本系列的文章介绍如何在Python中用OpenCV图形库,以及与C++调用相应OpenCV函数的不同之处.这篇文章介绍在Python中使用OpenCV的霍夫变换 ...
- python 检测直线 交点_Python+OpenCV图像处理——实现直线检测
简介: 1.霍夫变换(Hough Transform) 霍夫变换是图像处理中从图像中识别几何形状的基本方法之一,应用很广泛,也有很多改进算法.主要用来从图像中分离出具有某种相同特征的几何形状(如,直线 ...
- python 检测直线 交点_OpenCV-Python教程(9、使用霍夫变换检测直线)
相比C++而言,Python适合做原型.本系列的文章介绍如何在Python中用OpenCV图形库,以及与C++调用相应OpenCV函数的不同之处.这篇文章介绍在Python中使用OpenCV的霍夫变换 ...
- python稳健性检验_有哪些比较好的做异常值检测的方法?
最近很多小伙伴都比较关注异常值检测的方法,接下来小编就为大家介绍几种,希望能帮到大家!! 摘要: 本文介绍了异常值检测的常见四种方法,分别为Numeric Outlier.Z-Score.DBSCA以 ...
- python探测端口_Python实现端口检测的方法
一.背景: 在平时工作中有遇到端口检测,查看服务端特定端口是否对外开放,常用nmap,tcping,telnet等,同时也可以利用站长工具等web扫描端口等. 但是在使用站长工具发现: 每次只能输入一 ...
- OpenCV-Python教程(9)(10)(11): 使用霍夫变换检测直线 直方图均衡化 轮廓检测
OpenCV-Python教程(9.使用霍夫变换检测直线) 相比C++而言,Python适合做原型.本系列的文章介绍如何在Python中用OpenCV图形库,以及与C++调用相应OpenCV函数的不同 ...
- 火车轨道铁路轨道检测识别(附带Python源码+详细解析)
现在的网络上,铁轨检测的源码几乎没有,所以自己参照着一篇汽车车道线检测的方法,然后调节参数,实现了铁轨的轨道检测,但现在只能检测直线,弯曲的铁轨检测下一步会实现,实现之后会更新的,敬请期待. 弯轨检测 ...
- opencv 检测直线、线段、圆、矩形
转自:http://blog.csdn.net/byxdaz/archive/2009/12/01/4912136.aspx 检测直线:cvHoughLines,cvHoughLines2 检测圆:c ...
- Hough 检测直线
1.Hough变换 Hough变换是一种快速的形状匹配技术.经典的H ough变换适用于曲线形状可以用参数来描述.而曲线位置未知情况下的曲线检测.如下: 在笛卡儿坐标系中, 直线可以用斜截方程y = ...
最新文章
- 卓有成效的管理者应该借助哪些团队协作工具?
- ballgown包进行基因差异表达分析
- 个人工作总结10(第二阶段)
- C/Cpp / #define
- 前端学习(2053)vue之电商管理系统电商系统之使用pm2管理
- opengl多重纹理映射
- Linux***检测基础学习
- 怎样才能容易更换DB
- GPS、RTK、PPK三种定位技术的原理及应用
- 【历史上的今天】10 月 11 日:域名 baidu.com 问世;三星 Galaxy Note 7 爆炸门告一段落;图灵奖数据库先驱诞生
- word批量替换向下箭头为回车符号、批量删除空行、批量空格与空行
- 用vb调用bartender并打印
- 最优化理论与凸优化的用处
- Pod状态异常排查问题集-pending状态排查思路
- 从 RTL 到 GDS :基于 OpenLANE
- 《追寻生命的意义》--后记
- 从规范看海洋测绘单验潮站的控制距离
- 公关作用下的品牌建设
- python中布尔类型的值包括_Python 布尔值(Booleans)
- 详解网络爬虫:网络爬虫是干什么的?有哪些应用场景?