Python+OpenCV之圖像梯度詳解
1. Sobel算子
OpenCV系列—本文底頁(yè)有多個(gè)常用方法鏈接
1.1 Sobel介紹
cv2.Sobel(src, ddepth, dx, dy, ksize)
- ddepth:圖像的深度
- dx和dy分別表示水平和豎直方向
- ksize是Sobel算子的大小

import cv2 # opencv讀取的格式是BGR
def cv_show(img, name):
cv2.imshow(name, img)
cv2.waitKey()
cv2.destroyAllWindows()
img = cv2.imread('../img/pie.png', cv2.IMREAD_GRAYSCALE)
cv2.imshow("img", img)
cv2.waitKey()
cv2.destroyAllWindows()
pie.png原圖(右擊另存為下載):

1.2 橫向Sobel算子
采用上述公式中的 G x G_{x} Gx?濾波器掃描整張圖,提取了左右兩邊有梯度差的位置,但是橫向看圓的上頂端和下頂端的梯度不明顯所以呈現(xiàn)圖片如下上下端為虛線的圓。
sobelx = cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize=3) cv_show(sobelx, 'sobelx')
結(jié)果如下:

白-黑是正數(shù),黑-白就是負(fù)數(shù)了,所有的負(fù)數(shù)會(huì)被截?cái)喑?,所以要取絕對(duì)值。
sobelx = cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize=3) sobelx = cv2.convertScaleAbs(sobelx) cv_show(sobelx, 'sobelx')
加入絕對(duì)值后,梯度結(jié)果就可以有一個(gè)完整的圓:

1.3 縱向Sobel算子
采用上述公式中的 G y G_{y} Gy?濾波器掃描整張圖,提取了上下兩邊有梯度差的位置,但是縱向看圓的左頂端和右頂端的梯度不明顯所以呈現(xiàn)圖片如左右端為虛線的圓。
sobely = cv2.Sobel(img, cv2.CV_64F, 0, 1, ksize=3) sobely = cv2.convertScaleAbs(sobely) cv_show(sobely, 'sobely')

1.4 合并橫縱向的方法提取更好的邊緣的結(jié)果
將橫向梯度提取濾波器 Gx與縱向梯度提取濾波器Gy?相加,即可得到效果較好的圓的邊緣梯度信息。
sobelxy = cv2.addWeighted(sobelx, 0.5, sobely, 0.5, 0) cv_show(sobelxy, 'sobelxy')

不推薦
sobelxy = cv2.Sobel(img, cv2.CV_64F, 1, 1, ksize=3) sobelxy = cv2.convertScaleAbs(sobelxy) cv_show(sobelxy, 'sobelxy')
結(jié)果顯示,相對(duì)于分開(kāi)使用橫縱向算子邊緣重影嚴(yán)重:

1.5 利用1.3方法繪制素描風(fēng)格
lena.jpg原圖,另存為保存:

import cv2 # opencv讀取的格式是BGR
img = cv2.imread('../img/lena.jpg', cv2.IMREAD_GRAYSCALE)
sobelx = cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize=3)
sobelx = cv2.convertScaleAbs(sobelx)
sobely = cv2.Sobel(img, cv2.CV_64F, 0, 1, ksize=3)
sobely = cv2.convertScaleAbs(sobely)
sobelxy = cv2.addWeighted(sobelx, 0.5, sobely, 0.5, 0)
cv_show(sobelxy, 'sobelxy')

2. Scharr算子

import cv2 # opencv讀取的格式是BGR
img = cv2.imread('../img/lena.jpg', cv2.IMREAD_GRAYSCALE)
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)
二階動(dòng)量對(duì)紋理細(xì)節(jié)區(qū)分更加豐富,結(jié)果圖如下:

3. Laplacian算子

import cv2 # opencv讀取的格式是BGR
img = cv2.imread('../img/lena.jpg', cv2.IMREAD_GRAYSCALE)
laplacian = cv2.Laplacian(img,cv2.CV_64F)
laplacian = cv2.convertScaleAbs(laplacian)
需要配合其他操作共同使用,單個(gè)使用的效果不如上面兩個(gè)算子,結(jié)果圖如下:

到此這篇關(guān)于Python+OpenCV之圖像梯度詳解的文章就介紹到這了,更多相關(guān)OpenCV圖像梯度內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python對(duì)RabbitMQ的簡(jiǎn)單入門(mén)使用教程
RabbitMq是實(shí)現(xiàn)了高級(jí)消息隊(duì)列協(xié)議(AMQP)的開(kāi)源消息代理中間件,下面這篇文章主要給大家介紹了關(guān)于python對(duì)RabbitMQ的簡(jiǎn)單入門(mén)使用,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-06-06
Python?任務(wù)自動(dòng)化工具nox?的配置與?API詳情
這篇文章主要介紹了Python?任務(wù)自動(dòng)化工具nox?的配置與?API詳情,Nox?會(huì)話是通過(guò)被@nox.session裝飾的標(biāo)準(zhǔn)?Python?函數(shù)來(lái)配置的,具體詳情下文相關(guān)介紹需要的小伙伴可以參考一下2022-07-07
python利用opencv實(shí)現(xiàn)顏色檢測(cè)
這篇文章主要為大家詳細(xì)介紹了python利用opencv實(shí)現(xiàn)顏色檢測(cè),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-02-02
思考分析Python運(yùn)算中?a+=b?和?a=a+b是否相等
這篇文章主要為大家介紹了Python運(yùn)算中a+=b和a=a+b是否相等及原理思考分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04
pycharm配置Anaconda虛擬環(huán)境全過(guò)程
這篇文章主要介紹了pycharm配置Anaconda虛擬環(huán)境全過(guò)程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01
Python向Excel中插入圖片的簡(jiǎn)單實(shí)現(xiàn)方法
這篇文章主要介紹了Python向Excel中插入圖片的簡(jiǎn)單實(shí)現(xiàn)方法,結(jié)合實(shí)例形式分析了Python使用XlsxWriter模塊操作Excel單元格插入jpg格式圖片的相關(guān)操作技巧,非常簡(jiǎn)單實(shí)用,需要的朋友可以參考下2018-04-04

