图像梯度

图像梯度文章目录一.sobel算子二.scharr算子三.laplace算子图像梯度代表图像灰度值变化的速度,对于一副图像而言,其边缘部分两侧灰度值相差较大,梯度值大,所以对一副图像求梯度可以突出图像边


图像梯度代表图像灰度值变化的速度,对于一副图像而言,其边缘部分两侧灰度值相差较大,梯度值大,所以对一副图像求梯度可以突出图像边缘的信息。由于像素值为离散值,所以其梯度其是就是差分运算,其本质上也就是一种空间滤波。

一.sobel算子

其掩模结构为:

在这里插入图片描述

opencv中提供了cv2.Sobel()来实现Sobel算子的运算,其语法常用形式:

dst=cv2.Sobel(src,ddepth,dx,dy,[,ksize[,scale[,delta[,borderType]]]])

参数说明:
dst:目标输出图像
src:原始输入图像
ddepth:图像深度,默认值-1与原始图像相同深度,但注意原始图像一般为cv2.CV_8U,则由于求梯度的时候会出现负值的情况,其会将负值直接置为0,此时会丢失图像许多信息,所以要将其一般转化为更高位灰度去求梯度,再对结果求绝对值。ddepth一般取cv2.CV_64F。
dx:代表x方向上求导
dy:代表y方向上求导
ksize:掩模大小
scale:求导之后值的缩放因子,默认为1,即不会缩放
delta:表示偏置在目标图像上的值,用于调节亮度
borderType:边界处理类型
注意:ddepth取cv2.CV_64F进行运算之后,一定要对结果取绝对值,opencv中提供取绝对值函数为cv2.convertScaleAbs(),其语法格式:

	dst=cv2.convertScaleAbs(src)

当我们要同时得到x与y方向边缘的信息时,应通过分别对x方向和y方向求导,在对两幅图像进行叠加,而不能另dx,dy同时为1。

import cv2
image=cv2.imread("wb6.png")
#对x方向求梯度
sobelx=cv2.Sobel(image,ddepth=cv2.CV_64F,dx=1,dy=0)
sobelx=cv2.convertScaleAbs(sobelx)
#对y方向求梯度
sobely=cv2.Sobel(image,ddepth=cv2.CV_64F,dx=0,dy=1)
sobely=cv2.convertScaleAbs(sobely)
#对两者叠加
sobelxy=cv2.addWeighted(sobelx,0.5,sobely,0.5,0)
#令dx,dy同时为1
sobel=cv2.Sobel(image,ddepth=cv2.CV_64F,dx=1,dy=1)
sobel=cv2.convertScaleAbs(sobel)
cv2.imshow("image",image)
cv2.imshow("sobelx",sobelx)
cv2.imshow("sobely",sobely)
cv2.imshow("sobelxy",sobelxy)
cv2.imshow("sobel",sobel)
cv2.waitKey(0)
cv2.destroyAllWindows()

运行结果:
在这里插入图片描述
在这里插入图片描述

二.scharr算子

其基本思想与sobel算子一样,只是两者所使用掩模的结构不一样,在运算中,其梯度近似的结果比sobel更精确,其算子如下:
在这里插入图片描述
在opencv中提供的函数为cv2.Scharr(),语法形式如下:

dst=cv2.Sobel(src,ddepth,dx,dy,[,ksize[,scale[,delta[,borderType]]]])

个参数的含义与sobel中完全一样,值得注意的是其dx与dy不能同时为0,否则就会报错。

import cv2
image=cv2.imread("wb6.png")
#对x方向求梯度
sobelx=cv2.Sobel(image,ddepth=cv2.CV_64F,dx=1,dy=0)
sobelx=cv2.convertScaleAbs(sobelx)
#对y方向求梯度
sobely=cv2.Sobel(image,ddepth=cv2.CV_64F,dx=0,dy=1)
sobely=cv2.convertScaleAbs(sobely)
#对两者叠加
sobelxy=cv2.addWeighted(sobelx,0.5,sobely,0.5,0)
#对x方向求梯度
scharrx=cv2.Scharr(image,ddepth=cv2.CV_64F,dx=1,dy=0)
scharrx=cv2.convertScaleAbs(sobelx)
#对y方向求梯度
scharry=cv2.Scharr(image,ddepth=cv2.CV_64F,dx=0,dy=1)
scharry=cv2.convertScaleAbs(sobely)
#对两者叠加
scharrxy=cv2.addWeighted(scharrx,0.5,scharry,0.5,0)
cv2.imshow("image",image)
cv2.imshow("sobelx",sobelx)
cv2.imshow("sobely",sobely)
cv2.imshow("sobelxy",sobelxy)
cv2.imshow("scharrx",sobelx)
cv2.imshow("scahrry",sobely)
cv2.imshow("scharrxy",sobelxy)
cv2.waitKey(0)
cv2.destroyAllWindows()

运行结果比较:
在这里插入图片描述

三.laplace算子

其是对像素点求二阶导,即二阶差分,其对噪声点的锐化更加突出。
opencv提供的函数为:
cv2.Laplacian(),其语法格式:

dst=cv2.Laplacian(src,ddepth,[,ksize[,scale[,delta[,borderType]]]])

各参数意义与sobel一样,只是其求二阶导,无需指定对dx,与dy方向是否求导。
在这里插入图片描述
可以看出其对一些细节更加突出。

今天的文章图像梯度分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/72738.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注