sobel運算元是一種常用的邊緣檢測演算法,是一種離散性差分運算元,用差分近似代替梯度。對x求1階差分用來檢測豎直邊緣,同樣的對y求1階差分用來檢測水平邊緣。
sobel運算元對垂直和水平方向上的排列表達的較好,但對於其他角度的表達往往不夠準確。
sobel運算元根據畫素點上下、左右鄰點灰度加權差,在邊緣處達到極值這一現象檢測邊緣。對雜訊具有平滑作用,提供較為精確的邊緣方向資訊,邊緣定位精度不夠高。當對精度要求不是很高時,是一種較為常用的邊緣檢測方法。
影象在某一點a的梯度,只需要計算其相鄰兩個畫素點的差值即可得到x方向y方向上的梯度;但為了更加合理的判斷某一點的梯度大小,需要借助運算元為這個以點a為中心的ksize×ksize區域(也即核心,一般是ksize取3或5或者其他奇數)新增權重,來擴大差異,增強邊緣檢測效果。離中心點越近的畫素權重越大,越重要。
因為計算一點的梯度需要借助周邊區域的多個點的灰度值,因而對影象中的噪點比較敏感,因此時常在呼叫sobel方法進行計算之前,需要先借助高斯濾波器或者其他濾波器對原影象進行平滑\模糊處理以降噪。所以完整的sobel梯度計算過程是:
高斯濾波器對原影象平滑降噪gaussianblur;
轉灰度圖cvtcolor;
求x和y方向的梯度sobel。
當核心為3*3時,橫向和縱向方向上的卷積因子分別為:
s ob
elx=
[−10
1−20
2−10
1]sobel_x=\left[ \begin -1 & 0 & 1 \\ -2 & 0 & 2 \\ -1 & 0 & 1 \end \right]
sobelx
=⎣⎡
−1−
2−1
000
121
⎦⎤sob
ely=
[−12
−100
0121
]sobel_y=\left[ \begin -1 & 2 & -1 \\ 0 & 0 & 0 \\ 1 & 2 & 1 \end \right]
sobely
=⎣⎡
−10
120
2−1
01⎦
⎤假設原影象為a=[
f(x−
1,y−
1)f(
x,y−
1)f(
x+1,
y−1)
f(x−
1,y)
f(x,
y)f(
x+1,
y)f(
x−1,
y+1)
f(x,
y+1)
f(x+
1,y+
1)]a=\left[ \begin f(x-1,y-1) & f(x,y-1) & f(x+1,y-1) \\ f(x-1,y) & f(x,y) & f(x+1,y) \\ f(x-1,y+1) & f(x,y+1) & f(x+1,y+1) \end \right]
a=⎣⎡f
(x−1
,y−1
)f(x
−1,y
)f(x
−1,y
+1)
f(x,
y−1)
f(x,
y)f(
x,y+
1)f
(x+1
,y−1
)f(x
+1,y
)f(x
+1,y
+1)
⎦⎤,分別做卷積可以得到:
g x=
sobe
lx∗a
=[−1
01−2
02−1
01]∗
ag_x=sobel_x*a=\left[ \begin -1 & 0 & 1 \\ -2 & 0 & 2 \\ -1 & 0 & 1 \end \right]*a
gx=so
belx
∗a=
⎣⎡−
1−2−
100
012
1⎦⎤
∗agy=
sobe
ly∗a
=[−1
2−10
0012
1]∗a
g_y=sobel_y*a=\left[ \begin -1 & 2 & -1 \\ 0 & 0 & 0 \\ 1 & 2 & 1 \end \right]*a
gy=so
bely
∗a=
⎣⎡−
101
202
−101
⎦⎤
∗a注意:
由上述公式計算得到gy和gx後,可以計算得到g的值:
或者採用簡便演算法:
乙個點的g的代表該點的梯度,如果大於某一設定範圍則認為該點是邊緣點。
如果為一幅影象有豎直邊緣,該豎直邊緣的水平兩側灰度將存在差異,同理如果存在水平邊緣,該邊緣的垂直兩側灰度將存在差異,sobel運算元利用這種差異實現豎直邊緣和水平邊緣的檢測。
下面左圖表示用大於一定閾值的gx來識別邊緣點的結果,中圖為用大於一定閾值的gy來識別邊緣點的結果,右圖為用大於一定閾值的g來識別邊緣點的結果。
在c++中,opencv的sobel函式如下:
cv_exports_w void
sobel
( inputarray src,
outputarray dst,
int ddepth,
int dx,
int dy,
int ksize=3,
double scale=1,
double delta=0,
int bordertype=border_default )
;
在python中,通過cv2.sobel
來呼叫sobel函式如下:
dst = cv2.sobel(src, ddepth, dx, dy[
, dst[
, ksize[
, scale[
, delta[
, bordertype]]]]])
引數具體含義:
具體基於python和c++的邊緣檢測**參考sobel運算元原理與實現。
opencv sobel運算元水平和垂直方向導數問題
sobel運算元原理與實現
harris角點檢測數學計算過程與cornerharris方法引數的一點說明【datawhale學習記錄】
Sobel運算元及cvSobel
由於專案裡要用到邊緣檢測,所以今天研究了一下最簡單的梯度的方法。首先,我們來開一下計算機是如何檢測邊緣的。以灰度影象為例,它的理論基礎是這樣的,如果出現乙個邊緣,那麼影象的灰度就會有一定的變化,為了方便假設由黑漸變為白代表乙個邊界,那麼對其灰度分析,在邊緣的灰度函式就是乙個一次函式y kx,對其求一...
Sobel運算元及cvSobel
由於專案裡要用到邊緣檢測,所以今天研究了一下最簡單的梯度的方法。首先,我們來開一下計算機是如何檢測邊緣的。以灰度影象為例,它的理論基礎是這樣的,如果出現乙個邊緣,那麼影象的灰度就會有一定的變化,為了方便假設由黑漸變為白代表乙個邊界,那麼對其灰度分析,在邊緣的灰度函式就是乙個一次函式y kx,對其求一...
Sobel運算元及cvSobel
由於專案裡要用到邊緣檢測,所以今天研究了一下最簡單的梯度的方法。首先,我們來開一下計算機是如何檢測邊緣的。以灰度影象為例,它的理論基礎是這樣的,如果出現乙個邊緣,那麼影象的灰度就會有一定的變化,為了方便假設由黑漸變為白代表乙個邊界,那麼對其灰度分析,在邊緣的灰度函式就是乙個一次函式y kx,對其求一...