一文讲解图像梯度

news2024/10/7 14:23:03

简介:

​         图像梯度计算的是图像变化的幅度。对于图像的边缘部分,其灰度值变化较大,梯度值变化也较大;相反,对于图像中比较平滑的部分,其灰度值变化较小,相应的梯度值变化也较小。一般情况下,图像梯度计算的是图像的边缘信息。它在图像处理和计算机视觉中具有重要的应用,常用于边缘检测、特征提取和图像增强等任务。

图像梯度概念:

图像梯度就是对图像的X轴,Y轴求其变化率,是一个二维的向量,分别表示X轴的变化和Y轴的变化:

其中:

  • X轴的变化是指当前像素右侧(X加1)的像素值减去当前像素左侧(X减1)的像素值。
  • Y轴的变化是当前像素下方(Y加1)的像素值减去当前像素上方(Y减1)的像素值。

 将计算出来的两个分量合并在一起,形成一个二维向量就得到了图像梯度。

推导:

首先我们先来看一下数学知识微积分的求导的过程:

\frac{df}{dx}=\lim_{\varepsilon \rightarrow 0}\frac{f\left ( x+\varepsilon \right )-f\left ( x \right )}{\varepsilon }

这里是对图像的一阶微分,但是图像时一个二维的向量,假设我们设该函数为f(x,y),我们看一下微积分中对两个未知数的微分,这里就是求偏导的内容

对x方向的求导:

\frac{\partial f\left ( x,y \right ) }{\partial x}=\lim_{\varepsilon \to 0}\frac{f\left ( x+\varepsilon ,y \right )-f\left ( x,y \right )}{\varepsilon }

对y方向的求导:

\frac{\partial f\left ( x,y \right ) }{\partial y}=\lim_{\varepsilon \to 0}\frac{f\left ( x ,y+\varepsilon \right )-f\left ( x,y \right )}{\varepsilon }

这里求导,高数的知识说\varepsilon这个值应该趋近于0,这样才能求的偏导,也就是\varepsilon无限小,但是对于图像来说\varepsilon取不到很小的值,图像中的像素离散的,最小的距离应为1。因此这里我们令\varepsilon等于1。那么上面的公式就变为:

\frac{\partial f(x,y)}{\partial x}=f(x+1,y)-f(x,y)

\frac{\partial f(x,y)}{\partial y}=f(x,y+1)-f(x,y)

这样我们就得到了图像的梯度公式,仔细观察我们可以看到图像梯度可以近似为相邻像素的差值。

上述两个公式对所有 x 和 y 的有关值可用下图的一维模板对 f(x,y) 的滤波得到。

用于计算梯度偏导数的滤波器模板,通常称之为梯度算子边缘算子边缘检测子等。

对于不同的滤波器模板得到的梯度是不同的,这也就衍生出很多算子,如Roberts、Prewitt、Sobel和Laplacian算子等。下面将详细介绍不同的算子。

梯度算子

梯度简单来说就是求导。OpenCV 提供了三种不同的梯度滤波器,或者说高通滤波器:Sobel Scharr 和Laplacian 。什么叫高通呢?其实就是和图像模糊相反。图像模糊是让低频通过,阻挡高频,这样就可以去除噪点,让锐利的边缘变平滑。高通滤波器就是让高频通过,阻挡低频,可以让边缘更加明显,增强图像。

Roberts 算子:

Roberts算子即交叉微分算子,是基于交叉差分的梯度算子。此算法通过局部差分来计算检测图像的边缘线条,对噪声敏感

Roberts交叉微分算子分别为主对角线和副对角线方向的算子,有两个2*2的滤波算子组成:

Prewitt 算子:

Prewitt算子是一种图像边缘检测的微分算子,其原理是利用特定区域内像素灰度值产生的差分实现边缘检测。由于Prewitt算子采用 33 模板对区域内的像素值进行计算,而Robert算子的模板为 22,故Prewitt算子的边缘检测结果在水平方向和垂直方向均比Robert算子更加明显。Prewitt算子适合用来识别噪声较多、灰度渐变的图像,其计算公式如下所示:

例如,下面给出Prewitt算子模板,在像素点P5处 x 和 y 方向上的梯度大小分别计算为:

Prewitt算子的边缘检测结果在水平方向和垂直方向均比Robert算子更加明显。

Sobel算子:

 Sobel算子,主要用作边缘检测,是离散差分算子,用来运算图像梯度函数的灰度近似值。Sobel算子具有一定的平滑作用,对噪声不敏感。在图像的任何一点使用此算子,将会产生对应的梯度矢量或者法矢量。其中Sobel算子x轴y轴卷积核如下:

如上图我们可以看到对P5这个点求x轴,y轴的梯度。以Gx为例,P5的x轴梯度公式是:

P5  = (P3-P1)+2(P6-P4)+(P9-P7)

 这里我们可以看到,由于P6和P4距离P5较近,对P5的影响较大,所以给予了一个较大的权重2,从差值中我们可以看到,P5右边的值减去P5左边的值,假设两边差值较大说明P5这个点位于边界,两边差值较小,说明P5在图像变化较为平缓区域。

下面我们使用python代码对其实现:

# coding:utf-8
import cv2
import numpy as np


# Scharr算子实现梯度计算
def Scharr_demo(image):
    # x 方向梯度
    image_grad_x = cv2.Sobel(image, cv2.CV_32F, 1, 0)
    # y 方向梯度
    image_grad_y = cv2.Sobel(image, cv2.CV_32F, 0, 1)
    # 分别求绝对值并转化为8位的图像上,这样做方便显示
    image_gradx = cv2.convertScaleAbs(image_grad_x)
    image_grady = cv2.convertScaleAbs(image_grad_y)
    # 显示两个方向图像
    cv2.imshow("image_gradient-x", image_gradx)
    cv2.imshow("image_gradient-y", image_grady)

    # 两个方向梯度的叠加,权重各自一半
    image_gradxy = cv2.addWeighted(image_gradx, 0.5, image_grady, 0.5, 0)
    cv2.imshow("image_gradient", image_gradxy)


if __name__ == '__main__':
    image = cv2.imread("a.jpg")
    cv2.imshow("src_image", image)
    Scharr_demo(image)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

这里我们使用第一张图进行求图像梯度结果图如下:

Scharr算子:

​ 在离散的空间上,有很多方法可以用来计算近似导数,在使用3×3的Sobel算子时,可能计算结果并不太精准。下面我们介绍Scharr算子,该算子具有和Sobel算子同样的速度,且精度更高。可以将Scharr算子看作对Sobel算子的改进,其核通常为:

梯度的计算方法与Sobel算子一样,下面我们使用Python对其进行实现:

#coding:utf-8
import cv2 
import numpy as np
 
 
# Scharr算子实现梯度计算
def Scharr_demo(image):
    # x 方向梯度
    image_grad_x = cv2.Scharr(image, cv2.CV_32F, 1, 0)
    # y 方向梯度
    image_grad_y = cv2.Scharr(image, cv2.CV_32F, 0, 1)
    # 分别求绝对值并转化为8位的图像上,这样做方便显示
    image_gradx = cv2.convertScaleAbs(image_grad_x) 
    image_grady = cv2.convertScaleAbs(image_grad_y)
    # 显示两个方向图像
    cv2.imshow("image_gradient-x", image_gradx)
    cv2.imshow("image_gradient-y", image_grady)
 
 
    #两个方向梯度的叠加,权重各自一半
    image_gradxy = cv2.addWeighted(image_gradx, 0.5, image_grady, 0.5, 0)
    cv2.imshow("image_gradient", image_gradxy)
 
 
 
 
 
 
if __name__ == '__main__':
    image = cv2.imread("./test01.jpg")
    cv2.imshow("src_image", image)
    Scharr_demo(image)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
 
 

这里我们依旧使用第一张图进行求图像梯度结果图如下:

Sobel算子与Scharr算子比较:

Sobel算子的缺点是,当其核结构较小时,精确度不高,而Scharr算子具有更高的精度。

下面我们对两个算子对图像处理的结果进行展示:

这里第一张为原始图像,第二张是通过Sobel求图像梯度,第三张是通过Scharr算子求图像梯度。

 Laplacian 算子: 

Laplacian(拉普拉斯)算子是一种二阶导数算子,其具有旋转不变性,可以满足不同方向的图像边缘锐化(边缘检测)的要求。通常情况下,其算子的系数之和需要为零。例如,一个
3×3 大小的 Laplacian 算子如图 所示。

Laplacian 算子类似二阶 Sobel 导数,需要计算两个方向的梯度值。

为了更适合于数字图像处理,将该方程表示为离散形式:

另外,拉普拉斯算子还可以表示成模板的形式,以便更好编程需要。如下图所示。

图(a)表示离散拉普拉斯算子的模板,图(b)表示其扩展模板,图(c)则分别表示其他两种拉普拉斯的实现模板。从模板形式容易看出,如果在图像中一个较暗的区域中出现了一个亮点,那么用拉普拉斯运算就会使这个亮点变得更亮。因为图像中的边缘就是那些灰度发生跳变的区域,所以拉普拉斯锐化模板在边缘检测中很有用。一般增强技术对于陡峭的边缘和缓慢变化的边缘很难确定其边缘线的位置。但此算子却可用二次微分正峰和负峰之间的过零点来确定,对孤立点或端点更为敏感,因此特别适用于以突出图像中的孤立点、孤立线或线端点为目的的场合。同梯度算子一样,拉普拉斯算子也会增强图像中的噪声,有时用拉普拉斯算子进行边缘检测时,可将图像先进行平滑处理。

图像锐化处理的作用是使灰度反差增强,从而使模糊图像变得更加清晰。图像模糊的实质就是图像受到平均运算或积分运算,因此可以对图像进行逆运算,如微分运算能够突出图像细节,使图像变得更为清晰。由于拉普拉斯是一种微分算子,它的应用可增强图像中灰度突变的区域,减弱灰度的缓慢变化区域。因此,锐化处理可选择拉普拉斯算子对原图像进行处理,产生描述灰度突变的图像,再将拉普拉斯图像与原始图像叠加而产生锐化图像。拉普拉斯锐化的基本方法可以由下式表示:

这种简单的锐化方法既可以产生拉普拉斯锐化处理的效果,同时又能保留背景信息,将原始图像叠加到拉普拉斯变换的处理结果中去,可以使图像中的各灰度值得到保留,使灰度突变处的对比度得到增强,最终结果是在保留图像背景的前提下,突现出图像中小的细节信息。但其缺点是对图像中的某些边缘产生双重响应。

 各类算子的优缺点:

(1)Roberts 算子 

Roberts算子利用局部差分算子寻找边缘,边缘定位精度较高,但容易丢失一部分边缘,不具备抑制噪声的能力。该算子对具有陡峭边缘且含噪声少的图像效果较好,尤其是边缘正负45度较多的图像,但定位准确率较差;

(2) Prewitt 算子

Prewitt算子对灰度渐变的图像边缘提取效果较好,而没有考虑相邻点的距离远近对当前像素点的影响,与Sobel 算子类似,不同的是在平滑部分的权重大小有些差异;

(3)Sobel 算子

Sobel算子考虑了综合因素,对噪声较多的图像处理效果更好,Sobel 算子边缘定位效果不错,但检测出的边缘容易出现多像素宽度。

(4)Scharr算子

Scharr算子,该算子具有和Sobel算子同样的速度,且精度更高。可以将Scharr算子看作对Sobel算子的改进。

(5)Laplacian 算子

Laplacian 算子不依赖于边缘方向的二阶微分算子,对图像中的阶跃型边缘点定位准确,该算子对噪声非常敏感,它使噪声成分得到加强,这两个特性使得该算子容易丢失一部分边缘的方向信息,造成一些不连续的检测边缘,同时抗噪声能力比较差,由于其算法可能会出现双像素边界,常用来判断边缘像素位于图像的明区或暗区,很少用于边缘检测。
 

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

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

相关文章

C++标准模板(STL)- 类型支持 (数值极限,round_style,is_iec559,is_bounded)

数值极限 定义于头文件 <limits> 定义于头文件 <limits> template< class T > class numeric_limits; numeric_limits 类模板提供查询各种算术类型属性的标准化方式&#xff08;例如 int 类型的最大可能值是 std::numeric_limits<int>::max() &…

聚观早报 | 首个“5G-A智慧家庭”发布;李鹏称5G-A是5G发展选择

【聚观365】10月12日消息 首个“5G-A智慧家庭”发布 李鹏称5G-A是5G发展的自然选择 新版努比亚Z50S Pro开售 英特尔锐炫A580显卡全球同步上市 vivo X100系列年底登场 首个“5G-A智慧家庭”发布 在全球移动宽带论坛&#xff08;MBBF2023&#xff09;期间&#xff0c;du联合…

中国长序列地表冻融数据集(1978-2015)

简介&#xff1a; 中国长序列地表冻融数据集——双指标算法(1978-2015)采用SMMR&#xff08;1978-1987&#xff09;、SSM/I&#xff08;1987-2009&#xff09;和SSMIS&#xff08;2009-2015&#xff09;逐日亮温数据&#xff0c;由双指标&#xff08;TB,37v&#xff0c;SG&…

【C++进阶之路】C++11(中)

一、可变参数模板 1.基本概念 想要了解C语言的可变参数列表的原理可见&#xff1a;可变参数列表 这个跟C语言的可变参数列表有一定的关系,常用的printf与scanf的参数就包含可变参数列表。 那么可变参数模板是什么呢&#xff1f;举个例子便一目了然。 template<class...Arg…

Qt Quick读取本地文件并显示成表格

&#x1f680;作者&#xff1a;CAccept &#x1f382;专栏&#xff1a;Qt Quick 文章目录 &#x1f34e;C代码部分实现&#x1f680;C类注册到QML中&#x1f382;QML部分实现&#x1f330;小知识点⭐C与QML进行交互⭐将运行路径进行传递保证程序的稳定性⭐QML中定义信号其默认…

【Proteus仿真】【STM32单片机】智能加湿器设计

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真STM32单片机控制器&#xff0c;使用LCD1602液晶、按键、蜂鸣器、DHT11温湿度传感器、水位传感器、PCF8591 ADC、继电器、加湿装置等。 主要功能&#xff1a; 系统运行后&#xff0…

从零开始:深入理解Kubernetes架构及安装过程

K8s环境搭建 文章目录 K8s环境搭建集群类型安装方式环境规划克隆三台虚拟机系统环境配置集群搭建初始化集群&#xff08;仅在master节点&#xff09;配置环境变量&#xff08;仅在master节点&#xff09;工作节点加入集群&#xff08;knode1节点及knode2节点&#xff09;安装ca…

吃鸡高手秘籍大揭秘,享受顶级游戏干货!

大家好&#xff01;作为吃鸡行家&#xff0c;今天我将揭示一些与众不同、足够吸引力的内容&#xff0c;帮助您提高游戏战斗力并分享顶级游戏作战干货。 首先&#xff0c;让我们推荐一些绝地求生作图工具。这些工具可以帮助您在游戏中更好地制作作战图和规划策略&#xff0c;让您…

基于RuoYi-Flowable-Plus的若依ruoyi-nbcio支持本地图片上传与回显的功能实现(二)

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 排除路径&#xff0c;增加avatar图片 # security配置 security:# 排除路径excludes:# 静态资源- /*.html…

Python+Tkinter 图形化界面基础篇:集成数据库

PythonTkinter 图形化界面基础篇&#xff1a;集成数据库 引言为什么选择 SQLite 数据库&#xff1f;集成 SQLite 数据库的步骤示例&#xff1a;创建一个任务管理应用程序步骤1&#xff1a;导入必要的模块步骤2&#xff1a;创建主窗口和数据库连接步骤3&#xff1a;创建数据库表…

Spring源码解析—— AOP代理的生成

本文已经收录到大彬精心整理的大厂面试手册&#xff0c;包含计算机基础、Java基础、多线程、JVM、数据库、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服务、设计模式、架构、校招社招分享等高频面试题&#xff0c;非常实用&#xff0c;有小伙伴靠着这份手册拿…

(1)(1.3) 匿名航空电子设备DroneCAN激光雷达接口

文章目录 前言 1 设置参数 2 参数说明 前言 Avionics Anonymous DroneCAN 激光雷达接口是一个微型接口(Avionics Anonymous DroneCAN LIDAR Interface)&#xff0c;适用于几种常见的激光测距仪(several common laser rangefinders)&#xff0c;可通过 DroneCAN 连接到 Pixha…

混淆技术研究笔记(五)混淆后如何反篡改?

有了上一节的基础工具后&#xff0c;接下来要考虑如何反篡改。 本文采用的是对混淆后的代码&#xff0c;针对某些关键包的字节码数据计算md5值&#xff0c;对所有类计算完成后对md5值进行排序&#xff0c;排序后拼接字符串再次计算md5值&#xff0c;最后通过私钥对md5进行RSA对…

Linux之open和fopen的比较

1、fopen 是ANSIC标准中的C库函数&#xff0c;open是系统调用 2、fopen提供了IO缓存功能&#xff0c;而open没有&#xff0c;所以fopen速度要比open快 3、fopen具有良好的移植性&#xff0c;而open 是依赖于特定的环境 4、fopen返回一个FILE 结构体指针&#xff0c;而open 返…

MES管理系统如何解决电子企业的生产痛点

随着电子行业的快速发展&#xff0c;企业面临着越来越多的生产和管理挑战。其中&#xff0c;物料编码管理困难、产品设计工作繁重、客户需求多样化 以及产品设计变更管理困难等问题尤为突出。为了解决这些问题&#xff0c;许多电子企业开始引入MES管理系统解决方案&#xff0c;…

如何实现响应式网页设计?

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

做直播或短视频 其实有几个精准粉丝就可以很快变现

随着短视频 和 直播 快速发展 人流量巨大 只要是个东西 只要你能豁得出去 都能卖出去 把精准流量引流到自己的私域里面 可以组建团队 一起发展 自己喝点汤就好 有一起做CSDN和其他短视频项目的 可以左上方私信留言 我怕说多了 审核不过去

Svelte生命周期(加整体概述)

目录 前言 一、编译阶段 1. 导入语句 2. 组件声明 3. 模板部分 4. CSS样式 二、运行时阶段 三、生命周期函数 1. onMount 2. beforeUpdate 与 afterUpdate 3. onDestroy 4. setContext 与 getContext 6. hasContext 7. getAllContexts 前言 Svelte是一种现代的Ja…

冠军代言|媒介易:释放品牌潜力,实力助力,助您势如破竹!

在竞争激烈的市场中&#xff0c;品牌需要不断创新&#xff0c;找到吸引目标客户的方法。而与体育冠军合作&#xff0c;通过冠军代言&#xff0c;已经成为了众多企业提高品牌知名度、树立形象、吸引消费者目光的重要策略之一。在这个领域&#xff0c;媒介易以其实力加冕&#xf…

如何正确高效使用墨西哥专线?

在当今全球化的物流行业中&#xff0c;跨境运输服务已经成为许多企业拓展国际市场的重要手段。然而&#xff0c;由于各国法律法规、文化差异以及运输环节的复杂性&#xff0c;企业在进行跨境运输时可能会遇到诸多挑战。为了解决这些问题&#xff0c;一些专业的物流公司推出了“…