【OpenCV】邊緣檢測:Sobel、拉普拉斯算子

【OpenCV】邊緣檢測:Sobel、拉普拉斯算子

邊緣(edge)是指圖像局部強度變化最顯著的部分。主要存在於目標與目標、目標與背景、區域與區域(包括不同色彩)之間,是圖像分割、紋理特徵和形狀特徵等圖像分析的重要基礎。

圖像強度的顯著變化可分爲:

  • 階躍變化函數,即圖像強度在不連續處的兩邊的像素灰度值有着顯著的差異;
  • 線條(屋頂)變化函數,即圖像強度突然從一個值變化到另一個值,保持一較小行程後又回到原來的值。

圖像的邊緣有方向和幅度兩個屬性,沿邊緣方向像素變化平緩,垂直於邊緣方向像素變化劇烈.邊緣上的這種變化可以用微分算子檢測出來,通常用一階或二階導數來檢測邊緣。

(a)(b)分別是階躍函數和屋頂函數的二維圖像;(c)(d)是階躍和屋頂函數的函數圖象;(e)(f)對應一階倒數;(g)(h)是二階倒數。

 

一階導數法:梯度算子

對於左圖,左側的邊是正的(由暗到亮),右側的邊是負的(由亮到暗)。對於右圖,結論相反。常數部分爲零。用來檢測邊是否存在。

梯度算子 Gradient operators

函數f(x,y)在(x,y)處的梯度爲一個向量:

計算這個向量的大小爲:

近似爲:

梯度的方向角爲:

 

Sobel算子

sobel算子的表示:

 

梯度幅值:

用卷積模板來實現:

【相關代碼】

接口

  1. CV_EXPORTS_W void Sobel( InputArray src, OutputArray dst, int ddepth,  
  2.                          int dx, int dy, int ksize=3,  
  3.                          double scale=1, double delta=0,  
  4.                          int borderType=BORDER_DEFAULT );  

使用

  1. /////////////////////////// Sobe l////////////////////////////////////  
  2. /// Generate grad_x and grad_y  
  3. Mat grad_x, grad_y;  
  4. Mat abs_grad_x, abs_grad_y;  
  5. /// Gradient X  
  6. //Scharr( src_gray, grad_x, ddepth, 1, 0, scale, delta, BORDER_DEFAULT );  
  7. //Calculates the first, second, third, or mixed image derivatives using an extended Sobel operator.  
  8. Sobel( src_gray, grad_x, ddepth, 1, 0, 3, scale, delta, BORDER_DEFAULT );     
  9. convertScaleAbs( grad_x, abs_grad_x );  
  10. /// Gradient Y    
  11. //Scharr( src_gray, grad_y, ddepth, 0, 1, scale, delta, BORDER_DEFAULT );  
  12. Sobel( src_gray, grad_y, ddepth, 0, 1, 3, scale, delta, BORDER_DEFAULT );     
  13. convertScaleAbs( grad_y, abs_grad_y );  
  14. /// Total Gradient (approximate)  
  15. addWeighted( abs_grad_x, 0.5, abs_grad_y, 0.5, 0, grad );  


二階微分法:拉普拉斯

二階微分在亮的一邊是負的,在暗的一邊是正的。常數部分爲零。可以用來確定邊的準確位置,以及像素在亮的一側還是暗的一側。


LapLace 拉普拉斯算子

二維函數f(x,y)的拉普拉斯是一個二階的微分,定義爲:

其中:

可以用多種方式將其表示爲數字形式。對於一個3*3的區域,經驗上被推薦最多的形式是:

定義數字形式的拉普拉斯要求係數之和必爲0

 

【相關代碼】

接口

  1. CV_EXPORTS_W void Laplacian( InputArray src, OutputArray dst, int ddepth,  
  2.                              int ksize=1, double scale=1, double delta=0,  
  3.                              int borderType=BORDER_DEFAULT );  

使用

  1. Mat abs_dst,dst;  
  2.   int scale = 1;  
  3.   int delta = 0;  
  4.   int ddepth = CV_16S;  
  5.   int kernel_size = 3;   
  6.   Laplacian( src_gray, dst, ddepth, kernel_size, scale, delta, BORDER_DEFAULT );  
  7.   convertScaleAbs( dst, abs_dst );  
  8.   namedWindow( window_name2, CV_WINDOW_AUTOSIZE );  


實踐效果

原圖

注意,邊緣檢測對噪聲比較敏感,需要先用高斯濾波器對圖像進行平滑。參考博文:【OpenCV】鄰域濾波:方框、高斯、中值、雙邊濾波

Sobel 邊緣檢測

Sobel算子可以直接計算Gx 、Gy可以檢測到邊的存在,以及從暗到亮,從亮到暗的變化。僅計算| Gx |,產生最強的響應是正交 於x軸的邊; | Gy |則是正交於y軸的邊。

 

Laplace邊緣檢測

拉普拉斯對噪聲敏感,會產生雙邊效果。不能檢測出邊的方向。通常不直接用於邊的檢測,只起輔助的角色,檢測一個像素是在邊的亮的一邊還是暗的一邊利用零跨越,確定邊的位置。


轉載請註明出處:http://blog.csdn.net/xiaowei_cqu/article/details/7829481

實驗代碼下載:http://download.csdn.net/detail/xiaowei_cqu/4475976


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章