Scharr算子
cv2.Scharr(img,cv2.CV_64F,1,0)
第一个参数:当前的图像对象名称
第二个参数:当前图像的深度,通常情况下指定为-1,表示输出和输入的深度是一样的;cv2.CV_64F可以存6字节的大小,为了方便后面的取绝对值操作
第三个参数:是否算X轴的水平方向,若为1表示计算X轴方向,若为0表示不计算X轴方向
第四个参数:是否算Y轴的竖直方向,若为1表示计算Y轴方向,若为0表示不计算Y轴方向
与Sobel算子特别类似,相比Sobel算子而言,Scharr算子对结果的差异更明显一些
laplacian算子
cv2.Laplacian(img,cv2.CV_64F)
第一个参数:当前的图像对象名称
第二个参数:当前图像的深度,通常情况下指定为-1,表示输出和输入的深度是一样的;cv2.CV_64F可以存6字节的大小,为了方便后面的取绝对值操作
其他算子都是一阶导的感觉,而laplacian算子提到了一个二阶导,相当于一阶导的变换率
所以laplacian算子对一些变化会更加的敏感,但是这个算子会对噪音点更加敏感,这并不是一件好事,因为噪音点并不是边界
通常都是与其他算子搭配使用,不经常单独使用这个算子
import cv2
import numpy as npdef show_photo(name,picture):cv2.imshow(name,picture)cv2.waitKey(0)cv2.destroyAllWindows()img = cv2.imread('E:\Jupyter_workspace\study\data/test1.png',cv2.IMREAD_GRAYSCALE)#Sobel算子,分别计算X轴和Y轴方向的梯度然后加权求和
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)#Scharr算子,分别计算X轴和Y轴方向的梯度然后加权求和
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算子梯度算法
laplacian = cv2.Laplacian(img,cv2.CV_64F)
laplacian = cv2.convertScaleAbs(laplacian)#将原图,sobel算子,scharr算子,laplacian算子合在一块看下效果
res = np.hstack((img,sobelxy,scharrxy,laplacian))
show_photo('img-sobelxy-scharrxy-laplacian',res)
效果如下: