Python+OpenCV之圖像梯度詳解
1. Sobel算子
OpenCV系列—本文底頁有多個常用方法鏈接
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ù),黑-白就是負數(shù)了,所有的負數(shù)會被截斷成0,所以要取絕對值。
sobelx = cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize=3) sobelx = cv2.convertScaleAbs(sobelx) cv_show(sobelx, 'sobelx')
加入絕對值后,梯度結(jié)果就可以有一個完整的圓:
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é)果顯示,相對于分開使用橫縱向算子邊緣重影嚴重:
1.5 利用1.3方法繪制素描風格
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)
二階動量對紋理細節(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)
需要配合其他操作共同使用,單個使用的效果不如上面兩個算子,結(jié)果圖如下:
到此這篇關于Python+OpenCV之圖像梯度詳解的文章就介紹到這了,更多相關OpenCV圖像梯度內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
使用Python3?Boto3包刪除AWS?CloudFormation的棧(Stacks)
這篇文章主要介紹了如何使用Python3?Boto3刪除AWS?CloudFormation的棧(Stacks),本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2024-01-01Python+OpenCV實現(xiàn)閾值分割的方法詳解
閾值分割法是一種基于區(qū)域的圖像分割技術(shù),原理是把圖像像素點分為若干類。本文將利用Python+OpenCV實現(xiàn)閾值分割,感興趣的可以了解一下2022-05-05