opencv学习笔记十一:Sobel、Scharr、laplacian三种图像梯度算子的对比

图像梯度-Sobel算子

opencv学习笔记十一:Sobel、Scharr、laplacian三种图像梯度算子的对比_第1张图片

dst = cv2.Sobel(src, ddepth, dx, dy, ksize)

ddepth:图像的深度,也即存储的数据类型,-1表示和原来的数据类型一样,是int8类型;一般不这么使用,下面会做解释
dx和dy分别表示是否计算此轴的梯度
ksize是Sobel算子的大小

图像梯度-Scharr算子

opencv学习笔记十一:Sobel、Scharr、laplacian三种图像梯度算子的对比_第2张图片

dst = cv2.Scharr(src, ddepth, dx, dy)

ddepth:图像的深度,也即存储的数据类型
dx和dy分别表示是否计算此轴的梯度

图像梯度-laplacian算子

opencv学习笔记十一:Sobel、Scharr、laplacian三种图像梯度算子的对比_第3张图片

dst = cv2.Laplacian(src, ddepth, dst, ksize, scale)

src是需要处理的图像;
ddepth是图像的深度,-1表示采用的是与原图像相同的深度。目标图像的深度必须大于等于原图像的深度;
dst是输出的目标图像,和返回值是一样的;
ksize是算子的大小,必须为1、3、5、7,默认为1;
scale是缩放导数的比例常数,默认情况下没有伸缩系数;

上面说到了图像深度,也就是参数ddepth的问题,下面就是对其的解释;其中比如cv2.CV_64F就允许存在负数,不会对负数进行截断
opencv学习笔记十一:Sobel、Scharr、laplacian三种图像梯度算子的对比_第4张图片
下面是三种图像梯度算子的比较

#不同算子的差异
img = cv2.imread('lena.jpg',cv2.IMREAD_GRAYSCALE)
sobelx = cv2.Sobel(img,cv2.CV_64F,1,0,ksize=3)
sobely = cv2.Sobel(img,cv2.CV_64F,0,1,ksize=3)
#将负数转成正数
sobelx = cv2.convertScaleAbs(sobelx)   
sobely = cv2.convertScaleAbs(sobely)  
sobelxy =  cv2.addWeighted(sobelx,0.5,sobely,0.5,0)  

scharrx = cv2.Scharr(img,cv2.CV_64F,1,0)
scharry = cv2.Scharr(img,cv2.CV_64F,0,1)
#将负数转成正数
scharrx = cv2.convertScaleAbs(scharrx)   
scharry = cv2.convertScaleAbs(scharry)  
scharrxy =  cv2.addWeighted(scharrx,0.5,scharry,0.5,0) 

laplacian = cv2.Laplacian(img,cv2.CV_64F)
#将负数转成正数
laplacian = cv2.convertScaleAbs(laplacian)   

res = np.hstack((sobelxy,scharrxy,laplacian))
cv2.imshow('res',res)
cv2.waitKey()
cv2.destroyAllWindows()

opencv学习笔记十一:Sobel、Scharr、laplacian三种图像梯度算子的对比_第5张图片
opencv学习笔记十一:Sobel、Scharr、laplacian三种图像梯度算子的对比_第6张图片

你可能感兴趣的:(opencv学习笔记十一:Sobel、Scharr、laplacian三种图像梯度算子的对比)