只做美食類目產(chǎn)品的網(wǎng)站谷歌play商店
Sobel算子是基于一階導數(shù)的離散差分算子,其中Sobel對于像素值的變化是十分敏感的,在進行邊緣檢測的時候,Sobel算子常用于對周圍像素的重要性進行檢測。
Sobel算子包括檢驗水平方向的算子和檢測豎直方向的算子
計算機梯度值的操作如下:
- 用
算子在圖像上進行卷積操作檢測水平邊緣。公式為:
- 用
算子在圖像上進行卷積操作檢測垂直邊緣。?公式為:
- 結(jié)合水平方向和垂直方向計算每一個梯度點的數(shù)值,公式為:
在OpenCV中可以cv2.Sobel()來計算圖像梯度值,其中格式為cv2.Sobel(src,depth,dx,dy,size),其中第一個參數(shù)src表示的是需要處理的圖像;第二個參數(shù)depth表示的是圖像的深度;第三個參數(shù)dx和第四個參數(shù)dy分別選擇水平和豎直方向;size表示的是Sobel算子的大小。
下面有這么一張圖像:
(1)水平方向梯度計算
對上圖計算進行卷積操作檢測水平方向邊緣:
import cv2
import matplotlib.pyplot as plt
import numpy as npimage=cv2.imread(r'D:/Photo/3.png')
sobelx_image=cv2.Sobel(img,cv2.CV_64F,1,0,ksize=3)
cv2.imshow('sobelx',sobelx_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
運行結(jié)果如下所示:
?
在上圖中會把負值截斷為0,因此我們需要添加一處操作:
sobelx_image=cv2.convertScaleAbs(sobelx_image)
#取絕對值操作
完整代碼為:
import cv2
import matplotlib.pyplot as plt
import numpy as npimage=cv2.imread(r'D:/Photo/3.png')
sobelx_image=cv2.Sobel(img,cv2.CV_64F,0,1,ksize=3)
sobelx_image=cv2.convertScaleAbs(sobelx_image)
cv2.imshow('sobelx',sobelx_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
運行結(jié)果如下所示:
對于存在梯度的像素來說,如果兩個圖像存在差異,那么右邊減去左邊的不為0,則有可能會正數(shù)或者有可能為負數(shù),因此需要取絕對值操作,此時像素點為一個大于0的正數(shù),像素點部位不是純黑色。
(2)豎直方向梯度計算
?同理可以對豎直方向進行梯度計算,代碼為:
import cv2
import matplotlib.pyplot as plt
import numpy as npimage=cv2.imread(r'D:/Photo/3.png')
sobelx_image=cv2.Sobel(img,cv2.CV_64F,0,1,ksize=3)
cv2.imshow('sobelx',sobelx_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
?運行結(jié)果如下所示:
(3)完整的梯度計算
完整的梯度計算需要分別將水平方向和垂直方向分別乘上各自權值再求和,例如將權值設置為0.5:
sobel=cv2.addWeighted(sobelx_image,0.5,sobely_image,0.5,0)
cv2.imshow('sobel',sobel)
cv2.waitKey(0)
cv2.destroyAllWindows()
運行結(jié)果如下所示:
為什么不直接使用?sobel_image=cv2.Sobel(img,cv2.CV_64F,1,1,ksize=3)呢?因為在OpenCV中如果直接設置dx和dy的方向均為1的話,那么可能會添加重影,疊加效果不是很好,因此不建議。