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

OpenCV-Python中的图像处理-霍夫变换

OpenCV-Python中的图像处理-霍夫变换

  • 霍夫变换
    • 霍夫直线变换
    • 霍夫圆环变换

霍夫变换

  • 霍夫(Hough)变换在检测各种形状的技术中非常流行,如果要检测的形状可以用数学表达式描述,就可以是使用霍夫变换检测它。即使要检测的形状存在一点破坏或者扭曲也是可以使用。

霍夫直线变换

  1. Hough直线变换,可以检测一张图像中的直线
  2. cv2.HoughLines(image, rho, theta, threshold)
    • return:返回值就是( ρ, θ)。 ρ 的单位是像素, θ 的单位是弧度。
    • image:是一个二值化图像,所以在进行霍夫变换之前要首先进行二值化,或者进行Canny 边缘检测。
    • rho:代表 ρ 的精确度。
    • theta:代表θ 的精确度。
    • threshold:阈值,只有累加其中的值高于阈值时才被认为是一条直线,也可以把它看成能检测到的直线的最短长度(以像素点为单位)。
  3. cv2.HoughLinesP(image: Mat, rho, theta, threshold, lines=…, minLineLength=…, maxLineGap=…)
    • return :返回值就是直线的起点和终点(x1,y1,x2,y2)。
    • rho:代表 ρ 的精确度。
    • theta:代表θ 的精确度。
    • threshold:阈值,只有累加其中的值高于阈值时才被认为是一条直线,也可以把它看成能检测到的直线的最短长度(以像素点为单位)。
    • minLineLength:直线的最短长度。比这个短的线都会被忽略。
    • maxLineGap- 两条线段之间的最大间隔,如果小于此值,这两条直线就被看成是一条直线。
  4. 一条直线可以用数学表达式 y = mx + c 或者 ρ = x cos θ + y sin θ 表示。ρ 是从原点到直线的垂直距离, θ 是直线的垂线与横轴顺时针方向的夹角(如果使用的坐标系不同,方向也可能不同,这里是按 OpenCV 使用的坐标系描述的)。如下图所示:
    在这里插入图片描述
import numpy as np
import cv2
from matplotlib import pyplot as pltimg = cv2.imread('./resource/opencv/image/sudoku.png', cv2.IMREAD_COLOR)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray, 50, 150, apertureSize=3)lines = cv2.HoughLines(edges, 1, np.pi/180, 200)for i in range(len(lines)):
# for rho, thetha in lines[10]:rho = lines[i][0][0]thetha = lines[i][0][1]a = np.cos(thetha)b = np.sin(thetha)x0 = a*rhoy0 = b*rholine_length = 1000 # 线长x1 = int(x0 + line_length*(-b))y1 = int(y0 + line_length*(a))x2 = int(x0 - line_length*(-b))y2 = int(y0 - line_length*(a))cv2.line(img, (x1, y1), (x2, y2), (0, 255, 0), 1)# 因为gray和edges都是单通道的,为了可以和原图拼接合并,需要merge成3通道图像数据
gray = cv2.merge((gray, gray, gray))
edges = cv2.merge((edges,edges,edges))# 图像拼接
res = np.hstack((gray,edges,img))cv2.imshow('res', res)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述
渐进概率式霍夫变换
cv2.HoughLinesP(image: Mat, rho, theta, threshold, lines=…, minLineLength=…, maxLineGap=…)

import numpy as np
import cv2
from matplotlib import pyplot as pltimg = cv2.imread('./resource/opencv/image/sudoku.png', cv2.IMREAD_COLOR)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
canny = cv2.Canny(gray, 50, 150, apertureSize=3)minLineLength = 100
maxLineGap = 10
# HoughLinesP(image: Mat, rho, theta, threshold, lines=..., minLineLength=..., maxLineGap=...) 
lines = cv2.HoughLinesP(canny, 1, np.pi/180, 100, minLineLength, maxLineGap)print(lines.shape)
print(lines[0])for i in range(len(lines)):for x1,y1,x2,y2 in lines[i]:cv2.line(img, (x1, y1), (x2, y2), (0, 255, 0), 1)gray = cv2.merge((gray, gray, gray))
canny = cv2.merge((canny,canny,canny))res = np.hstack((gray, canny, img))
cv2.imshow('res', res)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述
在含有坐标点集合中寻找是否存在直线:
cv2.HoughLinesPointSet(_point, lines_max, threshold, min_rho, max_rho, rho_step, min_theta, max_theta, theta_step, _lines=…)

  • _point:输入点的集合,必须是平面内的2D坐标,数据类型必须是CV_32FC2或CV_32SC2。
  • lines_max:检测直线的最大数目。
  • threshold:累加器的阈值,即参数空间中离散化后每个方格被通过的累计次数大于阈值时则被识别为直线,否则不被识别为直线。
  • min_rho:检测直线长度的最小距离,以像素为单位。
  • max_rho:检测直线长度的最大距离,以像素为单位。
  • rho_step::以像素为单位的距离分辨率,即距离 离散化时的单位长度。
  • min_theta:检测直线的最小角度值,以弧度为单位。
  • max_theta:检测直线的最大角度值,以弧度为单位。
  • theta_step:以弧度为单位的角度分辨率,即夹角 离散化时的单位角度。
  • _lines:在输入点集合中可能存在的直线,每一条直线都具有三个参数,分别是权重、直线距离坐标原点的距离 和坐标原点到直线的垂线与x轴的夹角 。

霍夫圆环变换

  1. 圆形的数学表达式为 (x − xcenter)2+(y − ycenter)2 = r2,其中( xcenter,ycenter)为圆心的坐标, r 为圆的直径。从这个等式中我们可以看出:一个圆环需要 3个参数来确定。所以进行圆环霍夫变换的累加器必须是 3 维的,这样的话效率就会很低。所以 OpenCV 用来一个比较巧妙的办法,霍夫梯度法,它可以使用边界的梯度信息。
  2. cv2.HoughCircles(image, method, dp, minDist, circles=…, param1=…, param2=…, minRadius=…, maxRadius=…)
    • return:存储检测到的圆的输出矢量。
    • image:输入图像,数据类型一般用Mat型即可,需要是8位单通道灰度图像
    • method:使用的检测方法,cv2.HOUGH_GRADIENT,cv2.HOUGH_GRADIENT_ALT。
    • dp:double类型的dp,用来检测圆心的累加器图像的分辨率于输入图像之比的倒数,且此参数允许创建一个比输入图像分辨率低的累加器。上述文字不好理解的话,来看例子吧。例如,如果dp= 1时,累加器和输入图像具有相同的分辨率。如果dp=2,累加器便有输入图像一半那么大的宽度和高度。
    • minDist:为霍夫变换检测到的圆的圆心之间的最小距离。
    • circles:可以忽略,存储检测到的圆的输出矢量。
    • param1:它是第三个参数method设置的检测方法的对应的参数。它表示传递给canny边缘检测算子的高阈值,而低阈值为高阈值的一半。
    • param2:也是第三个参数method设置的检测方法的对应的参数,它表示在检测阶段圆心的累加器阈值。它越小的话,就可以检测到更多根本不存在的圆,而它越大的话,能通过检测的圆就更加接近完美的圆形了。
    • minRadius:表示圆半径的最小值。
    • maxRadius:表示圆半径的最大值。
import numpy as np
import cv2img = cv2.imread('./resource/opencv/image/logo/opencv-logo2.png', cv2.IMREAD_GRAYSCALE)
img = cv2.medianBlur(img, 5)
cimg = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)circles = cv2.HoughCircles(img, cv2.HOUGH_GRADIENT, 1, 20, param1=50, param2=30, minRadius=30, maxRadius=0)print(circles)
circles = np.uint16(circles)
print(circles)for i in circles[0, :]:cv2.circle(cimg, (i[0], i[1]), i[2], (0, 255, 0), 2)cv2.circle(cimg, (i[0], i[1]), 2, (0, 0, 255), 3)cv2.imshow('detected circles', cimg)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

相关文章:

OpenCV-Python中的图像处理-霍夫变换

OpenCV-Python中的图像处理-霍夫变换 霍夫变换霍夫直线变换霍夫圆环变换 霍夫变换 霍夫(Hough)变换在检测各种形状的技术中非常流行,如果要检测的形状可以用数学表达式描述,就可以是使用霍夫变换检测它。即使要检测的形状存在一点破坏或者扭曲也是可以使…...

W5500-EVB-PICO做UDP Client进行数据回环测试(八)

前言 上一章我们用开发板作为UDP Server进行数据回环测试,本章我们让我们的开发板作为UDP Client进行数据回环测试。 连接方式 使开发板和我们的电脑处于同一网段: 开发板通过交叉线直连主机开发板和主机都接在路由器LAN口 测试工具 网路调试工具&a…...

npm install 中 --save 和 --save-dev 是什么?

npm,全名 Node Package Manager,套件管理工具,package.json 会记下你在项目中安装的所有套件。 假设在项目中安装 lodash npm i --save lodash这样在 dependencies 中会出现: 如果修改了导入方式: npm i --save-dev …...

【Nginx17】Nginx学习:目录索引、字符集与浏览器判断模块

Nginx学习:目录索引、字符集与浏览器判断模块 今天要学习的内容有几个还是大家比较常见的,所以学习起来也不会特别费劲。对于目录的默认页设置大家都不会陌生,字符集的设置也比较常见,而浏览器的判断这一块,可能有同学…...

CA/TA开发编程实战-视频课程

Hello大家好,上架一门新的视频课程,课程主要包含两大部分,第一部分搭建环境,第二部分从无到有的编写代码。带领大家"手把手"编写。 具体大纲如下: qemu v8环境搭建 搭建一个qemu_v8的环境,用于…...

(7)(7.1) 使用航点和事件规划任务

文章目录 前言 7.1.1 设置Home位置 7.1.2 视频:制作并保存多路点任务 7.1.3 视频:加载已保存的多航点任务 7.1.4 使用说明 7.1.5 提示 7.1.6 自动网格 7.1.7 任务指令 7.1.8 任务结束 7.1.9 任务重置 7.1.10 MIS_OPTIONS 7.1.11 任务再出发 …...

OCR相关模块——版面分析技术、表格文本识别

OCR相关模块——版面分析技术、表格文本识别 版面分析技术表格识别技术 版面分析技术 版面分析模型:飞桨用到了yolov2检测模型,对文档图片中的文本、表格、图片、标题与列表区域进行检测。当前主流是用分割做。 表格识别技术 参考博文...

mov转mp4格式怎么转?

mov转mp4格式怎么转?众所周知,MOV视频格式是由苹果公司推出的常用的视频格式,能够在苹果软件及设备上使用。但是,如果将其应用于其他软件和设备上的话,可能会遇到文件无法正常播放的情况。在这个时候,我们需…...

SSL握手协议相关概念

下图为握手协议的流程图,具体的解释参考博客: 【下】安全HTTPS-全面详解对称加密,非对称加密,数字签名,数字证书和HTTPS_tenfyguo的博客-CSDN博客 下面梳理一下SSL协议中的一些细节。首先是相关名词:证书、…...

idea 打开java项目后新建的模块中,java文件夹需要变成蓝色,以及resources文件夹变成三条杠的

idea 打开java项目后新建的模块中,java文件夹需要变成蓝色,以及resources文件夹变成三条杠的方法 再选择modules,找到需要变蓝的文件夹,点击sources即可 同理resources文件夹变成三条杠也只需要找到对应文件夹,点击re…...

【Docker】Docker network之bridge、host、none、container以及自定义网络的详细讲解

🚀欢迎来到本文🚀 🍉个人简介:陈童学哦,目前学习C/C、算法、Python、Java等方向,一个正在慢慢前行的普通人。 🏀系列专栏:陈童学的日记 💡其他专栏:CSTL&…...

滑模控制器理论推导和matlab/simulink实例分享

滑模控制的运动轨迹主要分为两个方面:(1)系统的任意初始状态向滑模面运动阶段;(2)系统到达滑模面后并且慢慢趋于稳定的阶段。所以,对于滑模变结构控制器的设计,对应于系统运动的两个阶段,可以分为两个部分:…...

git 操作

git切换ssh和http协议 切换协议: 查看当前remote git remote -v 切换到http: git remote set-url https://github.com/username/repository.git 切换到ssh: git remote set-url gitgithub.com:username/repository.git 某些文件不想提交…...

自建hexo博客并将原有的文章发布其上

1、保存粘贴到memo9中的博客文章,并将txt转换成word文档 varPowerShellPath, CommandLine: string; // , ScriptPath begin//save to txtMemo9.Lines.SaveToFile(test.txt);memo10.Lines.SaveToFile(txt2word.ps1);//save as docxPowerShellPath : powershell.exe…...

【双指针_和为 s 的两个数_C++】

和为s的两个数字 class Solution { public:vector<int> twoSum(vector<int>& nums, int target) {int n nums.size();int left 0;int right n-1;while(left<right){if(nums[left]nums[right]>target) right--;else if(nums[left]nums[right]<tar…...

HTML5的介绍和基本框架

目录 HTML5 HTML5介绍 HTML5的DOCTYPE声明 HTML5基本骨架 html标签 head标签 body标签 title标签 meta标签 在vscode中写出第一个小框架 HTML5 HTML5介绍 HTML5是用来描述网页的一种语言&#xff0c;被称为超文本标记语言。用HTML5编写的文件&#xff0c;后缀以.ht…...

代码随想录算法训练营第58天|动态规划part15|392.判断子序列、115.不同的子序列

代码随想录算法训练营第58天&#xff5c;动态规划part15&#xff5c;392.判断子序列、115.不同的子序列 392.判断子序列 392.判断子序列 思路&#xff1a; &#xff08;这道题也可以用双指针的思路来实现&#xff0c;时间复杂度也是O(n)&#xff09; 这道题应该算是编辑距…...

日常BUG——普通页面跳转tabbar页面报错

&#x1f61c;作 者&#xff1a;是江迪呀✒️本文关键词&#xff1a;日常BUG、BUG、问题分析☀️每日 一言 &#xff1a;存在错误说明你在进步&#xff01; 一、问题描述 微信小程序页面跳转的时候出现下面的问题&#xff1a; wx.redirectTo({url: /pages/index/i…...

SpringBoot复习:(48)RedisAutoConfiguration自动配置类

RedisAutoConfiguration类代码如下&#xff1a; 可以看到在这个类中配置了2个bean: redisTemplate和stringRedisTemplate. 而它通过EnableConfigurationProperties(RedisProperties.class)注解&#xff0c;把配置文件中配置的Redis相关的信息引入进来了&#xff0c;RedisPrope…...

软硬件免费,服务收费:网络安全商业模式正在被颠覆

大数据产业创新服务媒体 ——聚焦数据 改变商业 从元宇宙到造汽车&#xff0c;重回国内A股市场五年的360一路苦追热点。一直到大模型横空出世&#xff0c;360才算真正找到感觉&#xff0c;经历一次战略上的回归。 在8月9日的互联网安全大会上&#xff0c;一袭红衣的红衣教主周…...

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...

Leetcode 3576. Transform Array to All Equal Elements

Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接&#xff1a;3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到&#xf…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力

引言&#xff1a; 在人工智能快速发展的浪潮中&#xff0c;快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型&#xff08;LLM&#xff09;。该模型代表着该领域的重大突破&#xff0c;通过独特方式融合思考与非思考…...

Cinnamon修改面板小工具图标

Cinnamon开始菜单-CSDN博客 设置模块都是做好的&#xff0c;比GNOME简单得多&#xff01; 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...

ETLCloud可能遇到的问题有哪些?常见坑位解析

数据集成平台ETLCloud&#xff0c;主要用于支持数据的抽取&#xff08;Extract&#xff09;、转换&#xff08;Transform&#xff09;和加载&#xff08;Load&#xff09;过程。提供了一个简洁直观的界面&#xff0c;以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...

04-初识css

一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...

土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等

&#x1f50d; 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术&#xff0c;可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势&#xff0c;还能有效评价重大生态工程…...

Axios请求超时重发机制

Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式&#xff1a; 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用

1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...

Redis数据倾斜问题解决

Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中&#xff0c;部分节点存储的数据量或访问量远高于其他节点&#xff0c;导致这些节点负载过高&#xff0c;影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...