十五、计算机视觉-sobel算子

文章目录

  • 前言
  • 一、sobel算子的概念
  • 二、sobel算子的计算方式
  • 三、具体实现


前言

上节课我们学习了梯度的知识,学习了如何去计算梯度,本节我们继续学习计算梯度的方法,本节我们学习使用Sobel算子计算梯度,这与上节课梯度计算方法有所不同,一般如果需要准确地计算图像的梯度信息,特别是对边缘信息感兴趣,通常会选择Sobel、Scharr或Laplacian算子。而如果更关注形态学特征或者想要一种简单快速的边缘检测方法,可以考虑使用cv2.morphologyEx。

一、sobel算子的概念

Sobel算子是一种用于图像边缘检测的经典算法。它基于一种称为梯度的数学概念,用于找到图像中灰度变化较大的地方,通常表现为图像中的边缘或轮廓。
Sobel算子通过在图像上应用两个3×3的卷积核(或称为模板)来计算图像的梯度,这两个卷积核分别用于检测图像中水平和垂直方向的变化。
这些卷积核的设计是为了捕捉图像中的灰度变化,使得在卷积过程中离边缘更近的像素权重更大,从而突出边缘特征。通过计算图像中每个像素点的水平和垂直方向的梯度,Sobel算子能够有效地检测图像中的边缘。

二、sobel算子的计算方式

上面提到sobel算子是通过一个3x3的卷积核来计算图像梯度,卷积核我们前面已经有过了解了。在这里卷积核是什么内容呢?
我们首先看下Sobel算子的计算公式:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
sobel算子包括两个3×3的卷积核,分别用于计算图像在水平和垂直方向上的梯度。
Gx是水平方向的梯度,Gy是垂直方向的梯度,最终2个值的绝对值相加就是最终的梯度结果。
这2个卷积核的内容如下:
在这里插入图片描述
我们来分析一下这个公式:卷积核内容为什么要这样设置,以及这个公式为什么这样计算,有什么底层的逻辑。
首先我们看下横向梯度的计算方式,假如卷积核覆盖的图像像素点如下:

在这里插入图片描述
那结合上面的横向卷积核的内容 他的计算公式为:(p3-p1)+(2p6-2p4)+(p9-p7).
而卷积核的内容实际上是代表的权重。比如离中心点越近权重越高。因为我们目的是进行边缘检测,而边缘通常指的是图像中灰度变化较大的地方,而像素值的变化通常发生在边缘附近。通过将离中心点最近的像素的权重设置为2或-2,可以加大边缘处灰度变化对卷积结果的影响,从而更好地突出边缘特征。如下图:(实际卷积核不是图示这么大 图只是为了方面演示查看)
和之前课程中讲到的卷积核一样,卷积核在图像上移动
在这里插入图片描述
当我么卷积核范围没有灰度变化时,通过公式计算就没有产生梯度,一旦当卷积核范围产生了灰度变化 比如
在这里插入图片描述
通过上面公式我们计算卷积核中心点位置 也就是图像p5的位置 就有值了。
当卷积核在移动到没有灰度变化的地方 就不会产生梯度
在这里插入图片描述
现在有个问题:当卷积核移动到图像右边边缘时

在这里插入图片描述
按照我们的计算公式,右边减左边,在这个位置右边减左边肯定是小于0了,默认opencv处理是小于0的就置为0 但是我们右边也有边缘置为0就是看不到边缘了,不符合我们的要求了,那怎么办呢。在回到上面的公式
在这里插入图片描述
这就是我们使用绝对值的原因。

纵向方向的梯度和横向方向的梯度原理都是一样的,只不过纵向方向的是下面的减去上面的
(p9-p3)+(2p8-2p2)+(p7-p1)。通过纵向计算同样得到一个边缘。2个边缘相加就是我们的最终结果。纵向这里就不在演示了。那有人可能问了,我们为什么要分别计算纵向和横向,既然纵向和横向都可以获取边缘信息,我们为何不只使用其中一种方式,或者2种方式同时使用,而不是单独计算在相加?
其实你自己实际测试一下就知道原因了,这种方式可以更好地捕捉图像中的边缘信息。虽然理论上可以设计一个3×3的卷积核同时计算水平和垂直方向的梯度,但在实践中,分别计算水平和垂直方向的梯度更为常见且更有效。分别计算水平和垂直方向的梯度可以提供更多的方向信息,使得边缘检测更加准确。例如,当图像中的边缘是斜向的时候,水平和垂直方向的梯度可以更好地捕捉到这种特征。

三、具体实现

import cv2# 读取图像
image = cv2.imread('yunfeng.jpg')# 转换为灰度图像
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 使用Sobel算子计算水平方向和垂直方向的梯度
grad_x = cv2.Sobel(gray_image, cv2.CV_64F, 1, 0, ksize=3)
grad_y = cv2.Sobel(gray_image, cv2.CV_64F, 0, 1, ksize=3)# 计算梯度的幅值
gradient_magnitude = cv2.magnitude(grad_x, grad_y)# 显示结果
cv2.imshow('Original', image)
cv2.imshow('sobel', cv2.convertScaleAbs(gradient_magnitude))cv2.waitKey(0)
cv2.destroyAllWindows()

其中cv2.Sobel是计算梯度信息,cv2.Sobel(gray_image, cv2.CV_64F, 1, 0, ksize=3)
第一个参数是输入的图片信息,
第二个参数是图像数据类型,Sobel算子的计算中,我们通常会使用CV_64F作为数据类型,以便在计算过程中保持足够的精度。64位浮点数格式可以处理更大范围的数值,以及更高的精度,有助于避免在计算过程中出现数值溢出或失真的情况
第三个参数是1代表计算横向的梯度
第四个参数是0代表不计算纵向的梯度
第五个参数是卷积核大小

cv2.magnitude就是我们上面提到的公式的实现方法
在这里插入图片描述
我们看下最终的结果
在这里插入图片描述
在这里插入图片描述


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

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

相关文章

jmeter发送请求参数如何使用变量

问题描述 发送jmeter请求时,想设置请求参数为变量 解决方法

190基于matlab的tfrSTFT时频分布图

基于matlab的tfrSTFT时频分布图,计算时间序列的STFT时频分布图,得到瞬时频率。通过GUI可以调节图像的展示样式。程序已调通,可直接运行。 190 STFT时频分布图 瞬时频率 能量谱 (xiaohongshu.com)

excel统计分析——一元直线回归

参考资料:生物统计学 两个具有因果关系的协变量如果呈直线关系,可以用直线回归模型来分析两个变量的关系。直线回归(linear regression)是回归分析中最简单的类型,建立直线回归方程并经检验证明两个变量存在直线回归关…

如何使用 templ 在 Go 中编写 HTML 用户界面?

简介 templ 是一个在 Go 中编写 HTML 用户界面的语言。使用 templ,我们可以创建可呈现 HTML 片段的组件,并将它们组合起来创建屏幕、页面、文档或应用程序。 安装 我们可以通过以下两种方式来安装 templ: go 安装 首先,我们需…

软件需求分析报告-word

第3章 技术要求 3.1 软件开发要求 第4章 项目建设内容 第5章 系统安全需求 5.1 物理设计安全 5.2 系统安全设计 5.3 网络安全设计 5.4 应用安全设计 5.5 对用户安全管理 5.6 其他信息安全措施 第6章 其他非功能需求 6.1 性能设计 6.2 稳定性设计 6.3 安全性设计 6.4 兼容性设计…

leetcode 热题 100_合并两个有序链表

题解一: 迭代:分别用两个指针遍历两段链表,逐步比较两链表的节点,将值较大的节点存入新链表,同时指针移动,直到某段链表遍历结束,将另一段链表剩余的节点存入新链表。需要注意存入新链表时要用新…

cad怎么转换成黑白的pdf图纸?分享3个常用的软件!

在工程设计、建筑、机械制造等领域,CAD图纸的应用非常广泛。然而,有时出于某些需要,我们可能需要将CAD图纸转换为黑白的PDF格式。那么,如何实现这一转换呢?本文将为您详细介绍几种常用的转换软件及其操作步骤。 迅捷CA…

Java代码审计安全篇-SSRF(服务端请求伪造)漏洞

前言: 堕落了三个月,现在因为被找实习而困扰,着实自己能力不足,从今天开始 每天沉淀一点点 ,准备秋招 加油 注意: 本文章参考qax的网络安全java代码审计,记录自己的学习过程,还希望各…

FPGA高端项目:FPGA基于GS2971+GS2972架构的SDI视频收发+图像缩放,提供3套工程源码和技术支持

目录 1、前言免责声明 2、相关方案推荐本博已有的 SDI 编解码方案本方案的SDI接收发送本方案的SDI接收纯verilog图像缩放纯verilog多路视频拼接应用本方案的SDI接收HLS图像缩放HLS多路视频拼接应用本方案的SDI接收OSD动态字符叠加输出应用本方案的SDI接收HLS多路视频融合叠加应…

相机模型Omnidirectional Camera(全方位摄像机)

1. 背景 大多数商用相机都可以描述为针孔相机,通过透视投影进行建模。然而,有些投影系统的几何结构无法使用传统针孔模型来描述,因为成像设备引入了非常高的失真。其中一些系统就是全方位摄像机。 有几种方法可以制作全向相机。屈光照相机(D…

Python in Visual Studio Code 2024年3月发布

排版:Alan Wang 我们很高兴地宣布 2024 年 3 月发布适用于 Visual Studio Code 的 Python 和 Jupyter 扩展! 此版本包括以下公告: 新的“Add Imports”代码操作设置调试 Django 或 Flask 应用时自动启动浏览器Python REPL 的 Shell 集成对本…

28 批量归一化【李沐动手学深度学习v2课程笔记】(备注:这一节讲的很迷惑,很乱)

目录 1.批量归一化 1.1训练神经网络时出现的挑战 1.2核心思想 1.3原理 2.批量规范化层 2.1 全连接层 2.2 卷积层 2.3 总结 3. 代码实现 4. 使用批量规范化层的LeNet 5. 简明实现 1.批量归一化 现在主流的卷积神经网络几乎都使用了批量归一化 批量归一化是一种流行且…

利用“定时执行专家”软件的25种任务与12种触发器,提升IT系统管理自动化水平

在IT系统管理中,自动化是提高工作效率、减少人为错误的关键。而《定时执行专家》这款软件,以其强大的功能、易用性和毫秒级的执行精度,成为了IT系统管理员的得力助手。今天,我们就来探讨一下如何利用这款软件的25种任务类型和12种…

Day37:安全开发-JavaEE应用JNDI注入RMI服务LDAP服务JDK绕过调用链类

目录 JNDI注入-RMI&LDAP服务 JNDI远程调用-JNDI-Injection JNDI远程调用-marshalsec JNDI-Injection & marshalsec 实现原理 JNDI注入-FastJson漏洞结合 JNDI注入-JDK高版本注入绕过 思维导图 Java知识点: 功能:数据库操作,文…

Fair Data Exchange:区块链实现的原子式公平数据交换

1. 引言 2024年斯坦福大学和a16z crypto research团队 论文 Atomic and Fair Data Exchange via Blockchain 中,概述了一种构建(包含过期EIP-4844 blobs的)fair data-markets的协议。该论文源自a16z crypto的暑期实习计划,与四名…

下载BenchmarkSQL并使用BenchmarkSQL查看OceanBase 的执行计划

下载BenchmarkSQL并使用BenchmarkSQL查看OceanBase 的执行计划 一、什么是BenchmarkSQL二、下载BenchmarkSQL三、使用BenchmarkSQL查看OceanBase 的执行计划 一、什么是BenchmarkSQL BenchmarkSQL是一个开源的数据库基准测试工具,可以用来评估数据库系统的性能&…

在没有推出硬盘的情况下,重启mac电脑,外接移动硬盘无法加载显示?

一、mac磁盘工具显示未装载 1.打开终端,输入 diskutil list查看当前硬盘列表,大多数时候,可以解决。 二、使用命令行装载硬盘 执行上面命令后,仍不起作用,则手动挂载,在命令行输入如下内容: …

pytorch激活函数

目录 1.激活函数由来2. 常见激活函数2.1 Sigmoid2.2 Tanh2.3 relu 1.激活函数由来 科学家对青蛙的神经元进行研究的时候发现,只有超过一定的阈值青蛙才会有反应,因此不能将多个输入做简单的加权平均,而需要一个阶梯函数也就是激活函数&#…

便携式能见度仪-关键能见度数据检测工具

TH-BN6随着科技的不断进步和应用领域的日益拓宽,便携式能见度仪已经成为众多行业,尤其是交通运输、环保监测和公共安全等领域的必备工具。这款设备以其便携性、准确性和高效性,在移动或狭窄的空间中实现了对能见度数据的精确测量。 一、便携式…

springboot2.x 分页查询实现(mybatis-plus+pagehelper)

基于mybatisplus使用pagehelper实现简单分页查询的功能。pagehelper仅需要把已有查询结果重新封装一下即可&#xff0c;不需要改变sql、mapper之类的。例如有xxxmaper.findall(xx)函数可以列出全部符合条件的数据。仅需要 PageHelper.startPage(pageNum, pageSize); List<E…