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转换字符串为摩尔斯电码的方法
Jul 06 Python
Python通过90行代码搭建一个音乐搜索工具
Jul 29 Python
python安装PIL模块时Unable to find vcvarsall.bat错误的解决方法
Sep 19 Python
python3 读写文件换行符的方法
Apr 09 Python
python实现字符串中字符分类及个数统计
Sep 28 Python
python处理两种分隔符的数据集方法
Dec 12 Python
Django自带日志 settings.py文件配置方法
Aug 30 Python
Python制作词云图代码实例
Sep 09 Python
python操作cfg配置文件方式
Dec 22 Python
Python 字节流,字符串,十六进制相互转换实例(binascii,bytes)
May 11 Python
django rest framework serializers序列化实例
May 13 Python
python中pyplot基础图标函数整理
Nov 10 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
晶体管单管来复再生式收音机
2021/03/02 无线电
PHP Parse Error: syntax error, unexpected $end 错误的解决办法
2012/06/05 PHP
php操作MongoDB类实例
2015/06/17 PHP
Yii中Model(模型)的创建及使用方法
2015/12/28 PHP
表单提交验证类
2006/07/14 Javascript
远离JS灾难css灾难之 js私有函数和css选择器作为容器
2011/12/11 Javascript
jquery实现转盘抽奖功能
2017/01/06 Javascript
通过vue-cli来学习修改Webpack多环境配置和发布问题
2017/12/22 Javascript
详解.vue文件中style标签的几个标识符
2018/07/17 Javascript
vue观察模式浅析
2018/09/25 Javascript
IE8中jQuery.load()加载页面不显示的原因
2018/11/15 jQuery
浅谈express.js框架中间件(middleware)
2019/04/07 Javascript
Vue.js中的组件系统
2019/05/30 Javascript
js get和post请求实现代码解析
2020/02/06 Javascript
node.js使用net模块创建服务器和客户端示例【基于TCP协议】
2020/02/14 Javascript
js+canvas实现纸牌游戏
2020/03/16 Javascript
vue+ElementUI 关闭对话框清空验证,清除form表单的操作
2020/08/06 Javascript
vue打包静态资源后显示空白及static文件路径报错的解决
2020/09/02 Javascript
nuxt引入组件和公共样式的操作
2020/11/05 Javascript
vue项目中使用rem,在入口文件添加内容操作
2020/11/11 Javascript
Python实现好友全头像的拼接实例(推荐)
2017/06/24 Python
python 用for循环实现1~n求和的实例
2019/02/01 Python
介绍一款python类型检查工具pyright(推荐)
2019/07/03 Python
Python变量作用域LEGB用法解析
2020/02/04 Python
Python日志syslog使用原理详解
2020/02/18 Python
python统计函数库scipy.stats的用法解析
2020/02/25 Python
Python实现自动装机功能案例分析
2020/10/22 Python
python文件路径操作方法总结
2020/12/21 Python
python利用appium实现手机APP自动化的示例
2021/01/26 Python
全球最大的户外用品零售商之一:The House
2018/06/12 全球购物
医学专业五年以上个人求职信
2013/12/03 职场文书
创新社会管理心得体会
2014/09/12 职场文书
初中生毕业评语
2014/12/29 职场文书
2015年银行工作总结范文
2015/04/01 职场文书
525心理健康活动总结
2015/05/08 职场文书
Go遍历struct,map,slice的实现
2021/06/13 Golang