问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

CV学习笔记(十三):图像梯度

发布网友 发布时间:2024-10-01 09:11

我来回答

1个回答

热心网友 时间:2024-10-21 22:18

在这篇文章中,我们将探讨图像中梯度的应用。

一:什么是梯度?
在高等数学中,梯度是一个向量,既有方向也有大小。以二元函数为例,假设一二元函数f(x,y),在某点的梯度有:
整理后得到:
这也就是它的方向导数。梯度的方向是函数变化最快的方向,沿着梯度的方向容易找到最大值。

二:图像梯度
在一幅模糊图像中的物体的轮廓不明显,轮廓边缘灰度变化不强烈,从而导致层次感不强,而在清晰图片中的物体轮廓边缘灰度变化明显,层次感强。那么这种灰度变化明显不明显怎么去定义呢?
可以使用导数(梯度),衡量图像灰度的变化率,因为图像就是函数。正因如此,我们引入的图像梯度可以把图像看成二维离散函数,图像梯度其实就是这个二维离散函数的求导。

在上边这幅图中可以看出,如果一副图像的相邻灰度值有变化,那么梯度就存在,如果图像相邻的像素没有变化,那么梯度就是0,把梯度值和相应的像素相加,那么灰度值没有变化的,像素就没有变化,灰度值变了,像素值也就变了。我们看到,相加后的新图像,原图像像素点100与90亮度只相差10,现在是110与90,亮度相差20了,对比度显然增强了,尤其是图像中物体的轮廓和边缘,与背景大大加强了区别,这就是用梯度来增强图像的原理。将图像函数f(x,y)梯度表达式表示出来:
幅度
方向角:
对于数字图像来说,相当于是二维离散函数求梯度,使用差分来近似导数:
因此,像素点(x,y)处的梯度值和梯度方向分别是:
这里的平方+开方的,计算量太大,于是一般用绝对值来近似平方和平方根的操作,来降低计算量:
在上述的推论中我们得到,梯度的方向是函数变化最快的方向,所以当函数中存在边缘时,一定有较大的梯度值,相反,当图像中有比较平滑的部分时,灰度值变化较小,则相应的梯度也较小,图像处理中把梯度的模简称为梯度,由图像梯度构成的图像成为梯度图像。

一些经典的图像梯度算法是考虑图像的每个像素的某个邻域内的灰度变化,利用边缘临近的一阶或二阶导数变化规律,对原始图像中像素某个邻域设置梯度算子,通常我们用小区域模板进行卷积来计算,有Sobel算子、Robinson算子、Laplace算子等。

三:经典算子介绍
这里只简单介绍下sobel算子,具体更详细的可以看下边这个链接中的算子介绍,讲的实在是太棒了!!!
sobel算子,主要用作边缘检测,是离散差分算子,用来运算图像梯度函数的灰度近似值。在图像的任何一点使用此算子,将会产生对应的梯度矢量或者法矢量。

书上的sobel模板不是卷积模板,而是协相关模板,卷积的话要先将模板旋转180度以后再与图像做相关操作。

Gx方向的相关模板:
Gy方向的相关模板:
Sobel的卷积模板Gx:
sobel卷积模板Gy:
具体计算为,每个像素(灰度值)与模板对应位置元素相乘求和(类似于CNN中的卷积,其实是协相关运算),来计算该点灰度的大小:

通常,为了提高效率使用不开平方的近似值:

然后可用以下公式计算梯度方向:

四:算法的实现
1:Sobel算子
代码如下:

这里有几个点需要注意:
Sobel(src,ddepth,dx,dy[,dst[,ksize[,scale[,delta[,borderType]]]]])
src参数表示输入需要处理的图像。 ddepth参数表示输出图像深度,针对不同的输入图像,输出目标图像有不同的深度。(一般源图像都为CV_8U,为了避免溢出,一般ddepth参数选择CV_32F)
dx参数表示x方向上的差分阶数,1或0 。 dy参数表示y 方向上的差分阶数,1或0 。
dst参数表示输出与src相同大小和相同通道数的图像。 ksize参数表示Sobel算子的大小,必须为1、3、5、7。
scale参数表示缩放导数的比例常数,默认情况下没有伸缩系数。
delta参数表示一个可选的增量,将会加到最终的dst中,同样,默认情况下没有额外的值加到dst中。
borderType表示判断图像边界的模式。这个参数默认值为cv2.BORDER_DEFAULT。

实现结果:

二:Scharr算子
代码如下:

函数原型为Scharr(src, ddepth, dx, dy[, dst[, scale[, delta[, borderType]]]])
参考上边的Sobel算子的函数原型

实验结果:

3:拉普拉斯算子
代码如下:

OpenCV的Laplacian函数原型为:

Laplacian(src, ddepth[, dst[, ksize[, scale[, delta[, borderType]]]]])
src参数表示输入需要处理的图像。 ddepth参数表示输出图像深度,针对不同的输入图像,输出目标图像有不同的深度。(一般源图像都为CV_8U,为了避免溢出,一般ddepth参数选择CV_32F)
dst参数表示输出与src相同大小和相同通道数的图像。 ksize参数表示用于计算二阶导数滤波器的孔径大小,大小必须是正数和奇数。
scale参数表示计算拉普拉斯算子值的比例因子,默认情况下没有伸缩系数。
delta参数表示一个可选的增量,将会加到最终的dst中,同样,默认情况下没有额外的值加到dst中。
borderType表示判断图像边界的模式。这个参数默认值为cv2.BORDER_DEFAULT。

实验结果:

五:参考资料
1:【OpenCV入门教程之十二】OpenCV边缘检测:Canny算子,Sobel算子,Laplace算子,Scharr滤波器合辑
2:OpenCV-Python教程(6、Sobel算子)
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
空调加氟时要注意什么? 电脑安装了pr兼容性pr显示系统兼容性报告 带你了解——赫伯罗特 一千克面粉三十元一克面粉多少钱 大米2元500克面粉3元500克 2千克大米和和1500克面粉多少钱?_百度... ...面粉每千克多少元.大米25千克4.5元一千克面粉2 买8000克面粉需要32元,每千克面粉多少钱 500克面粉2元钱1千克面粉多少钱,怎么练式? 软棕和硬棕哪个好 amd rx6800m相当于nvidia什么水平? Android OpenCV(二十三):Sobel算子边缘检测 描写冬天美丽的句子 描写冬天美丽的句子简短 我想在电脑上赚些钱,我会下载文件,怎样让电脑上的人知道并从我这下载... 怎么让别人进入我的电脑的文件夹下东西? 电脑固态硬盘装系统不识,怎么办? 注册appleid要8个字符是什么意思? 秒速五厘米主题曲歌词《One more time One more chance》日文全... 求JAMOSA的歌曲《これ以上やさしくしないで》的日文歌词,最好含假名... 糯米粉如何才算变质 集显和独显有什么区别 集显和独显的区别 怎么用手机把录音转成mp3 ...住着一个人的昵称_心里牵挂一个人的网名_心里只守一人的昵称... “重来一梦觉黄粱”的出处是哪里 人有精神,何事不成 事例 人有精神何时不成 PD线和typec线有什么区别 能让人长高的运动 65W Type-C通用电源适配器的便携性和兼容性如何? <少女爱上姐姐> 漫画和动漫的主角名字怎么不一样啊?剧情也改了,第二... 长高的运动方法有哪些 虚拟号段电信诈骗严峻 "170/171"电话还敢接吗 为何支付宝付款时要手机验证码 如何用nfc加密门禁卡? 便携式比色红外测温仪供应商找哪家? 鉴别不锈钢的方法与技巧 怎么鉴别不锈钢 我要检测我买到的不锈钢制品是不是真正的不锈钢。 304不锈钢怎么检测? 国产空调哪个牌子质量好 空调哪个牌子好质量好性价比高?空调品牌排行榜前十名,买前必看_百度知 ... 哪个牌子的空调质量好,好在哪? 签第三方合同的坏处 效率和密度的两个符号怎么在word中打出来 word里密度符号代码word里密度符号代码怎么输入 ...机械效率"和"密度"的两个符号怎么在Word中打出来? 小弟今年大三,电气工程及其自动化专业,想考南理工的研究生,有一些问题... 电气工程及自动化专业想考研 存量用户是什么意思 2019款 大众迈腾 280TSI DSG 舒适型 19万公里保养项目费用 2019款 大众迈腾 280TSI DSG 舒适型 5万公里保养项目价格 2018款 大众迈腾 280TSI DSG 舒适型 19万公里保养项目多少钱