Laplace算子

背景簡述

在圖像處理,我們知道經常把Laplace算子作爲邊緣檢測之一,也是工程數學中常用的一種積分變換。本節主要介紹Laplacian 算子相關的知識。

基本理論

首先,拉普拉斯算子是最簡單的各向同性微分算子,它具有旋轉不變性。一個二維圖像函數的拉普拉斯變換是各向同性的二階導數,定義爲:

用更加形象的圖像來解釋,假設我們有一張一維圖形。下圖(a)中灰度值的”躍升”表示邊緣的存在.如果使用一階微分求導我們可以更加清晰的看到邊緣”躍升”的存在(這裏顯示爲高峯值)圖(b); 如果在邊緣部分求二階導數會出現什麼情況?,圖(c)所示。(其圖片和定義公式來源於http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/tutorials/imgproc/imgtrans/laplace_operator/laplace_operator.html)。

  

(a)                                                                                                          (b)

(c)

你會發現在一階導數的極值位置,二階導數爲0。所以我們也可以用這個特點來作爲檢測圖像邊緣的方法。 但是, 二階導數的0值不僅僅出現在邊緣(它們也可能出現在無意義的位置),但是我們可以過濾掉這些點。

爲了更適合於數字圖像處理,將該方程表示爲離散形式:

另外,拉普拉斯算子還可以表示成模板的形式,以便更好編程需要。如圖1所示。

圖1(a)表示離散拉普拉斯算子的模板,圖1(b)表示其擴展模板,圖1(c)則分別表示其他兩種拉普拉斯的實現模板。從模板形式容易看出,如果在圖像中一個較暗的區域中出現了一個亮點,那麼用拉普拉斯運算就會使這個亮點變得更亮。因爲圖像中的邊緣就是那些灰度發生跳變的區域,所以拉普拉斯銳化模板在邊緣檢測中很有用。一般增強技術對於陡峭的邊緣和緩慢變化的邊緣很難確定其邊緣線的位置。但此算子卻可用二次微分正峯和負峯之間的過零點來確定,對孤立點或端點更爲敏感,因此特別適用於以突出圖像中的孤立點、孤立線或線端點爲目的的場合。同梯度算子一樣,拉普拉斯算子也會增強圖像中的噪聲,有時用拉普拉斯算子進行邊緣檢測時,可將圖像先進行平滑處理。

圖像銳化處理的作用是使灰度反差增強,從而使模糊圖像變得更加清晰。圖像模糊的實質就是圖像受到平均運算或積分運算,因此可以對圖像進行逆運算,如微分運算能夠突出圖像細節,使圖像變得更爲清晰。由於拉普拉斯是一種微分算子,它的應用可增強圖像中灰度突變的區域,減弱灰度的緩慢變化區域。因此,銳化處理可選擇拉普拉斯算子對原圖像進行處理,產生描述灰度突變的圖像,再將拉普拉斯圖像與原始圖像疊加而產生銳化圖像。拉普拉斯銳化的基本方法可以由下式表示:

這種簡單的銳化方法既可以產生拉普拉斯銳化處理的效果,同時又能保留背景信息,將原始圖像疊加到拉普拉斯變換的處理結果中去,可以使圖像中的各灰度值得到保留,使灰度突變處的對比度得到增強,最終結果是在保留圖像背景的前提下,突現出圖像中小的細節信息。但其缺點是對圖像中的某些邊緣產生雙重響應。

參考代碼

OpenCV版Laplace算子

[cpp] view plain copy

 

  1. #include "cv.h"  
  2. #include "highgui.h"  
  3.   
  4. using namespace cv;  
  5.   
  6. int main(int argc, char* argv[])  
  7. {  
  8.         Mat src = imread("test.jpg");  
  9.         Mat dst;  
  10.       
  11.         Laplacian(src,dst,src.depth());  
  12.         imwrite("laplacian.jpg",dst);  
  13.   
  14.         imshow("dst",dst);  
  15.         waitKey();  
  16.   
  17.         return 0;  
  18. }  

OpenCV-Python版Laplacian

[cpp] view plain copy

 

  1. #coding=utf-8    
  2. import cv2    
  3. import numpy as np      
  4.     
  5. img = cv2.imread("test.jpg", 0)    
  6. gray_lap = cv2.Laplacian(img,cv2.CV_16S,ksize = 3)    
  7. dst = cv2.convertScaleAbs(gray_lap)    
  8.     
  9. cv2.imshow('laplacian',dst)    
  10. cv2.waitKey(0)    
  11. cv2.destroyAllWindows()   

OpenCV-Python版LaplaceOperater

[cpp] view plain copy

 

  1. import cv2    
  2. import numpy as np    
  3.         
  4. kernel_size = 3    
  5. scale = 1    
  6. delta = 0    
  7. ddepth = cv2.CV_16S    
  8.         
  9. img = cv2.imread('test.jpg')    
  10. img = cv2.GaussianBlur(img,(3,3),0)    
  11. gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)    
  12.         
  13. gray_lap = cv2.Laplacian(gray,ddepth,ksize = kernel_size,scale = scale,delta = delta)    
  14. dst = cv2.convertScaleAbs(gray_lap)    
  15.         
  16. cv2.imshow('laplaceOperater',dst)  
  17. cv2.waitKey(0)    
  18. cv2.destroyAllWindows()    

輸出測試

原始圖像所示:

OpenCV-Python版Laplacian輸出圖像所示:

OpenCV-Python版LaplaceOperater輸出圖像所示:

由圖可以看出,將原始圖像通過拉普拉斯變換後增強了圖像中灰度突變處的對比度,使圖像中小的細節部分得到增強並保留了圖像的背景色調,使圖像的細節比原始圖像更加清晰。基於拉普拉斯變換的圖像增強已成爲圖像銳化處理的基本工具。

參考文獻

[1] Milan Sonka ,Vaclav Hlavac, Roger Boyle, "Image Procssing ,analysis and Machine Vision".

[2] Richard Szelisi,"Computer Vision Algorithms and Applications".

 

關於Image Engineering & Computer Vision的更多討論與交流,敬請關注本博和新浪微博songzi_tea.

 

文章轉自:http://blog.csdn.net/songzitea/article/details/12842825

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