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实现的登陆Discuz!论坛通用代码分享
Jul 11 Python
Python 多线程的实例详解
Sep 07 Python
PyCharm安装第三方库如Requests的图文教程
May 18 Python
python 文件转成16进制数组的实例
Jul 09 Python
python使用rpc框架gRPC的方法
Aug 24 Python
在Python中字典根据多项规则排序的方法
Jan 21 Python
使用Python OpenCV为CNN增加图像样本的实现
Jun 10 Python
在python里面运用多继承方法详解
Jul 01 Python
python交互模式下输入换行/输入多行命令的方法
Jul 02 Python
python中def是做什么的
Jun 10 Python
关于python3.7安装matplotlib始终无法成功的问题的解决
Jul 28 Python
利用python Pandas实现批量拆分Excel与合并Excel
May 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中函数的形参与实参的问题说明
2010/09/01 PHP
PHP在特殊字符前加斜杠的实现代码
2011/07/17 PHP
php 操作符与控制结构
2012/03/07 PHP
PHP中的多种加密技术及代码示例解析
2016/10/20 PHP
JScript中的"this"关键字使用方式补充材料
2007/03/08 Javascript
很全的显示阴历(农历)日期的js代码
2009/01/01 Javascript
csdn 博客的css样式 v3
2009/02/24 Javascript
Extjs 继承Ext.data.Store不起作用原因分析及解决
2013/04/15 Javascript
将nodejs打包工具整合到鼠标右键的方法
2013/05/11 NodeJs
获取当前点击按钮的id用this.id实现
2014/03/17 Javascript
浅谈EasyUI中编辑treegrid的方法
2015/03/01 Javascript
JavaScript DOM元素尺寸和位置
2015/04/13 Javascript
微信支付如何实现内置浏览器的H5页面支付
2015/09/25 Javascript
ztree获取选中节点时不能进入可视区域出现BUG如何解决
2015/12/03 Javascript
js模式化窗口问题![window.dialogArguments]
2016/10/30 Javascript
js 颜色选择插件
2017/01/23 Javascript
Jquery实现无缝向上循环滚动列表的特效
2019/02/13 jQuery
angularjs实现table表格td单元格单击变输入框/可编辑状态示例
2019/02/21 Javascript
利用Vue实现一个markdown编辑器实例代码
2019/05/19 Javascript
vuex存储复杂参数(如对象数组等)刷新数据丢失的解决方法
2019/11/05 Javascript
浅析Vue 中的 render 函数
2020/02/28 Javascript
如何管理Vue中的缓存页面
2021/02/06 Vue.js
python+selenium实现自动抢票功能实例代码
2018/11/23 Python
python3实现网络爬虫之BeautifulSoup使用详解
2018/12/19 Python
libreoffice python 操作word及excel文档的方法
2019/07/04 Python
Django中create和save方法的不同
2019/08/13 Python
Python线程障碍对象Barrier原理详解
2019/12/02 Python
Pytest测试框架基本使用方法详解
2020/11/25 Python
REN Clean Skincare官网:英国本土有机护肤品牌
2019/02/23 全球购物
荷兰游戏商店:Allyouplay
2019/03/16 全球购物
Sql面试题
2013/03/20 面试题
采购文员岗位职责
2013/11/20 职场文书
八项规定整改方案
2014/10/01 职场文书
国际残疾人日广播稿范文
2014/10/09 职场文书
兴趣班停课通知
2015/04/24 职场文书
详解Html5项目适配系统深色模式方案总结
2021/04/14 HTML / CSS