再說邊緣特徵提取sobel運算元

2021-07-03 14:36:01 字數 3316 閱讀 5174

本文主要講述以下幾個函式的作用:

(1)cvsobel

(2)cvconvertscaleabs

(3)cvcvtcolor

首先,我們來了解一下計算機是如何檢測邊緣的。以灰度影象為例,它的理論基礎是這樣的,如果出現乙個邊緣,那麼影象的灰度就會有一定的變化,

為了方便假設由黑漸變為白代表乙個邊界

,那麼對其灰度分析,

在邊緣的灰度函式就是乙個一次函式

y=kx

,對其求一階導數就是其斜率k

,就是說邊緣的一階導數是乙個常數,

而由於非邊緣的一階導數為零,這樣通過求一階導數就能初步判斷影象的邊緣了

。通常是

x方向和

y方向的導數,也就是梯度。理論上計算機就是通過這種方式來獲得影象的邊緣。

但是,具體應用到影象中你會發現這個導數是求不了的,因為沒乙個準確的函式讓你去求導,而且計算機在求解析解要比求數值解麻煩得多,所以就想到了一種替代的方式來求導數。就是用乙個

3×3的視窗來對影象進行近似求導。

拿對x方向求導為例,某一點的導數為第三行的元素之和減去第一行元素之和,這樣就求得了某一點的近似導數。

其實也很好理解為什麼它就近似代表導數,導數就代表乙個變化率,從第一行變為第三行,灰度值相減,當然就是乙個變化率了。這就是所謂的

prewitt

運算元。這樣近似

x方向導數就求出來了。

y方向導數與

x方向導數求法相似,只不過是用第三列元素之和減去第一列元素之和。

x方向和

y方向導數有了,那麼梯度也就出來了。這樣就可以找出一幅圖中的邊緣了。

還有乙個問題,由於求的是

3×3中心點的導數,所以給第二列加了乙個權重,它的權重為

2,第一列和第三列的權重為

1,好了,這就是

sobel

運算元了。相比

prewitt

運算元,sobel

的抗噪能力更強。如圖所示:

這樣,中心點的

x方向導數就求出來了。

舉個例子吧。

x點以sobel

方式求導數

δx=1×50+2×30+1×50

-(1×50+2×30+1×50)=0

。這樣可以看出這個點不是邊界。

好了,了解了基本理論之後,我們看看

opencv

下的sobel

函式吧。

(1)void cvsobel( const cvarr* src, cvarr* dst, int xorder, intyorder, int aperture_size=3 );

src:輸入影象;

dst:輸出影象;

xorder:x

方向上的差分階數;

yorder:y

方向上的差分階數;

aperture_size

擴充套件sobel

核的大小(既視窗階數),必須是

1(注意這是乙個

3×1或

1×3向量而不是乙個方陣)

, 3, 5 或7

。 然後,因為以

sobel

方式求完導數後會有負值,還有會大於

255的值。而一開始建的

sobel

的影象是8位:

ipl_depth_8u

,也就是

8位無符號數,所以

sobel

建立的影象位數不夠,要

16位有符號的

,也就是

ipl_depth_16s

。因此需要建立影象為16位,需要這句

sobel= cvcreateimage (cvgetsize(frame) ,ipl_depth_16s,1);這樣子執行,才會不報錯,但是sobel影象顯示不出來,這是什麼原因呢?原來影象顯示是以8位無符號顯示的,現在是16位有符號,當然顯示會出問題了。所以還要將sobel轉為8位無符號。opencv裡提供了乙個函式,就是cvconvertscaleabs。

(2)cvconvertscaleabs( const cvarr* src, cvarr* dst, double scale=1, double shift=0);

src:源影象;

dst:目標影象;

scale

:轉化前乘的係數;

shift

轉化前加的係數。這樣新建乙個無符號影象再轉換就可以實現了。

iplimage*sobel8u=cvcreateimage(cvgetsize(sobel),ipl_depth_8u,1);

再在顯示影象前加上

cvconvertscaleabs(sobel,sobel8u,1,0);

這樣就可以看到

cvsobel

的效果了。可以看

x方向或

y方向求導是什麼效果。

最後講一下cvcvtcolor這個函式,

是opencv裡的顏色空間轉換函式,可以實現rgb顏色向hsv,hsi等顏色空間的轉換,也可以轉換為灰度影象。

引數cv_rgb2gray是rgb到gray,引數 cv_gray2rgb是gray到rgb

。處理結果是彩色的。

(3)void cvcvtcolor( const cvarr* src, cvarr* dst, int code );

src輸入的 8-bit,16-bit或 32-bit單倍精度浮點數影像。

dst輸出的8-bit, 16-bit或 32-bit單倍精度浮點數影像。

code

色彩空間轉換的模式,該code來實現不同型別的顏色空間轉換。比如:

cv_bgr2gray表示轉換為灰度圖,

cv_bgr2hsv將從rgb空間轉換為hsv空間。

其中當code選用cv_bgr2gray時,dst需要是單通道。

當code選用cv_bgr2hsv時,對於8點陣圖,需要將rgb值歸一化到0-1之間。

這樣得到hsv圖中的h範圍才是0-360,s和v的範圍是0-1。

現在,為了方便大家,我把完整的程式也放上來了。

**:

結果:

(完)

再說邊緣特徵提取sobel運算元

本文主要講述以下幾個函式的作用 1 cvsobel 2 cvconvertscaleabs 3 cvcvtcolor 首先,我們來了解一下計算機是如何檢測邊緣的。以灰度影象為例,它的理論基礎是這樣的,如果出現乙個邊緣,那麼影象的灰度就會有一定的變化,為了方便假設由黑漸變為白代表乙個邊界,那麼對其灰度...

邊緣特徵提取方法

邊緣檢測是圖形影象處理 計算機視覺和機器視覺中的乙個基本工具,通常用於特徵提取和特徵檢測,旨在檢測一張數字影象中有明顯變化的邊緣或者不連續的區域,在一維空間中,類似的操作被稱作步長檢測 step detection 邊緣是一幅影象中不同屈原之間的邊界線,通常乙個邊緣影象是乙個二值影象。邊緣檢測的目的...

邊緣特徵提取方法

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!邊緣檢測是圖形影象處理 計算機視覺和機器視覺中的乙個基本工具,通常用於特徵提取和特徵檢測,旨在檢測一張數字影象中有明顯變化的邊緣或者不連續的區域,在一維空間中,類似的操作被稱作步長檢測 step detection 邊緣是一幅影象中不同屈原之間的邊...