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

news2024/11/26 0:54:21

文章目录

  • 前言
  • 一、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.coloradmin.cn/o/1511843.html

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

相关文章

Java客户端调用elasticsearch进行深度分页查询 (search_after)

Java客户端调用elasticsearch进行深度分页查询 (search_after) 一. 代码二. 测试结果 前言 这是我在这个网站整理的笔记,有错误的地方请指出,关注我,接下来还会持续更新。 作者:神的孩子都在歌唱 具体的Search_after解…

科技回顾,飞凌嵌入式受邀亮相第八届瑞芯微开发者大会「RKDC2024」

2024年3月7日~8日,第八届瑞芯微开发者大会(RKDC2024)在福州举行,本届大会以“AI芯片AI应用AloT”为主题,邀请各行业的开发者共启数智化未来。 本届大会亮点颇多,不仅有13大芯片应用展示、9场产品和技术论坛…

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

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

面向对象【static关键字】

文章目录 Java中的static关键字1. 静态变量2. 静态方法的特点3. 静态块4. 静态导入5. 单例模式中的应用 Java中的static关键字 在Java中,static是一个关键字,用于定义类级别的成员,这些成员与类的实例无关。static成员属于类而不是类的实例&…

怎么查看电脑是不是固态硬盘?简单几个步骤判断

随着科技的发展,固态硬盘(Solid State Drive,简称SSD)已成为现代电脑的标配。相较于传统的机械硬盘,固态硬盘在读写速度、稳定性和耐用性等方面都有显著优势。但是,对于不熟悉电脑硬件的用户来说&#xff0…

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的水下目标检测系统(深度学习模型+UI界面+训练数据集)

摘要:本研究详述了一种采用深度学习技术的水下目标检测系统,该系统集成了最新的YOLOv8算法,并与YOLOv7、YOLOv6、YOLOv5等早期算法进行了性能评估对比。该系统能够在各种媒介——包括图像、视频文件、实时视频流及批量文件中——准确地识别水…

唯众物联网+地理科学交付云南师范大学地理学部教学实验室项目

近日,云南师范大学地理学部教学实验室建设项目顺利交付。该项目的成功落地,标志着物联网技术与地理科学教育的深度融合,为云南师范大学的地理教学提供了全新的教学平台与资源。该项目以物联网技术为核心,结合地理科学的特点&#…

新一代实时数据集成框架 Flink CDC 3.0 —— 核心技术架构解析

本文整理自阿里云开源大数据平台吕宴全关于新一代实时数据集成框架 Flink CDC 3.0 的核心技术架构解析,内容主要分为以下四部分: Flink CDC 演进历程 Flink CDC 3.0 的架构设计 Flink CDC 3.0 的核心实现 未来规划 一、Flink CDC 演进历程 Flink CD…

Web——HTML

一.HTML概述 超文本标记语言(英语:HyperText Markup Language,简称:HTML)是一种用于创建网页的标准标记语言。可以使用 HTML 来建立自己的 WEB 站点,HTML 运行在浏览器上,由浏览器来解析。 二.…

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

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

【Linux】yum及vim

目录 在Linux中安装软件(以centos7为例) Linux中的安装方式 安装的理解 什么是软件包? yum的一般使用流程 Linux开发工具 vi/vim 什么是vi/vim? vim的三大主要模式(实际上还有很多模式,此篇不做介绍…

一款好用的AI工具——边界AICHAT(三)

目录 3.23、文档生成PPT演示3.24、AI文档翻译3.25、AI翻译3.26、论文模式3.27、文章批改3.28、文章纠正3.29、写作助手3.30、文言文翻译3.31、日报周报月报生成器3.32、OCR-DOC办公文档识别3.33、AI真人语音合成3.34、录音音频总结3.35、域方模型市场3.36、模型创建3.37、社区交…

焦点调制网络

摘要 https://arxiv.org/pdf/2203.11926.pdf 我们提出了焦点调制网络(简称FocalNets),其中自注意力(SA)被焦点调制模块完全取代,用于在视觉中建模令牌交互。焦点调制包含三个组件:(…

使用html+css制作一个发光立方体特效

使用htmlcss制作一个发光立方体特效 <!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>Documen…

SpringController返回值和异常自动包装

今天遇到一个需求&#xff0c;在不改动原系统代码的情况下。将Controller的返回值和异常包装到一个统一的返回对象中去。 例如原系统的接口 public String myIp(ApiIgnore HttpServletRequest request);返回的只是一个IP字符串"0:0:0:0:0:0:0:1"&#xff0c;目前接口…

第五篇【传奇开心果系列】Python的自动化办公库技术点案例示例:深度解读Pandas在教育数据和研究数据处理领域的应用

传奇开心果博文系列 系列博文目录Python的自动化办公库技术点案例示例系列 博文目录前言一、Pandas 在教育和学术研究中的常见应用介绍二、数据清洗和预处理示例代码三、数据分析和统计示例代码四、数据可视化示例代码五、时间序列分析示例代码六、数据导入和导出示例代码七、数…

【数据挖掘】练习1:R入门

课后作业1&#xff1a;R入门 一&#xff1a;习题内容 1.要与R交互必须安装Rstudio&#xff0c;这种说法对不对&#xff1f; 不对。虽然RStudio是一个流行的R交互集成开发环境&#xff0c;但并不是与R交互的唯一方式。 与R交互可以采用以下几种方法&#xff1a; 使用R Conso…

Qt/C++音视频开发69-保存监控pcm音频数据到mp4文件/监控录像/录像存储和回放/264/265/aac/pcm等

一、前言 用ffmpeg做音视频保存到mp4文件&#xff0c;都会遇到一个问题&#xff0c;尤其是在视频监控行业&#xff0c;就是监控摄像头设置的音频是PCM/G711A/G711U&#xff0c;解码后对应的格式是pcm_s16be/pcm_alaw/pcm_mulaw&#xff0c;将这个原始的音频流保存到mp4文件是会…

【企业战略转型】某音响制造公司发展战略转型管理咨询项目纪实

案例&#xff1a;【客户评价】日本M汽车音响有限公司田总经理&#xff1a;受经济大环境的影响&#xff0c;我公司原有的依赖企业下订单的业务模式受到很大的影响&#xff0c;企业进入“不进则退”的重要转型阶段。当企业生存的关键因素&#xff0c;我们作为典型的OEM汽车音响代…

unity学习(57)——选择角色界面--删除角色2

1.客户端添加点击按钮所触发的事件&#xff0c;在selectMenu界面中增加myDelete函数&#xff0c;当点击“删除角色”按钮时触发该函数的内容。 public void myDelete() {string message nowPlayer.id;//string m Coding<StringDTO>.encode(message);NetWorkScript.get…