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 相关文章推荐
python使用urllib2模块获取gravatar头像实例
Dec 18 Python
Python采用socket模拟TCP通讯的实现方法
Nov 19 Python
用Python编写web API的教程
Apr 30 Python
python判断字符串是否是json格式方法分享
Nov 07 Python
python将秒数转化为时间格式的实例
Sep 16 Python
pycharm在调试python时执行其他语句的方法
Nov 29 Python
python匹配两个短语之间的字符实例
Dec 25 Python
通过python爬虫赚钱的方法
Jan 29 Python
Python Django框架防御CSRF攻击的方法分析
Oct 18 Python
Python udp网络程序实现发送、接收数据功能示例
Dec 09 Python
用python给csv里的数据排序的具体代码
Jul 17 Python
Python如何读写字节数据
Aug 05 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小型企业库存管理系统的设计与实现代码
2011/05/16 PHP
php生成xml时添加CDATA标签的方法
2014/10/17 PHP
ThinkPHP模版中导入CSS和JS文件的方法
2014/11/29 PHP
php实现在服务器端调整图片大小的方法
2015/06/16 PHP
php实现无限级分类(递归方法)
2015/08/06 PHP
PHP中header函数的用法及其注意事项详解
2016/06/13 PHP
PHP处理CSV表格文件的常用操作方法总结
2016/07/01 PHP
ThinkPHP中类的构造函数_construct()与_initialize()的区别详解
2017/03/13 PHP
PHP常用函数之获取汉字首字母功能示例
2019/10/21 PHP
jquery一句话全选/取消全选
2011/03/01 Javascript
js+html5实现canvas绘制圆形图案的方法
2015/06/05 Javascript
NodeJS实现阿里大鱼短信通知发送
2016/01/17 NodeJs
jquery easyUI中ajax异步校验用户名
2016/08/19 Javascript
AngularJS实现数据列表的增加、删除和上移下移等功能实例
2016/09/05 Javascript
BootStrap Table后台分页时前台删除最后一页所有数据refresh刷新后无数据问题
2016/12/28 Javascript
xmlplus组件设计系列之路由(ViewStack)(7)
2017/05/02 Javascript
深入理解AngularJs-scope的脏检查(一)
2017/06/19 Javascript
jquery select插件异步实时搜索实例代码
2017/10/20 jQuery
jQuery实现鼠标滑过商品小图片上显示对应大图片功能【测试可用】
2018/04/27 jQuery
如何在JavaScript中谨慎使用代码注释
2019/06/21 Javascript
Vue实现附件上传功能
2020/05/28 Javascript
vue data变量相互赋值后被实时同步的解决步骤
2020/08/05 Javascript
uni-app 自定义底部导航栏的实现
2020/12/11 Javascript
Python全排列操作实例分析
2018/07/24 Python
简单了解为什么python函数后有多个括号
2019/12/19 Python
Python如何读写二进制数组数据
2020/08/01 Python
Python根据URL地址下载文件并保存至对应目录的实现
2020/11/15 Python
如何在scrapy中集成selenium爬取网页的方法
2020/11/18 Python
介绍一下ICMP(Internet Control Message Protocol)Internet控制信息协议
2016/11/26 面试题
工程造价专业大专生求职信
2013/10/06 职场文书
便利店促销方案
2014/02/20 职场文书
县政府领导班子四风问题对照检查材料思想汇报
2014/09/26 职场文书
2014年自愿离婚协议书
2014/10/10 职场文书
2014年招商引资工作总结
2014/11/22 职场文书
2014年银行年终工作总结
2014/12/19 职场文书
同意报考公务员证明
2015/06/17 职场文书