梯度,sobel運算元的理解

2021-08-31 16:11:20 字數 2568 閱讀 9391

在這一講中我們來學習一下opencv中最基本的邊緣檢測的知識,首先我們來介紹一下影象梯度

1.影象梯度

可以把影象看成二維離散函式,影象梯度其實就是這個二維離散函式的求導:

影象梯度:

梯度運算元 gradient operators

函式f(x,y)在(x,y)處的梯度為乙個向量:

計算這個向量的大小為:

近似為:

梯度的方向角為:

影象梯度: g(x,y) = dx i + dy j;

dx(i,j) = i(i+1,j) - i(i,j);

dy(i,j) = i(i,j+1) - i(i,j);

其中,i是影象畫素的值(如:rgb值),(i,j)為畫素的座標。

影象梯度一般也可以用中值差分:

dx(i,j) = [i(i+1,j) - i(i-1,j)]/2;

dy(i,j) = [i(i,j+1) - i(i,j-1)]/2;

影象邊緣一般都是通過對影象進行梯度運算來實現的。

影象梯度的最重要性質是,梯度的方向在影象灰度最大變化率上,它恰好可以反映出影象邊緣上的灰度變化 

上面說的是簡單的梯度定義,其實還有更多更複雜的梯度公式。

2.邊緣檢測

關於邊緣的細節知識,請參考博主

下面讓我們來看一下邊緣檢測中常用的一些運算元:

sobel運算元邊緣檢測演算法

索貝爾運算元(sobel operator)主要用作邊緣檢測,在技術上,它是一離散性差分運算元,用來運算影象亮度函式的灰度之近似值。在影象的任何一點使用此運算元,將會產生對應的灰度向量或是其法向量

sobel卷積因子為:

具體計算如下:

gx = (-1)*f(x-1, y-1) + 0*f(x,y-1) + 1*f(x+1,y-1)

+(-2)*f(x-1,y) + 0*f(x,y)+2*f(x+1,y)

+(-1)*f(x-1,y+1) + 0*f(x,y+1) + 1*f(x+1,y+1)

= [f(x+1,y-1)+2*f(x+1,y)+f(x+1,y+1)]-[f(x-1,y-1)+2*f(x-1,y)+f(x-1,y+1)]

gy =1* f(x-1, y-1) + 2*f(x,y-1)+ 1*f(x+1,y-1)

+0*f(x-1,y) 0*f(x,y) + 0*f(x+1,y)

+(-1)*f(x-1,y+1) + (-2)*f(x,y+1) + (-1)*f(x+1, y+1)

= [f(x-1,y-1) + 2f(x,y-1) + f(x+1,y-1)]-[f(x-1, y+1) + 2*f(x,y+1)+f(x+1,y+1)]

其中f(a,b), 表示影象(a,b)點的灰度值;

sobel運算元根據畫素點上下、左右鄰點灰度加權差,在邊緣處達到極值這一現象檢測邊緣。對雜訊具有平滑作用,提供較為精確的邊緣方向資訊,邊緣定位精度不夠高。當對精度要求不是很高時,是一種較為常用的邊緣檢測方法。

其實在邊緣檢測中還會用到很多運算元,如普利維特運算元(prewitt operate);羅伯茨交叉邊緣檢測(roberts cross operator);拉普拉斯運算元等等。

2.opencv中sobel運算元實現邊緣檢測效果圖

先上效果圖:

當然,opencv中其實上面的**完全可以用

void cvsobel( const cvarr* src, cvarr* dst, int xorder, int yorder, int aperture_size=3 );
**如下

#include

"cv.h"

#include

"highgui.h"

#include

"math.h"

#include

"stdio.h"

#include

"malloc.h"

iplimage *image;

//宣告iplimage指標

int height, width;

cvscalar s;

int sobel_y[

9] = ;

//y方向sobel運算元

int sobel_x[

9] = ;

//x方向sobel運算元

void

sobel

()

}for (i =

1; i1; i++)

} free(data);

}int

main

(int argc, char** argv)

sobel運算元講解

sobel運算元是區分x,y兩種運運算元的,再通過將sobel運運算元與原圖進行卷積運算之後得出兩個矩陣所含資訊也不相同,對於複雜圖形很難看出兩者之間的差距,對於簡單的圖形 則可以看出較明顯差異,通過運算後得出 可以看出x,y只能檢測出各個方向上的資訊,所以最後還是需要通過相加得到完整的邊緣資訊。i...

梯度和Sobel導數

乙個最重要並且最基本的卷積是導數的計算 或者是其近似值 用來表達微分的最常用的操作是sobel微分運算元。sobel運算元包含任意階的微分及融合偏導。sobel導數可以定義任意大小的核,而且這些核可以用快速且迭代的方式構造,大核對導數有更好的逼近,因為小核對雜訊更敏感。必須認識到,sobel導數並不...

對於Sobel運算元的學習

本來想說很多目前對於 sobel 運算元的認識,但最終還是覺得對於其掌握程度太低,沒有乙個系統的理解,遠不足以寫部落格,但為了12月不至於零輸出,還是決定把自己學習過程中找到的相關資料進行分享。等到一月底時間充裕的時候再來完成本文。資料 徹底理解數字影象處理中的卷積 以 sobel 運算元為例 作者...