CV Sobel運算元簡介

2021-10-07 18:44:03 字數 3436 閱讀 8356

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

1​20

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−

1​00

0​12

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,對其求一...