輸入圖像深度 | 輸出圖像深度 |
---|---|
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方向的求導(dǎo)階數(shù)
dy:代表Y方向的求導(dǎo)階數(shù)
ksize:Sobel核的大小,該值為-1時(shí),則會(huì)使用Sobel濾波器進(jìn)行運(yùn)算
scale:計(jì)算導(dǎo)數(shù)值所采用的縮放因子,默認(rèn)值為1,時(shí)沒有縮放的
delta:加載目標(biāo)圖像上的值,該值可選,默認(rèn)為0
borderType:邊界樣式,前面博文有詳細(xì)介紹,這里不在贅述。
需要注意的是,如果將ddepth參數(shù)設(shè)置為-1,讓處理結(jié)果與原圖像保持一致,可以會(huì)得到錯(cuò)誤的結(jié)果。實(shí)際上,這么做會(huì)導(dǎo)致梯度值可能出現(xiàn)負(fù)數(shù)。如果處理的是8位圖像,意味著指定運(yùn)算的結(jié)果也是8位圖類型,那么所有的負(fù)數(shù)會(huì)自動(dòng)截?cái)酁?,發(fā)生信息丟失。為了避免信息丟失,在計(jì)算時(shí)先使用更高的數(shù)據(jù)類型cv2.CV_64F,再通過取絕對(duì)值將其映射為cv2.CV_8U類型。所以,我們使用Sobel濾波器常常會(huì)將ddepth設(shè)置為cv2.CV_64F。
計(jì)算X方向梯度語法格式為:
cv2.Sobel(src,ddepth,1,0)
計(jì)算Y方向梯度語法格式為:
cv2.Sobel(src,ddepth,0,1)
計(jì)算XY方向梯度語法格式為:
cv2.Sobel(src,ddepth,1,1)
計(jì)算XY疊加梯度語法格式為:
dx=cv2.Sobel(src,ddepth,1,0) dy=cv2.Sobel(src,ddepth,0,1) dst=cv2.addWeighted(src1,alpha,src2,beta,gamma)
因?yàn)榭赡軙?huì)出現(xiàn)負(fù)數(shù),我們還需要使用另一個(gè)函數(shù)取絕對(duì)值,該函數(shù)為:cv2.convertScaleAbs(),其完整定義如下:
def convertScaleAbs(src, dst=None, alpha=None, beta=None):
alpha:調(diào)節(jié)系數(shù),可選值,默認(rèn)為1
beta:調(diào)節(jié)亮度值,默認(rèn)為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()
運(yùn)行之后,效果如下所示:
接著,我們來使用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()
運(yùn)行之后,效果如下:
接著,我們來計(jì)算XY方向梯度,代碼如下:
import cv2 img = cv2.imread("4.jpg", cv2.IMREAD_UNCHANGED) sobel_xy=cv2.Sobel(img,cv2.CV_64F,1,1)#都設(shè)置為1 result=cv2.convertScaleAbs(sobel_xy) cv2.imshow("img", img) cv2.imshow("result", result) cv2.waitKey() cv2.destroyAllWindows()
運(yùn)行之后,效果如下:
最后,我們來計(jì)算其水平垂直兩個(gè)方向的疊加邊緣信息,代碼如下:
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()
運(yùn)行之后,效果如下:
到此這篇關(guān)于OpenCV-Python實(shí)現(xiàn)圖像梯度與Sobel濾波器的文章就介紹到這了,更多相關(guān)OpenCV 圖像梯度與Sobel濾波器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
標(biāo)簽:六盤水 聊城 撫州 南寧 迪慶 揚(yáng)州 牡丹江 楊凌
巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《OpenCV-Python實(shí)現(xiàn)圖像梯度與Sobel濾波器》,本文關(guān)鍵詞 OpenCV-Python,實(shí)現(xiàn),圖像,梯度,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。