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 实时遍历日志文件
Apr 12 Python
python如何派生内置不可变类型并修改实例化行为
Mar 21 Python
Python对象属性自动更新操作示例
Jun 15 Python
python实现爬取图书封面
Jul 05 Python
win7+Python3.5下scrapy的安装方法
Jul 31 Python
OpenCV2从摄像头获取帧并写入视频文件的方法
Aug 03 Python
Python django框架应用中实现获取访问者ip地址示例
May 17 Python
如何安装2019Pycharm最新版本(详细教程)
Sep 26 Python
pyenv虚拟环境管理python多版本和软件库的方法
Dec 26 Python
python生成大写32位uuid代码
Mar 03 Python
浅析Python OpenCV三种滤镜效果
Apr 11 Python
Python万能模板案例之matplotlib绘制甘特图
Apr 13 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
2006/12/23 PHP
PHP 7.1新特性的汇总介绍
2016/12/16 PHP
php写入mysql中文乱码的实例解决方法
2019/09/17 PHP
元素的内联事件处理函数的特殊作用域在各浏览器中存在差异
2011/01/12 Javascript
框架页面高度自动刷新的Javascript脚本
2013/11/01 Javascript
Jquery在指定DIV加载HTML示例代码
2014/02/17 Javascript
node.js中的fs.closeSync方法使用说明
2014/12/17 Javascript
JavaScript模拟重力状态下抛物运动的方法
2015/03/03 Javascript
jQuery实现简单的文件上传进度条效果
2020/03/26 Javascript
浅谈JS函数节流防抖
2017/10/18 Javascript
解决微信浏览器缓存站点入口文件(IIS部署Vue项目)
2019/06/17 Javascript
微信小程序点击图片实现长按预览、保存、识别带参数二维码、转发等功能
2019/07/20 Javascript
node实现爬虫的几种简易方式
2019/08/22 Javascript
JS前端模块化原理与实现方法详解
2020/03/17 Javascript
Python和php通信乱码问题解决方法
2014/04/15 Python
Python 冒泡,选择,插入排序使用实例
2015/02/05 Python
python实现多线程行情抓取工具的方法
2018/02/28 Python
Python3.6基于正则实现的计算器示例【无优化简单注释版】
2018/06/14 Python
Django unittest 设置跳过某些case的方法
2018/12/26 Python
python 一个figure上显示多个图像的实例
2019/07/08 Python
Python Django 实现简单注册功能过程详解
2019/07/29 Python
python matplotlib中的subplot函数使用详解
2020/01/19 Python
Python timer定时器两种常用方法解析
2020/01/20 Python
Python对Tornado请求与响应的数据处理
2020/02/12 Python
keras实现theano和tensorflow训练的模型相互转换
2020/06/19 Python
详细分析Python可变对象和不可变对象
2020/07/09 Python
Python 通过爬虫实现GitHub网页的模拟登录的示例代码
2020/08/17 Python
简洁自适应404页面HTML好看的404源码
2020/12/16 HTML / CSS
李维斯法国官网:Levi’s法国
2019/07/13 全球购物
某IT外企面试题-二分法求方程!看看大家的C++功底
2015/07/04 面试题
会计系个人求职信范文分享
2013/12/20 职场文书
《歌唱二小放牛郎》教学反思
2014/04/19 职场文书
人力资源管理求职信
2014/08/07 职场文书
2015国庆节感想
2015/08/04 职场文书
如何用JavaScript检测当前浏览器是无头浏览器
2021/04/27 Javascript
Python 操作pdf pdfplumber读取PDF写入Exce
2022/08/14 Python