Sobel算子
----------------------这是严谨的分割线--------------------------
Sobel算子是一种用于边缘检测的离散微分算子,主要用于获得数字图像的一阶梯度。该算子用于计算图像明暗程度近似值,根据图像边缘旁边明暗程度把该区域内超过某个数的特定点记为边缘。Sobel算子在Prewitt算子的基础上增加了权重的概念,认为相邻点的距离远近对当前像素点的影响是不同的,距离越近的像素点对应当前像素的影响越大,从而实现图像锐化并突出边缘轮廓。Sobel算子的边缘定位更准确,常用于噪声较多、灰度渐变的图像。
Sobel算子在opencv中自带了函数实现,函数参数含义如下:dst = Sobel(src, ddepth, dx, dy[, dst[, ksize[, scale[, delta[, borderType]]]]])ddepth 表示目标图像所需的深度,针对不同的输入图像,输出目标图像有不同的深度,-1表示与原图像相同的深度;dx 和dy表示的是求导的阶数,0表示不求导,一般为0、1、2。如下图所示,左图为原图,右图是用Sobel算子检测出的边缘。
import cv2 as cv
def sobel(img):
x=cv.Sobel(src,cv.CV_16S,1,0)
y=cv.Sobel(src,cv.CV_16S,0,1)
gradx=cv.convertScaleAbs(x)
cv.imshow("x",gradx)
grady=cv.convertScaleAbs(y)
cv.imshow("y",grady)
res=cv.addWeighted(gradx,0.5,grady,0.5,0)
return res
src=cv.imread("E:/image/lena.jpg")
cv.imshow("origin",src)
res=sobel(src)
cv.imshow("sobel",res)
在本例中,Sobel函数的第二个参数这里使用的是cv.CV_16S,原因是Sobel函数求完导数后会有大于255的数或者会有负数,而原图像是unit8的,所以改成了16位有符号的数据类型,即cv.CV_16S。经过处理后,要将16位的有符号数转换为unit8,所以在代码中会有后面几行。ksize 表示Sobel算子的大小,其值必须是正数和奇数,1,3,5,7;scale 表示缩放导数的比例常数,默认情况下没有伸缩系数;delta 表示将结果存入目标图像之前,添加到结果中的可选增量值;