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使用gensim计算文档相似性
Apr 10 Python
Python Json序列化与反序列化的示例
Jan 31 Python
Python GUI编程完整示例
Apr 04 Python
pyqt5对用qt designer设计的窗体实现弹出子窗口的示例
Jun 19 Python
详解利用OpenCV提取图像中的矩形区域(PPT屏幕等)
Jul 01 Python
django中使用Celery 布式任务队列过程详解
Jul 29 Python
Python Des加密解密如何实现软件注册码机器码
Jan 08 Python
python re模块匹配贪婪和非贪婪模式详解
Feb 11 Python
用Python在Excel里画出蒙娜丽莎的方法示例
Apr 28 Python
PyQt5实现仿QQ贴边隐藏功能的实例代码
May 24 Python
python上下文管理器异常问题解决方法
Feb 07 Python
Python实现信息管理系统
Jun 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 一个页面执行时间类代码
2010/03/05 PHP
基于在生产环境中使用php性能测试工具xhprof的详解
2013/06/03 PHP
解析PHP的session过期设置
2013/06/29 PHP
去掉destoon资讯内容页keywords关键字自带的文章标题的方法
2014/08/21 PHP
ucenter中词语过滤原理分析
2016/07/13 PHP
php数组指针操作详解
2017/02/14 PHP
php swoole多进程/多线程用法示例【基于php7nts版】
2019/08/12 PHP
零基础php编程好学吗
2019/10/11 PHP
createElement与createDocumentFragment的点点区别小结
2011/12/19 Javascript
jquery简单实现鼠标经过导航条改变背景图
2013/12/17 Javascript
javascript实现的弹出层背景置灰-模拟(easyui dialog)
2013/12/27 Javascript
JQuery boxy插件在IE中边角图片不显示问题的解决
2015/05/20 Javascript
浅谈JavaScript中的作用域和闭包问题
2015/07/07 Javascript
JS实现仿QQ面板的手风琴效果折叠菜单代码
2015/09/11 Javascript
JavaScript判断按钮被点击的方法
2015/12/13 Javascript
详解Angular 4.x Injector
2017/05/04 Javascript
关于webpack代码拆分的解析
2017/07/20 Javascript
jQuery简单实现对数组去重及排序操作实例
2017/10/31 jQuery
JS常见DOM节点操作示例【创建 ,插入,删除,复制,查找】
2018/05/14 Javascript
Koa 中的错误处理解析
2019/04/09 Javascript
JS实现iframe中子父页面跨域通讯的方法分析
2020/03/10 Javascript
[45:44]完美世界DOTA2联赛PWL S2 FTD vs PXG 第一场 11.27
2020/12/01 DOTA
Python语法快速入门指南
2015/10/12 Python
Python开发SQLite3数据库相关操作详解【连接,查询,插入,更新,删除,关闭等】
2017/07/27 Python
Python中的CSV文件使用"with"语句的方式详解
2018/10/16 Python
python如何将两张图片生成为全景图片
2020/03/05 Python
浅谈numpy中np.array()与np.asarray的区别以及.tolist
2020/06/03 Python
基于Python爬虫采集天气网实时信息
2020/06/05 Python
css3实现可滑动跳转的分页插件示例
2014/05/08 HTML / CSS
行政总监岗位职责
2013/12/05 职场文书
党的群众路线教育实践活动个人承诺书
2014/05/22 职场文书
服装仓管员岗位职责
2014/06/17 职场文书
公司自我介绍演讲稿
2014/08/21 职场文书
婚前协议书范本
2014/10/27 职场文书
就业推荐表自我评价范文
2015/03/02 职场文书
centos8安装MongoDB的详细过程
2021/10/24 MongoDB