可见Scharr算子和Sobel原理类似,只是他将差异进一步放大,对差异更加敏感
Laplacian算子对变化更敏感,同时对噪音也会敏感,所以单独使用效果并不好,一般和其他处理配合
下面看几种算子的效果对比
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))
cv_show(res,'res')
原图如下:
效果对比如下:
可以看出Scharr算子的得出的轮廓更多,这是因为他对线条梯度更加敏感
教程来自:https://www.bilibili.com/video/BV1oJ411D71z?p=2