当前位置: 首页 > news >正文

OpenCV-Python(25):Hough直线变换

目标

  • 理解霍夫变换的概念
  • 学习如何在一张图片中检测直线
  • 学习函数cv2.HoughLines()和cv2.HoughLinesP()

原理

        霍夫变换在检测各种形状的的技术中非常流行。如果你要检测的形状可以用数学表达式写出来,你就可以是使用霍夫变换检测它。即使检测的形状存在一点破坏或者扭曲也可以使用。我们下面就看看如何使用霍夫变换检测直线。

        一条直线可以用数学表达式y = mx + c 或者ρ = x cos θ + y sin θ 表示。ρ 是从原点到直线的垂直距离,θ 是直线的垂线与横轴顺时针方向的夹(如果你使用的坐标系不同方向也可能不同,我是按OpenCV 使用的坐标系描述的)。如下图所示:

        所以如果一条线在原点下方经过,ρ 的值就应该大于0度小于180。但是如果从原点上方经过的话,角度不是大于180也是小于180,但ρ 的值小于0。垂直的线角度为0 度,水平线的角度为90 度。 

        让我们来看看霍夫变换是如何工作的。每一条直线都可以用(ρ, θ) 表示。所以我们先创建一个2D 数组(累加器),初始化累加器,所有的值都为0。行表示ρ,列表示θ。这个数组的大小决定了最后结果的准确性。如果你希望角度精确到1 度,你就需要180 列。对于ρ,最大值为图片对角线的距离。所以如果精确度要到一个像素的级别,行数就应该与图像对角线的距离相等。

        想象一下我们有一个大小为100x100 的直线位于图像的中央。取直线上的第一个点,我们知道此处的(x,y)值。把x 和y 带入上面的方程组,然后遍历θ 的取值:0、1、2􈙽、3、. . .180。分别求出与其对应的ρ 的值,这样我们就得到一系列(ρ, θ)的数值对,如果这个数值对在累加器中也存在相应的位置对,就在这个位置上加1。所以现在累加器中的(50,90)=1。(一个点可能存在与多条直线中,所以对于直线上的每一个点可能是累加器中的多个值同时加1)。

        现在取直线上的第二个点。重复上面的过程。更新累加器中的值。现在累加器中(50,90)的值为2。你每次做的就是更新累加器中的值。对直线上的每个点都执行上面的操作,每次操作完成之后,累加器中的值就加1,但其他地方有时会加1, 有时不会。按照这种方式下去得到最后累加器中(50,90)的值肯定是最大的。如果你搜索累加器中的最大值,并找到其位置(50,90)就说明图像中有一条直线,这条直线到原点的距离为50,它的垂线与横轴的夹角为90 度。下面的动画很好的演示了这个过程。

这就是霍夫直线变换工作的方式。下图显示了一个累加器。其中最亮的两个点代表了图像中两条直线的参数 。

OpenCV中的霍夫变换 

        上面介绍的整个过程原理在OpenCV 中被封装成一个函数cv2.HoughLines()。函数是OpenCV中用于检测图像中直线的函数,它是基于霍夫变换的一种实现。

函数原型如下:

lines = cv2.HoughLines(image, rho, theta, threshold[, lines[, srn[, stn[, min_theta[, max_theta]]]]])

参数说明:

  • image:输入图像,通常为二值图像(边缘检测后的图像)。
  • rho:距离分辨率,表示以像素为单位的距离精度。
  • theta:角度分辨率,表示以弧度为单位的角度精度。
  • threshold:累加器阈值,表示直线被检测到所需的最小投票数,高于该值时才被认为是一条直线,也可以把它看成能检测到的直线的最短长度,以像素点为单位。
  • lines:可选参数,用于存储检测到的直线的输出数组。
  • srn:可选参数,表示距离rho的累加器的分割数。
  • stn:可选参数,表示角度theta的累加器的分割数。
  • min_theta:可选参数,表示直线角度的最小值。
  • max_theta:可选参数,表示直线角度的最大值。

函数返回值:

  • lines:检测到的直线的数组,每个直线由rho和theta表示

cv2.HoughLines()函数会在输入图像中应用霍夫变换来检测直线,然后返回检测到的直线的rho和theta值。这些直线可以通过在输入图像上进行绘制来可视化。

import cv2
import numpy as np# 加载图像
image = cv2.imread('image.jpg')
# 灰度转换
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 边缘检测
edges = cv2.Canny(gray, 50, 150, apertureSize=3)# 执行霍夫直线变换
lines = cv2.HoughLines(edges, 1, np.pi/180, 200)# 绘制检测到的直线
if lines is not None:for rho, theta in lines[0]:a = np.cos(theta)b = np.sin(theta)x0 = a * rhoy0 = b * rhox1 = int(x0 + 1000 * (-b))y1 = int(y0 + 1000 * (a))x2 = int(x0 - 1000 * (-b))y2 = int(y0 - 1000 * (a))cv2.line(image, (x1, y1), (x2, y2), (0, 255, 0), 2)# 显示结果
cv2.imshow('Hough Lines', image)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这个示例中,首先加载图像并将其转换为灰度图像。然后使用Canny边缘检测算法检测图像的边缘。接下来,使用cv2.HoughLines函数执行霍夫直线变换,并设置了一些参数,例如距离分辨率、角度分辨率和阈值。最后,根据检测到的直线参数绘制直线,并显示结果图像。

结果如下:

概率霍夫变换(Probabilistic Hough Transform) 

        从上面的检测过程我们可以发现:仅仅是一条直线都需要两个参数,这需要大量的计算。Probabilistic_Hough_Transform 是对霍夫变换的一种优化。它不会对每一个点都进行计算,而是从一幅图像中随机选取(是不是也可以使用图像金字塔呢,一个点集计算对于直线检测来说已经足够了。但是使用这种变换我们必须降低低阈值,因为总的点数变少了阈值值肯定也要小呀。下图是对两种方法的对比。

OpenCV 中使用的Matas, J. Galambos, C. 和Kittler, J.V. 提出的Progressive Probabilistic Hough Transform。这个函数是cv2.HoughLinesP()。函数原型如下:

lines = cv2.HoughLinesP(image, rho, theta, threshold[, lines[, minLineLength[, maxLineGap]]])

参数说明:

  • image:输入图像,通常为二值图像(边缘检测后的图像)。
  • rho:距离分辨率,表示以像素为单位的距离精度。
  • theta:角度分辨率,表示以弧度为单位的角度精度。
  • threshold:累加器阈值,表示直线被检测到所需的最小投票数。
  • lines:可选参数,用于存储检测到的直线的输出数组。
  • minLineLength:可选参数,表示直线的最小长度阈值,比这个短的都会忽略。
  • maxLineGap:可选参数,表示直线上的最大间隙,小于此值得看做是直线。

函数返回值:

  • lines:检测到的直线的数组,每个直线由起点和终点表示。

cv2.HoughLinesP()函数会在输入图像中应用霍夫变换来检测直线,然后返回检测到的直线的起点和终点坐标,这些直线可以通过在输入图像上进行绘制来可视化,而在前面的例子中,我们只得到了直线的参数,而且你必须找到所有的直线。而在这里一切变得很直接很简单。

import cv2
import numpy as npimg = cv2.imread('dave.jpg')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray,50,150,apertureSize = 3)minLineLength = 100
maxLineGap = 10lines = cv2.HoughLinesP(edges,1,np.pi/180,100,minLineLength,maxLineGap)for x1,y1,x2,y2 in lines[0]:cv2.line(img,(x1,y1),(x2,y2),(0,255,0),2)
cv2.imwrite('houghlines5.jpg',img)

结果如下:

相关文章:

OpenCV-Python(25):Hough直线变换

目标 理解霍夫变换的概念学习如何在一张图片中检测直线学习函数cv2.HoughLines()和cv2.HoughLinesP() 原理 霍夫变换在检测各种形状的的技术中非常流行。如果你要检测的形状可以用数学表达式写出来,你就可以是使用霍夫变换检测它。即使检测的形状存在一点破坏或者…...

python接口自动化(七)--状态码详解对照表(详解)

1.简介 我们为啥要了解状态码,从它的作用,就不言而喻了。如果不了解,我们就会像个无头苍蝇,横冲直撞。遇到问题也不知道从何处入手,就是想找别人帮忙,也不知道是找前端还是后端的工程师。 状态码的作用是&a…...

Android 实现动态申请各项权限

在Android应用中,如果需要使用一些敏感的权限(例如相机、位置等),需要经过用户的授权才能访问。在Android 6.0(API级别23)及以上的版本中,引入了动态权限申请机制。以下是在Android应用中实现动…...

【leetcode】力扣热门之合并两个有序列表【简单难度】

题目描述 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 用例 输入:l1 [1,2,4], l2 [1,3,4] 输出:[1,1,2,3,4,4] 输入:l1 [], l2 [] 输出:[] 输入:l1 []…...

安全与认证Week3 Tutorial+历年题补充

目录 1) 什么是重放攻击? 2)什么是Kerberos系统?它提供什么安全服务? 3)服务器验证客户端身份的一种简单方法是要求提供密码。在Kerberos中不使用这种身份验证,为什么?Kerberos如何对服务器和客户机进行身份验证? 4) Kerberos的四个要求是什么?Kerberos系…...

【Kotlin】协程

Kotlin协程 背景定义实践GlobalScope.launchrunBlocking业务实践 背景 在项目实践过程中,笔者发现很多异步或者耗时的操作,都使用了Kotlin中的协程,所以特地研究了一番。 定义 关于协程(Coroutine),其实…...

Scikit-Learn线性回归(五)

Scikit-Learn线性回归五:岭回归与Lasso回归 1、误差与模型复杂度2、范数与正则化2.1、范数2.2、正则化3、Scikit-Learn Ridge回归(岭回归)4、Scikit-Learn Lasso回归1、误差与模型复杂度 在第二篇文章 Scikit-Learn线性回归(二) 中,我们已经给出了过拟合与模型泛化的概念并…...

React(2): 使用 html2canvas 生成图片

使用 html2canvas 生成图片 需求 将所需的内容生成图片div 中包括 svg 等 前置准备 "react": "^18.2.0","react-dom": "^18.2.0","html2canvas": "^1.4.1",实现 <div ref{payRef}></div>const pa…...

CAN物理层协议介绍

目录 ​编辑 1. CAN协议简介 2. CAN物理层 3. 通讯节点 4. 差分信号 5. CAN协议中的差分信号 1. CAN协议简介 CAN是控制器局域网络(Controller Area Network)的简称,它是由研发和生产汽车电子产品著称的德国BOSCH公司开发的,并最终成为国际标准(ISO11519) &#xff0…...

华为OD机试真题-计算面积-2023年OD统一考试(C卷)

题目描述: 绘图机器的绘图笔初始位置在原点(0, 0),机器启动后其绘图笔按下面规则绘制直线: 1)尝试沿着横向坐标轴正向绘制直线,直到给定的终点值E。 2)期间可通过指令在纵坐标轴方向进行偏移,并同时绘制直线,偏移后按规则1 绘制直线;指令的格式为X offsetY,表示在横…...

设计模式之策略模式【行为型模式】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档> 学习的最大理由是想摆脱平庸&#xff0c;早一天就多一份人生的精彩&#xff1b;迟一天就多一天平庸的困扰。各位小伙伴&#xff0c;如果您&#xff1a; 想系统/深入学习某…...

git使用(完整流程)

1. 新建仓库 1.右击 git bash 后 输入 git init (仓库为:当前目录) git init name (仓库为:name文件夹) git clone https://github.com/Winnie996/calculate.git //https2.工作区域 工作目录 3. 添加 提交 git add . //工作区添加至暂存区 git commit -m "注释内容&q…...

九、HTML头部<head>

一、HTML头部<head> 1、<title>- 定义了HTML文档的标题 使用 <title> 标签定义HTML文档的标题 <!DOCTYPE html> <html><head><meta charset"utf-8"><title>我的 HTML 的第一页</title> </head><b…...

机器学习期末复习

机器学习 选择题名词解释&#xff1a;简答题计算题一、线性回归二、决策树三、贝叶斯 选择题 机器学习利用经验 &#xff0c;须对以下&#xff08;&#xff09;进行分析 A 天气 B 数据 C 生活 D 语言 归纳偏好值指机器学习算法在学习的过程中&#xff0c;对以下&#xff08;&a…...

python-日志模块以及实际使用设计

python-日志模块以及实际使用设计 1. 基本组成 日志模块四个组成部分&#xff1a; 日志对象&#xff1a;产生日志信息日志处理器&#xff1a;将日志信息输出到指定地方&#xff0c;例如终端、文件。格式器&#xff1a;在日志处理器输出之前&#xff0c;对信息进行各方面的美化…...

googlecode.log4jdbc慢sql日志,格式化sql

前言 无论使用原生JDBC、mybatis还是hibernate&#xff0c;使用log4j等日志框架可以看到生成的SQL&#xff0c;但是占位符和参数总是分开打印的&#xff0c;不便于分析&#xff0c;显示如下的效果: googlecode Log4jdbc 是一个开源 SQL 日志组件&#xff0c;它使用代理模式实…...

Linux程序、进程和计划任务

目录 一.程序和进程 1.程序的概念 2.进程的概念 3.线程的概念 4.单线程与多线程 5.进程的状态 二.查看进程信息相关命令&#xff1a; 1.ps&#xff1a;查看静态进程信息状态 2.top&#xff1a;查看动态进程排名信息 3.pgrep&#xff1a;查看指定进程 4.pstree&#…...

【MySQL】索引基础

文章目录 1. 索引介绍2. 创建索引 create index…on…2.1 explain2.2 创建索引create index … on…2.3 删除索引 drop index … on 表名 3. 查看索引 show indexes in …4. 前缀索引4.1 确定最佳前缀长度&#xff1a;索引的选择性 5. 全文索引5.1 创建全文索引 create fulltex…...

精确管理Python项目依赖:自动生成requirements.txt的智能方法

在Python中&#xff0c;可以使用几种方法来自动生成requirements.txt文件。这个文件通常用于列出项目所需的所有依赖包及其版本&#xff0c;使其他人或系统可以轻松地重现相同的环境。下面是几种常见的方法&#xff1a; 使用pip freeze&#xff1a; 这是最常见的方法。pip free…...

JavaWeb基础(1)- Html与JavaScript(JavaScript基础语法、变量、数据类型、运算符、函数、对象、事件监听、正则表达式)

JavaWeb基础&#xff08;1&#xff09;- Html与JavaScript(JavaScript基础语法、变量、数据类型、运算符、函数、对象、事件监听、正则表达式) 文章目录 JavaWeb基础&#xff08;1&#xff09;- Html与JavaScript(JavaScript基础语法、变量、数据类型、运算符、函数、对象、事件…...

java SSM体育器材租借管理系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 java SSM体育器材租借管理系统是一套完善的web设计系统&#xff08;系统采用SSM框架进行设计开发&#xff0c;springspringMVCmybatis&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要…...

西电期末1030.函数的最大值

一.题目 二.分析与思路 函数打擂台&#xff0c;注意数据类型和保留精度 三.代码实现 #include<bits/stdc.h>//万能头 double f(double x,double a){return a*x*x-x*x*x; }//f(x) int main() {double a;scanf("%lf",&a);double max-1000001;//打擂台for(…...

在Docker中安装Tomact

目录 前言&#xff1a; 一.安装Tomact 查找指定的tomact版本 下载tomact9.0 查看该镜像是否安装成功 安装成功之后就开始运行镜像了 ps&#xff08;用于列出正在运行的Docker容器&#xff09; ​编辑 测试(虚拟机ip:8080) ​编辑 解决措施 ​编辑 完成以上步骤&…...

【书生大模型00--开源体系介绍】

书生大模型开源体系介绍 0 通用人工智能1 InternLM性能及模型2 从模型到应用 大模型成为目前很热的关键词&#xff0c;最热门的研究方向&#xff0c;热门的应用&#xff1b;ChatGPT的横空出世所引爆&#xff0c;快速被人们上手应用到各领域&#xff1b; 0 通用人工智能 相信使…...

基于GPT-3、ChatGPT、GPT-4等Transformer架构的自然语言处理

文章目录 一、内容简介二、前言2.1 Transformer 模型标志着AI 新时代的开始2.2 Transformer 架构具有革命性和颠覆性2.3 Google BERT 和OpenAI GPT-3 等Transformer 模型将AI 提升到另一个层次2.4 本书将带给你的“芝士”2.5 本书面向的读者 三、本书内容简介3.1 第一章3.2 第二…...

一款开源的MES系统

随着工业4.0的快速发展&#xff0c;制造执行系统&#xff08;MES&#xff09;成为了智能制造的核心。今天&#xff0c;将为大家推荐一款开源的MES系统——iMES工厂管家。 什么是iMES工厂管家 iMES工厂管家是一款专为中小型制造企业打造的开源MES系统。它具备高度的可定制性和灵…...

https配置证书

HTTPS 基本原理 https 介绍 HTTPS&#xff08;全称&#xff1a;HyperText Transfer Protocol over Secure Socket Layer&#xff09;&#xff0c;其实 HTTPS 并不是一个新鲜协议&#xff0c;Google 很早就开始启用了&#xff0c;初衷是为了保证数据安全。 国内外的大型互联网…...

图神经网络|10.4 GCN 变换原理的解读

由9.3-邻接矩阵的变换可知&#xff0c;理解矩阵通过两个度矩阵的逆进行归一化。 微观上看&#xff0c; a i j a_{ij} aij​这个元素将会乘上 1 d e g ( v i ) d e g ( v j ) \frac{1}{\sqrt{deg_(v_i)\sqrt{deg(v_j)}}} deg(​vi​)deg(vj​) ​ ​1​ 其现实意义如下—— 比如…...

计算机组成原理 I/O方式

I/O 方式 I/O方式分类: 程序查询方式。由 CPU通过程序不断查询 /O 设备是否已做好准备&#xff0c;从而控制0 设备与主机交换信息程序中断方式。只在 I/0 设备准备就绪并向 CPU发出中断请求时才予以响应。DMA方式。主存和 I/O 设备之间有一条直接数据通路&#xff0c;当主存和…...

VMWare网络配置

1、通用配置 选择自动&#xff0c;相对与选择指定网卡&#xff0c;能解决网卡更换导致网络不可用的问题。 2、每个虚拟机配置...

做网站的要faq怎么给/seo资讯网

Tri:7W DC:130以下可以跑30fps Tri:13W DC:230可以跑18fps 内存&#xff1a;一般380M&#xff0c;人多时达430M 模型制作面数规范&#xff1a; 1.主角&#xff1a;1000-1300,贴图不超过1张512*512 2.武器&#xff1a;300,不超过1张256*256 3.boss:1000-1500&#xff0c…...

成都 网站建设培训学校/济南网站建设方案

在编码过程中&#xff0c;记录日志是非常重要的&#xff0c;工欲善其事必先利其器&#xff0c;说明的就是这个道理。此日志工具可以输出到控制台并且写到指定的路径&#xff0c;希望对大家有所帮助&#xff0c;下面是代码部分。 #!/user/bin/env python -- coding: utf-8 -- im…...

wordpress小工具导入/国外网站如何搭建网页

excel宏病毒&#xff0c;阻止用户打开excel文件&#xff0c;而且会自动感染其他的excel文档。它的明显表现就是&#xff1a;每次打开excel文档的时候都会先自动打开一个book1文档&#xff0c;然后提示你打开的excel文档有宏&#xff0c;所以要解决excel宏病毒&#xff0c;首先要…...

嘉定网站建设哪家好/超级优化大师下载

韭菜是大家生活中经常吃的一样蔬菜&#xff0c;韭菜营养丰富&#xff0c;韭菜中有很多对人体有好处的物质&#xff0c;但是韭菜虽然对人体有好处&#xff0c;经常吃韭菜也对人肠道有一定的影响&#xff0c;所以要适量食用。韭菜的味道比较浓烈&#xff0c;做菜吃或者做成各种各…...

建设工程交易中心网站收费标准/网络推广怎么做方案

原文 概要 在用OpenGL定义要绘制的形状之后&#xff0c;您可能需要绘制它们。使用OpenGL ES 2.0绘制图形需要的代码比您想象的要多一点&#xff0c;因为API提供了对图形渲染管道的大量控制。 本课介绍如何使用OpenGL ES 2.0 API绘制您在前一课中定义的形状。 初始化形状 在进行…...

帮别人做非法网站/媒体平台

matlab之基本绘图函数 clear&#xff1a;清空内存中的变量&#xff1b;figure:强制生成一个新的个绘图窗口&#xff1b;syms x y t :声明变量&#xff1b;fplot(函数表达式,绘图区间)&#xff1b;plot(横坐标向量&#xff0c;纵坐标向量&#xff0c;颜色/线形等参数)ezplot(函数…...