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)
效果如下: