【Opencv+Yolo】Day2_图像处理

目录

一、图像梯度计算

图像梯度-sobal算子:

Scharr:权重变化更大(线条更加丰富,比Sobel更加细致捕捉更多梯度信息)

Laplacian算子:对噪音点敏感(可以和其他一起结合使用)

二、边缘检测:

Canny边缘检测:

​编辑

 三、图像金字塔:

高斯金字塔:

 拉普拉斯金字塔

四、图像轮廓: 

cv2.findContours(img, mode, method)


一、图像梯度计算

图像梯度-sobal算子:

为什么两边✖️2? ——因为我们关注的就是P5左右两边的梯度差,p6p4离得近,权重大

Gx右-左
Gy下-上

dst2 = cv2.Sobel(src,ddepth,dx,dy,ksize)

-ddepth:图像的深度

-dx和dy:水平竖直方向

-kszie:是Sobel算子的大小

-不建议dxdy直接设置1,1;分开计算求和效果好

pie= cv2.imread('pie.png')
#结果有正负,只关系差异,正负取绝对值,现在看水平的,显示有梯度的地方,边界部分
sobelx = cv2.Sobel(img,cv2.CV_64F,1,0,kszie=3)
cv_show(sobelx,'sobelx')
#白->黑是正数;黑->白是负数,所有负数截断为0,所以要取绝对值
sobelx = cv2.Sobel(img,cv2.CV_64F,1,0,kszie=3)
sobelx = cv2.convertScaleAbs(sobelx)
cv_show(sobelx,'sobelx')
sobely = cv2.Sobel(img,cv2.CV_64F,0,1,kszie=3)
sobely = cv2.convertScaleAbs(sobely)
cv_show(sobely,'sobely')
#xy求和
sobelxy = cv2.addWeighted(sobelx,0.5,sobely,0.5)
cv_show(sobelxy,'sobelxy')

Scharr:权重变化更大(线条更加丰富,比Sobel更加细致捕捉更多梯度信息)

scharrx = cv2.Scharr(img,cv2.CV_64F,1,0)
scharry = cv2.Scharr(img,cv2.CV_64F,0,1)
scharrx = cv2.convertScaleAbs(scharrx)
scharry = cv2.convertScaleAbs(scharry)
scharrxy = cv2.addWeighted(scharrx,0.5,scharry,0.5)

Laplacian算子:对噪音点敏感(可以和其他一起结合使用)

laplacian = cv2.Laplacian(img,cv2.CV_64F)
laplacian = cv2.convertScaleAbs(laplacian)

二、边缘检测:

Canny边缘检测:

1)使用高斯滤波器,以平滑图像,滤除噪声。(中间点比较大)

2)计算图像中每个像素点的梯度强度和方向。

3)应用非极大值抑制(NMSNon-Maximum Suppression),抑制以消除边缘检测带来的杂散响应。(体现最明显的)

A方法:c,g1,g2,g3,g4,想求两个交点梯度,用线性插值法用权重;如果C比两个交点梯度都大,才保留下来

B方法:

A与BC比较,A>BC,保存边界

4)应用双阈值(Double-Threshold)检测来确定真实的和潜在的边缘,只保留最真实的。

C与A边界连接,暂且保留;B不与边界连接,不保留

5)通过抑制孤立的弱边缘最终完成边缘检测

img = cv2.imread('lena.jpg',cv2.IMREAD_GRAYSCALE)
#参数是minmaxvalue
v1 = cv2.Canny(img,80,150)#比较大,边缘信息较小
v2 = cv2.Canny(img,50,100)#比较小,边缘信息更多,有可能有噪音
res = np.hstack((v1,v2))
cv_show(res,'res')


 三、图像金字塔:

高斯金字塔:

向下采样(缩小)(往塔尖)

向上采样(放大)(往塔底)

img = cv2.imread('AM.PNG')
cv_show(img,'img')
print(img.shape)
#放大
up = cv2.pyrUp(img)
cv_show(up,'up')
print(up.shape)
#变小
down = cv2.pyrDown(img)
cv_show(down,'down')
print(down.shape)

 拉普拉斯金字塔

#第一层
down = cv2.pyrDown(img)
down_up = cv2.pyrUp(down)
l=img-down_up
cv_show(l,'l')

四、图像轮廓: 

背景:之前的边缘可能包含一些线段,不能叫做轮廓,得是一个整体,才能是轮廓

cv2.findContours(img, mode, method)

mode: 轮廓检索模式

  • RETR_EXTERNAL:只检测最外层的轮廓;

  • RETR_LIST:检测所有轮廓,并将它们保存到同一层级中;

  • RETR_CCOMP:检测所有轮廓,并将它们组织为两层:顶层是外部边界,第二层是空洞边界;

  • RETR_TREE:检测所有轮廓,并建立一个完整的轮廓层级结构(树形层次)--常用

method: 轮廓逼近方法

  • CHAIN_APPROX_NONE:保留所有的轮廓点(不做压缩),输出完整多边形的顶点序列;

  • CHAIN_APPROX_SIMPLE:压缩水平、垂直和对角线方向上的冗余点,仅保留端点;(边缘简单化,进行压缩得到精简结果)

  1. 为了准确性,使用二值图像:
  2. 传入二值,检测轮廓
  3. 绘画轮廓
img = cv2.imread('img.png')
gary = cv2.cvtColor(img,cv2.COLOR_BGRGRAY)
#二值处理,小的是0白,大的255黑
ret,thresh = cv2.threshhold(gray,127,255,cv2.THRESH_BINARY)
cv_show(thresh,'thresh')
#检测函数,传入二值图像,检测所有轮廓
#第一个值,二值结果
#第二个值:轮廓信息
#第三个值:层级
binary,contours,hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)
#绘制轮廓,需要copy,不然会覆盖
draw_img = img.copy()
#第三个参数,轮廓画第几个,-1是所有
#倒数第二个参数BGR格式
#2:线条宽度
res = cv2.drawContours(draw_img,contours,-1,(0,0,255),2)
cv_show(res,'res')

轮廓特征

#需要先取出轮廓
cnt = contours[0]
#面积
cv2.contourArea(cnt)
#周长
cv2.arcLength(cnt,True)

轮廓近似:

img = cv2.imread('img.png')
gary = cv2.cvtColor(img,cv2.COLOR_BGRGRAY)
#二值处理,小的是0白,大的255黑
ret,thresh = cv2.threshhold(gray,127,255,cv2.THRESH_BINARY)
cv_show(thresh,'thresh')
binary,contours,hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)
cnt = contours[0]
draw_img = img.copy()
res = cv2.drawContours(draw_img,contours,-1,(0,0,255),2)
cv_show(res,'res')
#周长*0.1,值越小和轮廓越贴合,越大远离轮廓
epsilon = 0.1*cv2.arcLength(cnt,True)
#周长做阈值
approx = cv2.approxPolyDP(cnt,epsilon,True)
draw_img = img.copy()
res = cv2.drawContours(draw_img,contours,-1,(0,0,255),2)
cv_show(res,'res')

边界矩形:

img = cv2.imread('img.png')
gary = cv2.cvtColor(img,cv2.COLOR_BGRGRAY)
ret,thresh = cv2.threshhold(gray,127,255,cv2.THRESH_BINARY)
cv_show(thresh,'thresh')
binary,contours,hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)
cnt = contours[0]
x,y,w,h = cv2.boundingRect(cnt)
#外接矩形面积
rect_area = w*h
#轮廓与边界矩形面积比
extent = float(area)/rect_area

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/diannao/85105.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

STM32通过rt_hw_hard_fault_exception中的LR寄存器追溯程序问题​

1. 问题现象 程序运行导致rt_hw_hard_fault_exception 如图 显示错误相关代码 struct exception_stack_frame {uint32_t r0;uint32_t r1;uint32_t r2;uint32_t r3;uint32_t r12; uint32_t lr; // 链接寄存器 (LR)uint32_t pc; // 程序计数器 (PC)uint32_t psr; // 程序状态…

Mac安装配置InfluxDB,InfluxDB快速入门,Java集成InfluxDB

1. 与MySQL的比较 InfluxDBMySQL解释BucketDatabase数据库MeasurementTable表TagIndexed Column索引列FieldColumn普通列PointRow每行数据 2. 安装FluxDB brew update默认安装 2.x的版本 brew install influxdb查看influxdb版本 influxd version # InfluxDB 2.7.11 (git: …

【spring】spring中的retry重试机制; resilience4j熔断限流教程;springboot整合retry+resilience4j教程

在调用三方接口时,我们一般要考虑接口调用失败的处理,可以通过spring提供的retry来实现;如果重试几次都失败了,可能就要考虑降级补偿了; 有时我们也可能要考虑熔断,在微服务中可能会使用sentinel来做熔断&a…

(21)量子计算对密码学的影响

文章目录 2️⃣1️⃣ 量子计算对密码学的影响 🌌🔍 TL;DR🚀 量子计算:密码学的终结者?⚡ 量子计算的破坏力 🔐 Java密码学体系面临的量子威胁🔥 受影响最严重的Java安全组件 🛡️ 后…

经营分析会,财务该怎么做?

目录 一、业绩洞察:从「现象描述」到「因果分析」 1.分层拆解 2.关联验证 3.根因追溯 二、预算管理:从「刚性控制」到「动态平衡」 1.分类管控 2.滚动校准 3.价值评估 三、客户与市场:从「交易记录」到「价值评估」 1.价值分层 2.…

进阶智能体实战九、图文需求分析助手(ChatGpt多模态版)(帮你生成 模块划分+页面+表设计、状态机、工作流、ER模型)

🧠 基于 ChatGPT 多模态大模型的需求文档分析助手 本文将介绍如何利用 OpenAI 的 GPT-4o 多模态能力,构建一个智能的需求文档分析助手,自动提取功能模块、菜单设计、字段设计、状态机、流程图和 ER 模型等关键内容。 一、🔧 环境准备 在开始之前,请确保您已经完成了基础…

图书管理系统的设计与实现

湖南软件职业技术大学 本科毕业设计(论文) 设计(论文)题目 图书管理系统的设计与实现 学生姓名 学生学号 所在学院 专业班级 毕业设计(论文)真实性承诺及声明 学生对毕业设计(论文)真实性承诺 本人郑重声明:所提交的毕业设计(论文)作品是本人在指导教师的指导下,独…

直线模组在手术机器人中有哪些技术挑战?

手术机器人在现代医疗领域发挥着越来越重要的作用,直线模组作为其关键部件,对手术机器人的性能有着至关重要的影响。然而,在手术机器人中使用直线模组面临着诸多技术挑战,具体如下: 1、‌高精度要求‌:手术…

技术-工程-管用养修保-智能硬件-智能软件五维黄金序位模型

融智学工程技术体系:五维协同架构 基于邹晓辉教授的框架,工程技术体系重构为:技术-工程-管用养修保-智能硬件-智能软件五维黄金序位模型: math \mathbb{E}_{\text{技}} \underbrace{\prod_{\text{Dis}} \text{TechnoCore}}_{\…

InnoDB引擎逻辑存储结构及架构

简化理解版 想象 InnoDB 是一个高效运转的仓库: 核心内存区 (大脑 & 高速缓存 - 干活超快的地方) 缓冲池 Buffer Pool (最最核心!): 作用: 相当于仓库的“高频货架”。把最常用的数据(表数据、索引)从…

贫血模型与充血模型:架构设计的分水岭

在企业级应用的架构设计中,贫血模型和充血模型一直是架构师们争论的热点话题。两者背后分别代表着“事务脚本模式”和“领域模型模式”两种截然不同的设计思想。而理解这两者的差异,有助于开发者根据实际业务场景做出更合理的架构决策。 贫血模型&#…

Linux的调试器--gbd/cgbd

1.引入 #include <stdio.h> int Sum(int s, int e) {int result 0;for(int i s; i < e; i){result i;}return result; } int main() {int start 1;int end 100;printf("I will begin\n");int n Sum(start, end);printf("running done, result i…

PPIO × AstrBot:多平台接入聊天机器人,开启高效协同 | 教程

在消息平台接入专属聊天机器人&#xff0c;能快速生成精准答案&#xff0c;与项目管理、CRM等系统集成后&#xff0c;机器人还能根据任务进展自动建群、推送进度提醒&#xff0c;并精准相关人员&#xff0c;实现信息的高效传递。 AstrBot 是一个多平台聊天机器人及开发框架&…

HAProxy 可观测性最佳实践

HAProxy 简介 HAProxy&#xff08;High Availability Proxy&#xff09;是一款广泛使用的高性能负载均衡器&#xff0c;支持 TCP 和 HTTP 协议&#xff0c;提供高可用性、负载均衡和代理服务。它特别适用于负载较大的 Web 站点&#xff0c;能够支持数以万计的并发连接&#xf…

增强LangChain交互体验:消息历史(记忆)功能详解

背景 在构建聊天机器人时,将对话状态传入和传出链至关重要。 LangGraph 实现了内置的持久层,允许链状态自动持久化在内存或外部后端(如 SQLite、Postgres 或 Redis)中。在本文我们将演示如何通过将任意 LangChain runnables 包装在最小的 LangGraph 应用程序中来添加持久性…

EasyRTC音视频实时通话助力微信小程序:打造低延迟、高可靠的VoIP端到端呼叫解决方案

一、方案概述​ 在数字化通信浪潮下&#xff0c;端到端实时音视频能力成为刚需。依托庞大用户生态的微信小程序&#xff0c;是实现此类功能的优质载体。基于WebRTC的EasyRTC音视频SDK&#xff0c;为小程序VoIP呼叫提供轻量化解决方案&#xff0c;通过技术优化实现低延迟通信&a…

WebVm:无需安装,一款可以在浏览器运行的 Linux 来了

WebVM 是一款可以在浏览器中运行的Linux虚拟机。不是那种HTMLJavaScript模拟的UI&#xff0c;完全通过HTML5/WebAssembly技术实现客户端运行。通过集成CheerpX虚拟化引擎&#xff0c;可直接在浏览器中运行未经修改的Debian系统。 Stars 数13054Forks 数2398 主要特点 完整 Lin…

CesiumInstancedMesh 实例

CesiumInstancedMesh 实例 import * as Cesium from cesium;// Three.js 风格的 InstancedMesh 类, https://threejs.org/docs/#api/en/objects/InstancedMesh export class CesiumInstancedMesh {/*** Creates an instance of InstancedMesh.** param {Cesium.Geometry} geom…

创建型模式之Abstract Factory(抽象工厂)

创建型模式之Abstract Factory&#xff08;抽象工厂&#xff09; 摘要&#xff1a; 本文介绍了抽象工厂模式&#xff08;Abstract Factory&#xff09;&#xff0c;它是一种创建型设计模式&#xff0c;提供了一种创建一系列相关对象的接口而无需指定具体类。文章通过手机工厂示…

多卡训练核心技术详解

多卡训练核心技术详解 多卡训练 主要围绕分布式环境初始化、模型并行化、数据分片和梯度同步展开。下面结合您的代码,详细解释这些核心部分: 并行执行命令 torchrun --nproc_per_node=5 TokenLossMulCard.py 1. 分布式环境初始化 def init_distributed():init_process_…