輸入圖像深度 | 輸出圖像深度 |
---|---|
cv2.CV_8U | -1/cv2.CV_16S/cv2.CV_32F/cv2/CV_64F |
cv2.CV_16U/cv2.CV_16S | -1/cv2.CV_32F/cv2.CV_64F |
cv2.CV_32F | -1/cv2.CV_32F/cv2.CV_64F |
cv2.CV_64F | -1/cv2.CV_64F |
dx:代表X方向的求導階數
dy:代表Y方向的求導階數
ksize:Sobel核的大小,該值為-1時,則會使用Sobel濾波器進行運算
scale:計算導數值所采用的縮放因子,默認值為1,時沒有縮放的
delta:加載目標圖像上的值,該值可選,默認為0
borderType:邊界樣式,前面博文有詳細介紹,這里不在贅述。
需要注意的是,如果將ddepth參數設置為-1,讓處理結果與原圖像保持一致,可以會得到錯誤的結果。實際上,這么做會導致梯度值可能出現負數。如果處理的是8位圖像,意味著指定運算的結果也是8位圖類型,那么所有的負數會自動截斷為0,發生信息丟失。為了避免信息丟失,在計算時先使用更高的數據類型cv2.CV_64F,再通過取絕對值將其映射為cv2.CV_8U類型。所以,我們使用Sobel濾波器常常會將ddepth設置為cv2.CV_64F。
計算X方向梯度語法格式為:
cv2.Sobel(src,ddepth,1,0)
計算Y方向梯度語法格式為:
cv2.Sobel(src,ddepth,0,1)
計算XY方向梯度語法格式為:
cv2.Sobel(src,ddepth,1,1)
計算XY疊加梯度語法格式為:
dx=cv2.Sobel(src,ddepth,1,0) dy=cv2.Sobel(src,ddepth,0,1) dst=cv2.addWeighted(src1,alpha,src2,beta,gamma)
因為可能會出現負數,我們還需要使用另一個函數取絕對值,該函數為:cv2.convertScaleAbs(),其完整定義如下:
def convertScaleAbs(src, dst=None, alpha=None, beta=None):
alpha:調節系數,可選值,默認為1
beta:調節亮度值,默認為0
下面,我們來使用Sobel濾波器,獲取圖像水平方向的邊緣信息,代碼如下:
import cv2 img = cv2.imread("4.jpg", cv2.IMREAD_UNCHANGED) sobel_x=cv2.Sobel(img,cv2.CV_64F,1,0) result=cv2.convertScaleAbs(sobel_x) cv2.imshow("img", img) cv2.imshow("result", result) cv2.waitKey() cv2.destroyAllWindows()
運行之后,效果如下所示:
接著,我們來使用Sobel濾波器,獲取圖像垂直方向的邊緣信息,代碼如下:
import cv2 img = cv2.imread("4.jpg", cv2.IMREAD_UNCHANGED) sobel_y=cv2.Sobel(img,cv2.CV_64F,0,1)#更改這一行就行 result=cv2.convertScaleAbs(sobel_y) cv2.imshow("img", img) cv2.imshow("result", result) cv2.waitKey() cv2.destroyAllWindows()
運行之后,效果如下:
接著,我們來計算XY方向梯度,代碼如下:
import cv2 img = cv2.imread("4.jpg", cv2.IMREAD_UNCHANGED) sobel_xy=cv2.Sobel(img,cv2.CV_64F,1,1)#都設置為1 result=cv2.convertScaleAbs(sobel_xy) cv2.imshow("img", img) cv2.imshow("result", result) cv2.waitKey() cv2.destroyAllWindows()
運行之后,效果如下:
最后,我們來計算其水平垂直兩個方向的疊加邊緣信息,代碼如下:
import cv2 img = cv2.imread("4.jpg", cv2.IMREAD_UNCHANGED) sobel_x=cv2.Sobel(img,cv2.CV_64F,1,0) sobel_y=cv2.Sobel(img,cv2.CV_64F,0,1) abx_x=cv2.convertScaleAbs(sobel_x) abx_y=cv2.convertScaleAbs(sobel_y) result=cv2.addWeighted(sobel_x,0.5,sobel_y,0.5,0) cv2.imshow("img", img) cv2.imshow("result", result) cv2.waitKey() cv2.destroyAllWindows()
運行之后,效果如下:
到此這篇關于OpenCV-Python實現圖像梯度與Sobel濾波器的文章就介紹到這了,更多相關OpenCV 圖像梯度與Sobel濾波器內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持腳本之家!