在這一講中我們來學習一下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 運算元為例 作者...