11-图像梯度-Sobel算子
圖像梯度是指圖像某像素在x和y兩個(gè)方向上的變化率(與相鄰像素比較),是一個(gè)二維向量,由2個(gè)分量組成,X軸的變化、Y軸的變化 。
其中X軸的變化是指當(dāng)前像素右側(cè)(X加1)的像素值減去當(dāng)前像素左側(cè)(X減1)的像素值。
同理,Y軸的變化是當(dāng)前像素下方(Y加1)的像素值減去當(dāng)前像素上方(Y減1)的像素值。
其實(shí)Sobel算子求梯度也是分為x軸方向和y軸方向,說(shuō)白了就是將一個(gè)卷積核進(jìn)行上下左右劃分,x軸方向上就是右?左,y軸方向上就是下?上
cv2.Sobel(img,cv2.CV_64F,1,0,ksize = 3)
第一個(gè)參數(shù):當(dāng)前的圖像對(duì)象名稱
第二個(gè)參數(shù):當(dāng)前圖像的深度,通常情況下指定為-1,表示輸出和輸入的深度是一樣的;cv2.CV_64F可以存6字節(jié)的大小,為了方便后面的取絕對(duì)值操作
第三個(gè)參數(shù):是否算X軸的水平方向,若為1表示計(jì)算X軸方向,若為0表示不計(jì)算X軸方向
第四個(gè)參數(shù):是否算Y軸的豎直方向,若為1表示計(jì)算Y軸方向,若為0表示不計(jì)算Y軸方向
第五個(gè)參數(shù):ksize指定的卷積核是多大的,通常情況下都是奇數(shù)大小,例如:3×3的卷積核
原圖:
白到黑是正數(shù),黑到白是負(fù)數(shù),所有的負(fù)數(shù)都被截?cái)酁?(顯示黑色),也就是只顯示一半的輪廓
x軸方向取梯度:
y軸方向取梯度:
故此時(shí)需要進(jìn)行絕對(duì)值操作,為了將兩邊的輪廓都顯示出來(lái)
import cv2 import numpy as npdef show_photo(name,picture):#顯示圖像函數(shù)cv2.imshow(name,picture)cv2.waitKey(0)cv2.destroyAllWindows()#原圖: img = cv2.imread('E:\Jupyter_workspace\study\data/pie.png',cv2.IMREAD_GRAYSCALE) show_photo('img',img)#x軸方向,取絕對(duì)值 sobelx = cv2.Sobel(img,cv2.CV_64F,1,0,ksize = 3) sobelx = cv2.convertScaleAbs(sobelx)#取絕對(duì)值 show_photo('sobelx',sobelx)#y軸方向,取絕對(duì)值 sobely = cv2.Sobel(img,cv2.CV_64F,0,1,ksize = 3) sobely = cv2.convertScaleAbs(sobely)#取絕對(duì)值 show_photo('sobely',sobely)#分別計(jì)算x和y,再求和 sobelxy = cv2.addWeighted(sobelx,0.5,sobely,0.5,0)#進(jìn)行加權(quán)后相加,最好一個(gè)參數(shù)表示偏移量,一般默認(rèn)為0 show_photo('sobelxy',sobelxy)#### 不建議直接計(jì)算,最后的效果并不是特別好 #### 需要求梯度的時(shí)候分別計(jì)算然后求和效果會(huì)好些 sobelxy = cv2.Sobel(img,cv2.CV_64F,1,1,ksize = 3) sobelxy = cv2.convertScaleAbs(sobelxy) show_photo('sobelxy',sobelxy)原圖:
x軸方向,取絕對(duì)值:
y軸方向,取絕對(duì)值:
分別計(jì)算x和y,再求和:
直接計(jì)算:
不建議直接計(jì)算,最后的效果并不是特別好
需要求梯度的時(shí)候分別計(jì)算然后求和效果會(huì)好些
換一張照片來(lái)進(jìn)行梯度操作效果更明顯
import cv2 import numpy as npdef show_photo(name,picture):#顯示圖像函數(shù)cv2.imshow(name,picture)cv2.waitKey(0)cv2.destroyAllWindows()img = cv2.imread('E:\Jupyter_workspace\study\data/test1.png',cv2.IMREAD_GRAYSCALE) show_photo('img',img)#顯示原圖sobelx = cv2.Sobel(img,cv2.CV_64F,1,0,ksize = 3)#求X軸方向梯度 sobelx = cv2.convertScaleAbs(sobelx)#取絕對(duì)值 sobely = cv2.Sobel(img,cv2.CV_64F,0,1,ksize = 3)#求Y軸方向梯度 sobely = cv2.convertScaleAbs(sobely)#取絕對(duì)值 sobelxy = cv2.addWeighted(sobelx,0.5,sobely,0.5,0)#加權(quán)相加 show_photo('sobelxy',sobelxy)#顯示整體梯度后的效果img = cv2.imread('E:\Jupyter_workspace\study\data/test1.png',cv2.IMREAD_GRAYSCALE) sobelxy = cv2.Sobel(img,cv2.CV_64F,1,1,ksize = 3)#X軸和Y軸同時(shí)求方向梯度 sobelxy = cv2.convertScaleAbs(sobelxy) show_photo('sobelxy',sobelxy)原圖:
分別對(duì)X軸方向求梯度和Y軸方向求梯度,然后加權(quán)求和:
對(duì)X軸方向和Y軸方向同時(shí)求梯度:
總結(jié):對(duì)X軸和Y軸分別計(jì)算其梯度,然后加權(quán)求和效果會(huì)好些
總結(jié)
以上是生活随笔為你收集整理的11-图像梯度-Sobel算子的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 剑魂用什么武器
- 下一篇: 12-图像梯度-Scharr算子和lap