影像梯度
梯度:
對于影像,我們選定一定范圍(可能是點邊界,線邊界,閉合邊界),對于邊界到邊界影像像素點像素值的變化我們稱之為梯度,
Sobel算子
概念:
Sobel算子主要用于獲得數字影像的一階梯度,常見的應用和物理意義是邊緣檢測,Sobel算子是把影像中每個像素的上下左右四領域的灰度值加權差,在邊緣處達到極值從而檢測邊緣,
Sobel算子不但產生較好的檢測效果,而且對噪聲具有平滑抑制作用,但是得到的邊緣較粗,且可能出現偽邊緣,
核心公式
該算子包含兩組3x3的矩陣,分別為橫向及縱向,將之與影像作平面卷積,即可分別得出橫向及縱向的亮度差分近似值,如果以A代表原始影像,
G
x
G_x
Gx?及
G
y
G_y
Gy?分別代表經橫向及縱向邊緣檢測的影像,其公式如下:

前者
G
x
G_x
Gx?用于計算水平梯度,而后者
G
y
G_y
Gy?則用于計算垂直梯度,
注意:這里并不是矩陣的乘法,而是卷積即對應位置相乘運算,
影像的每一個像素的橫向及縱向梯度近似值可用以下的公式結合,來計算梯度的大小,

然后可用以下公式計算梯度方向,

下面介紹Sobel算子的語法:
dst = cv2.Sobel(src, ddepth, dx, dy, ksize)
引數:src就是計算的影像,ddepth為影像的深度,dx,dy表示是水平方向還是豎直方向,ksize表示Sobel算子的大小即上述進行矩陣卷積運算的矩陣規格大小,
這里給大家展示以下影像經過梯度運算的效果:
原影像:

經過梯度運算
sobelx = cv2.Sobel(img,cv2.CV_64F,1,0,ksize=3)
得到的影像:

這里我們可以看到dx我們取為1dy取0表示進行的是進行水平梯度運算,而我們發現運算過后的影像“邊緣”,好像僅有原圖的一半,那是因為通過Sobel算子的公式我們可以看到,對于水平梯度計算簡單的看做右邊減左邊,對于原圖的左邊緣,邊緣左邊為黑即像素值為0,右邊為白即像素值為255,進行運算得到邊緣的像素值為正,而對于右邊邊緣,右邊邊緣的左邊為255右邊為0,進行運算得到的像素值為負,而在Opencv中會默認做一個截斷,即凡小于0的像素值均取0,所以右半邊邊緣經過梯度計算后全部為0即為黑色不做顯示,
我們可以通過Opencv中取絕對值的方法來得到完整邊緣,下面展示豎直方向取過絕對值之后的計算結果
sobely = cv2.Sobel(img,cv2.CV_64F,0,1,ksize=3)#豎直方向梯度計算
sobely = cv2.convertScaleAbs(sobely) #取絕對值

這里是不建議dx與dy即水平與垂直同時進行計算,因為這兩種計算的計算結果都會影響彼此,從而使進行梯度運算變得模糊,在直觀上好像是水平梯度與豎直梯度“融合的不太好”,
sobelxy=cv2.Sobel(img,cv2.CV_64F,1,1,ksize=3)
sobelxy = cv2.convertScaleAbs(sobelxy)

如果有需要我們可以直接通過Opencv自帶的加權加法進行合并兩圖,
Scharr算子和laplacian算子
Scharr算子
Scharr算子整體思路與Sobel算子沒有區別,但是在計算上Scharr算子公式中數值更大,更加注重規定方向的影響,榷訓了邊緣(矩陣邊緣不是影像邊緣)的影響,
Scharr算子的計算公式

laplacian算子
laplacian算子具體思想與推導比較復雜就不給大家做演示了,它與前面提到的算子主要區別是前面算子都停留在一階導的層面,而laplacian算子中提到了二階導,所以laplacian算子相比于前面的算子會對“變化”會更加敏感,展現出來“變化”較大的地方會更加明顯,但是因為對變化過于敏感,所以對于噪音點laplacian算子處理就不是很好,所以laplacian算子通常不會單獨使用,
由公式也可以看出laplacian算子更注重于變化而不是強調方位,
laplacian算子的計算公式

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/402581.html
標籤:其他
