【 图像梯度处理,图像边缘检测】图像处理(OpenCv)-part6
13 图像梯度处理
13.1 图像梯度
边缘提取是图像处理中的一个重要任务,其目的是检测图像中灰度值发生显著变化的区域,这些区域通常对应于图像中的物体边界、纹理变化或深度变化等。边缘提取的原理可以分为以下几个关键步骤:
1. 边缘的定义和灰度变化
边缘可以定义为图像中灰度值发生显著变化的区域。这些变化通常是由于物体的边界、阴影、纹理或其他视觉特征引起的。边缘提取的目标是找到这些灰度变化的区域。
2. 梯度计算
边缘提取的核心是计算图像的梯度,梯度反映了灰度值的变化率。梯度通常使用梯度算子来计算,这些算子通过卷积操作与图像进行计算。
常见的梯度算子包括:
-
Sobel 算子:用于计算 x 和 y 方向的梯度,能够突出水平和垂直方向的边缘。
-
Prewitt 算子:类似于 Sobel 算子,但使用不同的权重。
-
Roberts 算子:用于计算对角线方向的梯度。
-
Scharr 算子:在某些情况下提供更精确的梯度计算结果。
13.2 垂直边缘提取
obel 算子 :Sobel 算子通过计算图像亮度的空间梯度来突出边缘,它使用两个 3x3 的卷积核,其中一个用于检测水平方向边缘(即垂直边缘),其卷积核为:
在进行卷积运算时,该算子在图像的每个 3×3 区域内,将卷积核的每个元素与对应位置的像素值相乘后求和,得到该区域在水平方向的梯度近似值,即垂直边缘的信息。例如,对于一个 3×3 的像素块,使用上述卷积核计算得到的梯度值若较大,则说明该区域存在垂直边缘。
Prewitt 算子 :Prewitt 算子也采用两个 3x3 的卷积模板来检测水平和垂直方向的边缘,其垂直边缘检测的卷积核为:
与 Sobel 算子类似,通过在图像上滑动该卷积核进行运算,可得到图像中垂直边缘的响应。Prewitt 算子对图像中的噪声具有一定的平滑作用,对灰度和噪声较多的图像处理效果较好。
Roberts 算子 :Roberts 算子是一种用于图像边缘检测的算子,其通过计算图像上相邻像素点之间的差异来检测边缘。用于检测垂直边缘的卷积核为:
该算子计算简单快速,但对噪声非常敏感,且产生的边缘响应较弱,除非边缘非常锐利。
Scharr 算子 :Scharr 算子在计算梯度时具有更好的旋转对称性,并且在计算垂直边缘时,其卷积核为:
相较于 Sobel 算子,Scharr 算子在某些情况下可以提供更精确的梯度计算结果,能够更准确地提取垂直边缘。
基于梯度计算后的处理
13.3 计算梯度幅值和方向
在使用上述算子计算出梯度分量后,通常需要计算梯度的幅值和方向,以确定边缘的位置和强度。梯度的幅值表示边缘的强度,方向表示边缘的方向。对于垂直边缘,其梯度方向近似为 0 度或 180 度。计算公式如下:
例如,当使用 Sobel 算子计算出 Gx 和 Gy 后,通过上述公式计算梯度幅值和方向,若某个像素点的梯度方向接近 0 度或 180 度,且梯度幅值较大,则可判断该点为垂直边缘点。
13.4 非极大值抑制
该步骤用于消除边缘检测中产生的伪边缘,保留真正的边缘。在确定梯度幅值和方向后,对于垂直边缘检测,将每个像素点与其在垂直方向上的两个邻点进行比较,若该像素点的梯度幅值不是这三个点中的最大值,则抑制该点的梯度幅值,将其设为 0,从而保留沿垂直方向的局部最大值,得到更精细的垂直边缘。
13.5 双阈值检测和边缘连接
通过设定两个阈值,如高阈值和低阈值,对梯度幅值进行筛选。大于高阈值的像素点被确定为边缘点,介于低阈值和高阈值之间的像素点则根据与确定边缘点的连接关系来判断是否为边缘点,小于低阈值的像素点则被排除。这一步骤有助于连接断断续续的边缘,形成完整的垂直边缘轮廓。
13.6 总结
边缘提取的原理主要包括以下几个步骤:
-
梯度计算:使用梯度算子计算图像的梯度。
-
梯度幅度和方向:计算梯度的幅度和方向,确定边缘的强度和方向。
-
非极大值抑制:保留沿边缘方向的局部最大值,消除伪边缘。
-
双阈值检测和边缘连接:通过设定两个阈值,筛选出真正的边缘点并连接形成完整的边缘轮廓。
这些步骤共同作用,实现了从图像中提取边缘的目标。通过这些方法,可以有效地检测出图像中的物体边界和其他重要特征。
13.7 代码
img = cv.imread('images/shudu.png')
kernel =np.array([[-1, 0, 1],[-2, 0, 2],[-1, 0, 1]],np.float32)
#垂直边缘提取
img1 = cv.filter2D(img, -1, kernel)
kernel2 = kernel.T
#水平边缘提取
img2 = cv.filter2D(img, -1, kernel2)
cv.imshow('1', img1)
cv.imshow('2', img2)
cv.waitKey(0)
cv.destroyAllWindows()
img2 = cv.filter2D(img, -1, kernel2)
函数用于对图像应用二维滤波操作
img
: 输入图像,这里是之前读取的图像数据。
-1
: 表示输出图像的深度与输入图像相同。在 OpenCV 中,-1
通常表示输出图像的深度与输入图像一致,这里输入图像是彩色图像(假设使用cv.imread
读取),因此输出图像的深度保持不变。
kernel2
: 卷积核,这是一个二维的浮点数数组,用于定义滤波器的权重。
举个直观粒子
import numpy as np
import cv2 as cvimg = np.array([[100, 102, 109, 110, 98, 20, 20, 18, 21],[110, 104, 105, 100, 104, 23, 20, 18, 20],[98, 100, 104, 104, 100, 17, 19, 22, 21],[110, 104, 105, 100, 104, 23, 20, 18, 20],[98, 100, 104, 104, 100, 17, 19, 22, 21],[100, 102, 109, 110, 98, 20, 19, 18, 21]
], dtype=np.float32)kernel =np.array([[-1, 0, 1],[-1, 0, 2],[-1, 0, 1]],np.float32)
img2 = cv.filter2D(img, -1, kernel)
print(img2)
输出
[[ 102. 108. 110. 85. -224. -226. 6. 22. 18.]
[ 104. 115. 108. 88. -231. -223. 16. 23. 18.]
[ 100. 100. 100. 94. -224. -230. 17. 23. 22.]
[ 104. 112. 104. 95. -228. -226. 23. 24. 18.]
[ 100. 114. 112. 84. -237. -225. 20. 25. 22.]
[ 102. 130. 126. 79. -244. -222. 26. 27. 18.]]
边缘检测的关键点
显著变化的值:边缘通常对应于绝对值较大的正数或负数,因为这些值表示灰度值的急剧变化。
正负变化的边界:边缘可能出现在正值和负值之间的过渡区域。
具体分析
在输出数组中,以下位置的值绝对值较大,可能是边缘的候选位置:
(0,4): -224
(0,5): -226
(1,4): -231
(1,5): -223
(2,4): -224
(2,5): -230
(3,4): -228
(3,5): -226
(4,4): -237
(4,5): -225
(5,4): -244
(5,5): -222
这些位置的值显著偏离周围的像素值,表明在这些区域灰度值发生了较大的变化,可能是垂直边缘所在的位置。
相关文章:
【 图像梯度处理,图像边缘检测】图像处理(OpenCv)-part6
13 图像梯度处理 13.1 图像梯度 边缘提取是图像处理中的一个重要任务,其目的是检测图像中灰度值发生显著变化的区域,这些区域通常对应于图像中的物体边界、纹理变化或深度变化等。边缘提取的原理可以分为以下几个关键步骤: 1. 边缘的定义和…...
一本通 2063:【例1.4】牛吃牧草 1005:地球人口承载力估计
Topic: Ideas: 为什么把这两道题放在一起呢?就是因为这两道题很类似,都是很简单的数学题,只要你会列出数学等式,你就学会这道题了! 下面把计算过程展示给大家 Code: //2025/04/18…...
下载HBuilder X,使用uniapp编写微信小程序
到官网下载HBuilder X 地址:HBuilderX-高效极客技巧 下载完成后解压 打开解压后的文件夹找到HBuilderX.exe 打开显示更多,发送到桌面快捷方式 到桌面上启动HBuilderX.exe启动应用 在工具点击插件安装 选择安装Vue3编译器 点击新建创建Vue3项目 编写项目…...
4.18---缓存相关问题(操作原子性,击穿,穿透,雪崩,redis优势)
为什么要用redis做一层缓存,相比直接查mysql有什么优势? 首先介绍Mysql自带缓存机制的问题: MySQL 的缓存机制存在一些限制和问题,它自身带的缓存功能Query Cache只能缓存完全相同的查询语句,对于稍有不同的查询语句,…...
前端:uniapp中uni.pageScrollTo方法与元素的overflow-y:auto之间的关联
在uniapp中,uni.pageScrollTo方法与元素的overflow-y:auto属性之间存在以下关联和差异: 一、功能定位差异 uni.pageScrollTo 属于页面级滚动控制,作用于整个页面容器34。要求页面内容高度必须超过屏幕高度,且由根元素下…...
获取不到AndroidManifest中的meta-data
现象描述 最近在项目中接入穿山甲广告的sdk,快速实现了核心功能验证。接下来就准备规范代码正式使用,却掉了一个坑,略做记录。 穿山甲sdk提供了一个appid的参数,不同渠道包是不同的,所以将其配入了gradle的productFl…...
Python学习之Matplotlib
Python学习之Matplotlib Matplotlib是一个Python的2D绘图库,它以各种硬拷贝格式和跨平台的交互式环境生成出版质量级别的图形.通过Matplotlib,开发者可以仅需要几行代码,便可以生成饼图,直方图,功率谱,条形图,错误图,散点图等 1.1 图形的基本构成 一个完整的图,包括figure,a…...
Motion Tracks:少样本模仿学习中人-机器人之间迁移的统一表征
25年1月来自Cornell和Stanford的论文“MOTION TRACKS: A Unified Representation for Human-Robot Transfer in Few-Shot Imitation Learning”。 教会机器人自主完成日常任务仍然是一项挑战。模仿学习 (IL) 是一种强大的方法,它通过演示向机器人灌输技能ÿ…...
【Spring Boot】MyBatis入门:连接Mysql数据库、测试单元、连接的常见错误
MyBatis入门 1.什么是MyBatis?2.准备工作2.1.创建项目2.2.MySQL数据准备2.3.创建对应的实体类 3.写配置文件和获取数据3.1写配置文件3.2 持久层代码 4.单元测试5.连接数据库时常见的错误5.1 url 配置错误5.2 MySQL账号密码错误5.3 找不到数据库5.4 表错误5.3 云服务…...
【AI插件开发】Notepad++ AI插件开发实践:支持配置界面
一、引用 此前的系列文章已基本完成了Notepad的AI插件的功能开发,但是此前使用的配置为JSON配置文件,不支持界面配置。 本章在此基础上集成支持配置界面,这样不需要手工修改配置文件,直接在界面上操作,方便快捷。 注…...
《Spring Boot 测试框架指南:@SpringBootTest与Mockito的最佳实践》
大家好呀!👋 今天我要和大家聊聊Spring Boot测试的那些事儿。作为一名Java开发者,写代码很重要,但写测试同样重要!💯 想象一下,你建了一座漂亮的房子🏠,但如果没有质量检…...
《数据结构初阶》【时间复杂度 + 空间复杂度】
《数据结构初阶》【时间复杂度 空间复杂度】 前言:-----------------------------------------1. 什么是数据结构?2. 什么是算法? -----------------------------------------算法的时间复杂度和空间复杂度1. 为什么要引入时间复杂度和空间复…...
【深度学习—李宏毅教程笔记】Self-attention
目录 一、Self-attention 的引入 1、多样化的输入形式 2、典型的下游任务下游任务 3、传统“全连接 窗口”方法的局限 4、Self‑Attention 的引入 二、Self-attention 的架构 1、Self-attention层的框图表示 2、Self-attention 层的矩阵运算过程 三、Multi-head Self…...
PHP腾讯云人脸核身获取Access Token
参考腾讯云官方文档: 人脸核身 获取 Access Token_腾讯云 public function getAccessToken(){$data [appId > , //WBappid,https://cloud.tencent.com/document/product/1007/49634secret > ,grant_type > client_credential, //授权类型version > 1…...
pytorch基本操作2
torch.clamp 主要用于对张量中的元素进行截断(clamping),将其限制在一个指定的区间范围内。 函数定义 torch.clamp(input, minNone, maxNone) → Tensor 参数说明 input 类型:Tensor 需要进行截断操作的输入张…...
Linux服务器配置Anaconda环境、Pytorch库(图文并茂的教程)
引言:为了方便后续新进组的 师弟/师妹 使用课题组的服务器,特此编文(ps:我导从教至今四年,还未招师妹) ✅ NLP 研 2 选手的学习笔记 笔者简介:Wang Linyong,NPU,2023级&a…...
idea 许可证过期
今天打开IDEA写代码突然提示:Your idea evaluation has expired. Your session will be limited to 30 minutes 评估已过期,您的会话将限制为 30 分钟。也就是说可以使用,但30min就会自动关闭 1 下载 ide-eval-resetter-2.1.6.zip https…...
Git常用命令分类汇总
Git常用命令分类汇总 一、基础操作 初始化仓库git init添加文件到暂存区git add file_name # 添加单个文件 git add . # 添加所有修改提交更改git commit -m "提交描述"查看仓库状态git status二、分支管理 创建/切换分支git branch branch_name …...
归并排序:数据排序的高效之道
🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/literature?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,…...
分布式训练(记录)
为什么要分布式训练? 单机训练有物理上限: 显存不够(大模型根本放不下) 单机计算慢(数据量一多就耗时太长) 多卡并行性不高 分布式训练的常见方式 Data Parallel(数据并行) 每个G…...
vue3中使用拖拽组件vuedragable@next
vue3中使用拖拽组件vuedragablenext 官网传送门 下载 npm install vuedraggablenext基本使用 <script setup> import draggable from vuedraggable import { ref } from vue const list ref([{ id:1,name:第一个 },{ id:2,name:第二个 },{ id:3,name:第三个 }, ]) <…...
Oracle、MySQL、PostgreSQL三大数据库对比分析
Oracle、MySQL、PostgreSQL 三大数据库的对比分析,结合 Java SpringBoot 项目开发 的实际场景,重点说明分库分表、主从复制的实现难度及案例。 一、数据库核心对比 1. 核心区别与适用场景 维度OracleMySQLPostgreSQL定位企业级商业数据库轻量级开源数据…...
java八股之并发编程
1.java线程和操作系统线程之间的区别? 现在java线程本质上是操作系统线程,java中采用的是一对一的线程模型(一个用户线程对应一个内核进程) 2.什么是进程和线程? 1.进程是操作系统一次执行,资源分配和调度的…...
Qt 入门 5 之其他窗口部件
Qt 入门 5 之其他窗口部件 本文介绍的窗口部件直接或间接继承自 QWidget 类详细介绍其他部件的功能与使用方法 1. QFrame 类 QFrame类是带有边框的部件的基类。它的子类包括最常用的标签部件QLabel另外还有 QLCDNumber、QSplitter,QStackedWidget,QToolBox 和 QAbstractScrol…...
Linux系统之----冯诺依曼结构
1.简要描述 冯诺依曼体系结构是现代计算机的基本设计思想,其核心理念是将计算机的硬件和软件统一为一个整体,通过存储程序的方式实现计算。冯诺依曼体系结构的核心思想是通过存储程序实现自动计算,其五大部件协同工作,奠定了现代…...
C++11新特性
目录 引入 C11新特性 统一的初始化列表 一切皆可{}初始化 std::initializer_list 统一的声明 auto decltype nullptr 范围for STL新增容器 STL新增容器接口 左值引用和右值引用 左值和右值 左值引用和右值引用 右值引用的优势(移动语义) 右值引用的使用场景 …...
492Q 型气缸盖双端面铣削组合铣床总体设计
一、引言 492Q 型气缸盖是发动机的重要组成部分,其双端面的加工精度对发动机的性能和可靠性有着重要影响。设计一款适用于 492Q 型气缸盖双端面铣削的组合铣床,能够提高加工效率和质量,满足发动机生产的需求。 二、总体设计要求 加工精度&…...
《软件设计师》复习笔记(4.2)——关系代数、函数依赖、范式
目录 一、关系代数 基本运算 笛卡尔积() 投影(π) 选择(σ) 自然连接(⋈) 真题示例: 二、函数依赖 基本概念 Armstrong公理系统 键与约束 三、范式ÿ…...
IO流(二)
一、字符流 使用字节流可以读取文件中的字节数据。但是如果文件中有中文使用字节流来读取,就有可能读到半个汉字的情况,这样会导致乱码。虽然使用读取全部字节的方法不会出现乱码,但是如果文件过大又不太合适。 所以Java专门为我们提供了另…...
#Linux动态大小裁剪以及包大小变大排查思路
1 动态库裁剪 库分为动态库和静态库,动态库是在程序运行时才加载,静态库是在编译时就加载到程序中。动态库的大小通常比静态库小,因为动态库只包含了程序需要的函数和数据,而静态库则包含了所有的函数和数据。静态库可以理解为引入…...
天梯赛数据结构合集
1.集合操作:PTA | 程序设计类实验辅助教学平台 主要是注意set的取交集操作,AC代码: #include<bits/stdc.h> using namespace std; int n,m,k; set<int> a[60]; int main(){cin>>n;for(int i1;i<n;i){cin>>m;for…...
pdfjs库使用记录1
import React, { useEffect, useState, useRef } from react; import * as pdfjsLib from pdfjs-dist; // 设置 worker 路径 pdfjsLib.GlobalWorkerOptions.workerSrc /pdf.worker.min.js; const PDFViewer ({ url }) > { const [pdf, setPdf] useState(null); const […...
LIMS引领综合质检中心数字化变革,赋能质量强国战略
在质量强国战略的深入推进下,我国综合质检机构迎来了前所未有的发展机遇,同时也面临着诸多严峻挑战。随着检测领域从传统的食品药品监督向环境监测、新材料检测等新兴领域不断拓展,跨领域协同管理的复杂度呈指数级增长。作为提升产品质量的关…...
MySQL+Redis实战教程:从Docker安装部署到自动化备份与数据恢复20250418
MySQLRedis实战教程:从Docker安装部署到自动化备份与数据恢复 一、前言 在企业应用中,对MySQL和Redis运维的要求越来越高: 不能仅是启动就算部署运行稳定、隔离、访问控制、备份恢复、安全可靠,才是 企业级的基本功能 本文将手…...
嵌入式音视频开发指南:从MPP框架到QT实战全解析
嵌入式音视频开发指南:从MPP框架到QT实战全解析 一、音视频技术全景概述 1.1 技术演进里程碑 2003-2010年:标清时代(H.264/AVC + RTMP)2011-2018年:高清时代(H.265/HEVC + WebRTC)2019-至今:智能时代(AV1 + AI编解码 + 低延迟传输)1.2 现代音视频技术栈 #mermaid-s…...
如何使用Python进行自动化的系统管理?
Python已经成为系统管理员最流行的编程语言之一,因为它简单、灵活,并且广泛支持各种系统管理任务。无论您是自动执行重复性任务,管理文件和目录,还是处理用户权限,Python都提供了一组强大的工具来简化您的工作流程。 …...
拆机装机,通电主板亮灯风扇不转无法开机解决办法
电源开机线 重启线 usb耳机模块 灯线 看来电源没问题 参考https://zhidao.baidu.com/question/83939532/answer/2321171868.html 买了个新主板过几天到看看会不会好...
IntelliSense 已完成初始化,但在尝试加载文档时出错
系列文章目录 文章目录 系列文章目录前言一、原因二、使用步骤 前言 IntelliSense 已完成初始化,但在尝试加载文档时出错 File path: E:\QtExercise\DigitalPlatform\DigitalPlatform\main\propertyWin.ui Frame GUID:96fe523d-6182-49f5-8992-3bea5f7e6ff6 Frame …...
SuperMap iClient3D for WebGL 如何加载WMTS服务
在 SuperMap iClient3D for WebGL 中加载WMTS服务时,参数配置很关键!下面我们详细介绍如何正确填写参数,确保影像服务完美加载。 一、数据制作 对于上述视频中的地图制作,此处不做讲述,如有需要可访问:Onl…...
[密码学实战]基于Python的国密算法与通用密码学工具箱
引言 在当今数字化浪潮中,信息安全已成为个人隐私保护与商业机密守护的核心议题。作为一位在密码学领域深耕多年的技术实践者,我深谙密码学工具在构建数字安全防线中的关键作用。正是基于这份认知与责任,我倾力打造了一款全方位、高性能的密…...
[密码学实战]详解gmssl库与第三方工具兼容性问题及解决方案
[密码学实战]详解gmssl库与第三方工具兼容性问题及解决方案 引言 国密算法(SM2/SM3/SM4)在金融、政务等领域广泛应用,但开发者在集成gmssl库实现SM2签名时,常遇到与第三方工具(如OpenSSL、国密网关)验证不…...
LIB-ZC, 一个跨平台(Linux)平台通用C/C++扩展库, stream 流操作
LIB-ZC, 一个跨平台(Linux)平台通用C/C扩展库, stream 流操作 lib-zc 封装了流操作命名空间 zcc基础类 stream(基类), iostream(io流封装) class stream 介绍 连接相关 // 都是虚函数, 为 iostream 等做准备virtual inline bool connect(const char *destination) { return …...
从零开始解剖Spring Boot启动流程:一个Java小白的奇幻冒险之旅
大家好呀!今天我们要一起探索一个神奇的话题——Spring Boot的启动流程。我知道很多小伙伴一听到"启动流程"四个字就开始头疼,别担心!我会用最通俗易懂的方式,带你从main()方法开始,一步步揭开Spring Boot的…...
概率多假设跟踪(PMHT):多目标跟踪中的概率软关联与高效跟踪算法解析
一、PMHT 的起源与核心定位 (一)背景 在多目标跟踪中,传统算法面临以下瓶颈: JPDA:单帧局部最优关联,无法处理跨帧长时间断联,且假设目标数固定(如雷达跟踪中预设目标数范围&…...
4.信号和槽|存在意义|信号和槽的连接方式|信号和槽断开|lambda表达式|信号和槽优缺点(C++)
信号和槽存在意义 所谓的信号槽,终究要解决的问题,就是响应用户的操作 信号槽,其实在GUI开发的各种框架中,是一个比较有特色的存在 其他的GUI开发框架,搞的方式都要更简洁一些~~ 网页开发 (js dom api) 网…...
电脑 BIOS 操作指南(Computer BIOS Operation Guide)
电脑 BIOS 操作指南 电脑的BIOS界面(应为“BIOS”)是一个固件界面,允许用户配置电脑的硬件设置。 进入BIOS后,你可以进行多种设置,具体包括: 1.启动配置 启动顺序:设置从哪个设备启动&#x…...
Scrapeless Scraping Browser: A high-concurrency automation solution for AI
介绍:升级无缝抓取浏览器的并发能力 作为 Scrapeless 的开发者和创始团队,我们对人工智能自动化的未来充满真诚的热情。我们的使命是创建一个真正为 AI 设计的自动化浏览器。在过去的几年中,从 Browserless.io 到众多云服务供应商推出的“浏…...
Java项目—— 拼图小游戏(进阶版)
项目需求 在拼图小游戏基础版的基础上,完成下列要求: 一、实现更换拼图图片功能 1,给美女,动物,运动菜单按钮添加单击事件(动作监听) 2,当我们点击了美女之后,就会从13…...
解析:深度优先搜索、广度优先搜索和回溯搜索
一、深度优先搜索(DFS) 1. 原理 思想:从起始节点出发,顺着一条路径不断深入,直到到达目标或无路可走,然后回溯到最近的分支点,继续探索其他分支。 应用场景:路径查找、连通性检测、…...
探索大语言模型(LLM):循环神经网络的深度解析与实战(RNN、LSTM 与 GRU)
一、循环神经网络(RNN) 1.1 基本原理 循环神经网络之所以得名,是因为它在处理序列数据时,隐藏层的节点之间存在循环连接。这意味着网络能够记住之前时间步的信息,并利用这些信息来处理当前的输入。 想象一下…...