Python+OpenCV图像处理——实现直线检测


Posted in Python onOctober 23, 2020

简介:

1.霍夫变换(Hough Transform) 霍夫变换是图像处理中从图像中识别几何形状的基本方法之一,应用很广泛,也有很多改进算法。主要用来从图像中分离出具有某种相同特征的几何形状(如,直线,圆等)。最基本的霍夫变换是从黑白图像中检测直线(线段)。

2.Hough变换的原理是将特定图形上的点变换到一组参数空间上,根据参数空间点的累计结果找到一个极大值对应的解,那么这个解就对应着要寻找的几何形状的参数(比如说直线,那么就会得到直线的斜率k与常熟b,圆就会得到圆心与半径等等)

3.霍夫线变换是一种用来寻找直线的方法。用霍夫线变换之前, 首先需要对图像进行边缘检测的处理,也即霍夫线变换的直接输入只能是边缘二值图像。

4.霍夫直线检测的具体原理参见:

http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/tutorials/imgproc/imgtrans/hough_lines/hough_lines.html

代码如下:

#直线检测
#使用霍夫直线变换做直线检测,前提条件:边缘检测已经完成
import cv2 as cv
import numpy as np

#标准霍夫线变换
def line_detection(image):
 gray = cv.cvtColor(image, cv.COLOR_RGB2GRAY)
 edges = cv.Canny(gray, 50, 150, apertureSize=3) #apertureSize参数默认其实就是3
 cv.imshow("edges", edges)
 lines = cv.HoughLines(edges, 1, np.pi/180, 80)
 for line in lines:
 rho, theta = line[0] #line[0]存储的是点到直线的极径和极角,其中极角是弧度表示的。
 a = np.cos(theta) #theta是弧度
 b = np.sin(theta)
 x0 = a * rho #代表x = r * cos(theta)
 y0 = b * rho #代表y = r * sin(theta)
 x1 = int(x0 + 1000 * (-b)) #计算直线起点横坐标
 y1 = int(y0 + 1000 * a) #计算起始起点纵坐标
 x2 = int(x0 - 1000 * (-b)) #计算直线终点横坐标
 y2 = int(y0 - 1000 * a) #计算直线终点纵坐标 注:这里的数值1000给出了画出的线段长度范围大小,数值越小,画出的线段越短,数值越大,画出的线段越长
 cv.line(image, (x1, y1), (x2, y2), (0, 0, 255), 2) #点的坐标必须是元组,不能是列表。
 cv.imshow("image-lines", image)

#统计概率霍夫线变换
def line_detect_possible_demo(image):
 gray = cv.cvtColor(image, cv.COLOR_RGB2GRAY)
 edges = cv.Canny(gray, 50, 150, apertureSize=3) # apertureSize参数默认其实就是3
 lines = cv.HoughLinesP(edges, 1, np.pi / 180, 60, minLineLength=60, maxLineGap=5)
 for line in lines:
 x1, y1, x2, y2 = line[0]
 cv.line(image, (x1, y1), (x2, y2), (0, 0, 255), 2)
 cv.imshow("line_detect_possible_demo",image)

src = cv.imread('E:/imageload/louti.jpg')
print(src.shape)
cv.namedWindow('input_image', cv.WINDOW_AUTOSIZE) 
cv.imshow('input_image', src)
line_detection(src)
src = cv.imread('E:/imageload/louti.jpg') #调用上一个函数后,会把传入的src数组改变,所以调用下一个函数时,要重新读取图片
line_detect_possible_demo(src)
cv.waitKey(0)
cv.destroyAllWindows()

运行结果:

Python+OpenCV图像处理——实现直线检测

注意:

1.opencv的HoughLines函数是标准霍夫线变换函数,该函数的功能是通过一组参数对Python+OpenCV图像处理——实现直线检测的集合来表示检测到的直线,其函数原型为:HoughLines(image, rho, theta, threshold[, lines[, srn[, stn[, min_theta[, max_theta]]]]]) -> lines

image参数表示边缘检测的输出图像,该图像为单通道8位二进制图像。

rho参数表示参数极径Python+OpenCV图像处理——实现直线检测以像素值为单位的分辨率,这里一般使用1像素。

theta参数表示参数极角Python+OpenCV图像处理——实现直线检测以弧度为单位的分辨率,这里使用1度。

threshold参数表示检测一条直线所需最少的曲线交点。

lines参数表示储存着检测到的直线的参数对Python+OpenCV图像处理——实现直线检测的容器 。

srn参数、stn参数默认都为0。如果srn = 0且stn = 0,则使用经典的Hough变换。

min_theta参数表示对于标准和多尺度Hough变换,检查线条的最小角度。

max_theta参数表示对于标准和多尺度Hough变换,检查线条的最大角度。

2.opencv的HoughLinesP函数是统计概率霍夫线变换函数,该函数能输出检测到的直线的端点Python+OpenCV图像处理——实现直线检测,其函数原型为:HoughLinesP(image, rho, theta, threshold[, lines[, minLineLength[, maxLineGap]]]) -> lines

image参数表示边缘检测的输出图像,该图像为单通道8位二进制图像。

rho参数表示参数极径Python+OpenCV图像处理——实现直线检测以像素值为单位的分辨率,这里一般使用 1 像素。

theta参数表示参数极角Python+OpenCV图像处理——实现直线检测以弧度为单位的分辨率,这里使用 1度。

threshold参数表示检测一条直线所需最少的曲线交点。

lines参数表示储存着检测到的直线的参数对 Python+OpenCV图像处理——实现直线检测的容器,也就是线段两个端点的坐标。

minLineLength参数表示能组成一条直线的最少点的数量,点数量不足的直线将被抛弃。

maxLineGap参数表示能被认为在一条直线上的亮点的最大距离。

以上就是Python+OpenCV图像处理——实现直线检测的详细内容,更多关于python 直线检测的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Pipenv一键搭建python虚拟环境的方法
May 22 Python
详解Python 解压缩文件
Apr 09 Python
Django框架登录加上验证码校验实现验证功能示例
May 23 Python
Python+Selenium使用Page Object实现页面自动化测试
Jul 14 Python
利用Python自动化操作AutoCAD的实现
Apr 01 Python
浅谈keras中的batch_dot,dot方法和TensorFlow的matmul
Jun 18 Python
Django Admin 上传文件到七牛云的示例代码
Jun 20 Python
详解python 内存优化
Aug 17 Python
Pytorch1.5.1版本安装的方法步骤
Dec 31 Python
解决pytorch 保存模型遇到的问题
Mar 03 Python
Python如何配置环境变量详解
May 18 Python
常用的Python代码调试工具总结
Jun 23 Python
使用Python Tkinter实现剪刀石头布小游戏功能
Oct 23 #Python
Python 列表推导式需要注意的地方
Oct 23 #Python
python中的split、rsplit、splitlines用法说明
Oct 23 #Python
Python学习工具jupyter notebook安装及用法解析
Oct 23 #Python
浅析关于Keras的安装(pycharm)和初步理解
Oct 23 #Python
基于Python爬取京东双十一商品价格曲线
Oct 23 #Python
Python绘图实现台风路径可视化代码实例
Oct 23 #Python
You might like
php递归方法实现无限分类实例代码
2014/02/28 PHP
thinkphp框架实现删除和批量删除
2016/06/29 PHP
CentOS 7.2 下编译安装PHP7.0.10+MySQL5.7.14+Nginx1.10.1的方法详解(mini版本)
2016/09/01 PHP
thinkPHP自动验证、自动添加及表单错误问题分析
2016/10/17 PHP
xml 与javascript结合的问题解决方法
2007/03/24 Javascript
javascript hasFocus使用实例
2010/06/29 Javascript
JQuery获取各种宽度、高度(format函数)实例
2013/03/04 Javascript
js通过八个点 拖动改变div大小的实现方法
2014/03/05 Javascript
jQuery实现异步获取json数据的2种方式
2014/08/29 Javascript
JQuery中的事件及动画用法实例
2015/01/26 Javascript
使用iojs的jsdom库实现同步系统时间
2015/04/20 Javascript
js获取页面description的方法
2015/05/21 Javascript
每个程序员都需要学习 JavaScript 的7个理由小结
2016/09/03 Javascript
js放大镜放大购物图片效果
2017/01/18 Javascript
JavaScript中offsetWidth的bug及解决方法
2017/05/17 Javascript
JS字符串常用操作方法实例小结
2019/06/24 Javascript
150行Node.js实现的dns代理工具
2019/08/02 Javascript
Vue中的this.$options.data()和this.$data用法说明
2020/07/26 Javascript
python使用xmlrpclib模块实现对百度google的ping功能
2015/06/02 Python
日常整理python执行系统命令的常见方法(全)
2015/10/22 Python
python中快速进行多个字符替换的方法小结
2016/12/15 Python
Python的mysql数据库的更新如何实现
2017/07/31 Python
python爬虫获取淘宝天猫商品详细参数
2020/06/23 Python
python3.x实现发送邮件功能
2018/05/22 Python
Python实现查找字符串数组最长公共前缀示例
2019/03/27 Python
opencv 实现特定颜色线条提取与定位操作
2020/06/02 Python
英国评分最高的女性剃须刀订阅盒:FFS Beauty
2018/01/25 全球购物
网络通讯中,端口有什么含义,端口的取值范围
2012/11/23 面试题
好的自荐信的要求
2013/10/30 职场文书
特教教师先进事迹
2014/05/21 职场文书
2014红色之旅心得体会
2014/10/07 职场文书
前台岗位职责
2015/02/13 职场文书
大学生安全教育主题班会
2015/08/12 职场文书
2016年端午节寄语
2015/12/04 职场文书
社区结对共建协议书
2016/03/23 职场文书
Java界面编程实现界面跳转
2022/06/16 Java/Android