更多MATLAB圖像處理視頻請點擊 http://study.163.com/course/courseMain.htm?courseId=1003594013
所謂邊緣是指其周圍像素灰度有變化的那些像素的集合。邊緣廣泛存在於物體與背景之間、物體與物體之間、基元與基元之間。物體的邊緣是由灰度不連續所反映的。基於邊緣的分割代表了一大類基於圖像邊緣信息的方法,常用於圖像分割。
更多MATLAB圖像處理視頻請點擊 http://study.163.com/course/courseMain.htm?courseId=1003594013
1.邊緣檢測的基本原理及常用邊緣檢測算子
邊緣檢測的實質是採用某種算法來提取出圖像中對象與背景間的交界線。我們將邊緣定義爲圖像中灰度發生急劇變化的區域邊界。圖像灰度的變化情況可以用圖像灰度分佈的梯度來反映,因此我們可以用局部圖像微分技術來獲得邊緣檢測算子。經典的邊緣檢測方法是對原始圖像中像素的某小鄰域來構造邊緣檢測算子。以下是對幾種經典的邊緣檢測算子進行理論分析,並對各自的性能特點做出了比較和評價。
人們以這些理論爲依據,提出了許多算法,其中比較常用的邊緣檢測方法有差分邊緣檢測、Roberts 邊緣檢測算子、Sobel 邊緣檢測算子、Prewitt 邊緣檢測算子、Robinson 邊緣檢測算子、Laplace 邊緣檢測算子、Canny 算子和 LOG 算子等等。
(1)差分邊緣檢測方法
利用像素灰度的一階導數算子在灰度迅速變化處得到高值來進行奇異點的檢測。它在某一點的值就代表該點的“邊緣強度”,可以通過對這些值設置閾值來進一步得到邊緣圖像。然而,用差分檢測邊緣必須使差分的方向與邊緣方向垂直,這就需要對圖像的不同方向都進行差分運算,增加了實際運算的繁瑣性。
一般爲垂直邊緣、水平邊緣、對角線邊緣檢測,如下所示:
差分邊緣檢測方法是最原始、最基本的方法。根據灰度迅速變化處一階導數達到最大(階躍邊緣情況)原理,要求差分方向與邊緣方向垂直,利用導數算子檢測邊緣。這種算子具有方向性,運算繁瑣,目前很少採用。
(2)Roberts 邊緣檢測算子
Roberts 邊緣檢測算子根據任意一對互相垂直方向上的差分可用來計算梯度的原理,採用對角線方向相鄰兩像素之差,即:
適當選取門限 TH,並作如下判斷:如果 R(i, j)>TH,則(i, j)爲階躍狀邊緣點,{R(i, j)}爲邊緣圖像。
Roberts 算子採用對角線方向相鄰兩像素之差近似梯度幅值檢測邊緣。檢測水平和垂直邊緣的效果好於斜向邊緣,定位精度高,但對噪聲敏感。
(3)Sobel 邊緣檢測算子
數字圖像{f (i, j)}的每個像素,考察它上下左右鄰點灰度的加權差,與之接近的鄰點的權大。據此,定義 Sobel 算子如下:
適當選取門限 TH,並作如下判斷:如果 R(i, j)>TH,則(i, j)爲階躍狀邊緣點,{R(i, j)}爲邊緣圖像。
Sobel 算子很容易在空間上實現,Sobel 邊緣檢測器不但產生較好的邊緣檢測效果,而且受噪聲的影響也比較小。當使用大的鄰域時,抗噪性能會更好,但這樣會增加計算量,並且得出的邊緣也會相應變粗。
Sobel 算子利用像素點上下、左右鄰點的灰度加權算法,根據在邊緣點處達到極值這一現象進行邊緣的檢測。Sobel 算子對噪聲具有平滑作用,提供較爲精確的邊緣方向信息,但它同時也會檢測出許多僞邊緣,邊緣定位精度不夠高。當對精度要求不是很高時,它是一種較爲常用的邊緣檢測方法。
(4)Prewitt 邊緣檢測算子
Prewitt 邊緣檢測算子是一種邊緣樣板算子。這些算子樣板由理想的邊緣子圖像構成。依次用邊緣樣板去檢測圖像,與被檢測區域最爲相似的樣板給出最大值。用這個最大值作爲算子的輸出值 P(i, j),這樣可將邊緣像素檢測出來。
定義 Prewitt 邊緣檢測算子模板如下:
8個算子樣板所對應的邊緣方向如圖 所示。適當選取門限 TH,並作如下判斷:如果 P(i,j)>TH,則(i,j)爲階躍狀邊緣點,{P(i,j)}爲邊緣圖像。
(5)Robinson 邊緣檢測算子
Robinson 邊緣檢測算子也是一種邊緣樣板算子,其算法和 Prewitt 邊緣檢測算子相似,只是 8 個樣板不同,如圖所示。
(6)Laplace 邊緣檢測算子
Laplace 邊緣檢測算子是一種二階微分算子,對於數字圖像{ f (i,j)},它在圖像中的位置(i,j)的 Laplace 定義如下:
Laplace 邊緣檢測算子是無方向性的算子,它比前面所述的多個方向導數算子的計算量要小,因爲只用一個模板,且不必綜合各模板的值。計算數字圖像的 Laplace 值也是藉助各種模板卷積實現的。實現 Laplace 運算的幾種模板可見下圖。在數字圖像中,可用差分來近似微分運算,若選用圖 7-4 中的第一個檢測模板,則 f (i,j)的 Laplace 算子爲:
幾種常用的實現 Laplace 運算的檢測模板如圖所示。
由於 Laplace 算子是一種二階導數算子,對圖像中的噪聲相當敏感。另外它常產生雙像素寬的邊緣,且也不能提供邊緣方向的信息。由於以上原因,Laplace 算子很少直接用於檢測邊緣,而主要用於已知邊緣像素後確定該像素是在圖像的暗區或明區一邊。
2.各種邊緣檢測算子的 MATLAB 實現及效果比較
在 MATLAB 中可以由 edge 函數實現各算子對邊緣的檢測,以 Roberts 算子爲例,其語法格式如下:
BW=edge(I,’roberts’)
BW=edge(I,‘roberts’,thresh)
[BW,thresh]=edge(I,‘roberts’,⋯)
BW=edge(I,‘roberts’)自動選擇閾值用 Robert 算子進行邊緣檢測。
BW=edge(I,‘roberts’,thresh)根據所指定的敏感閾值 thresh 用 Robert 算子進行邊緣檢測,它忽略了所有小於閾值的邊緣。當 thresh 爲空時,自動選擇閾值
[BW,thresh]=edge(I,‘roberts’,⋯)返回閾值。
edge 函數對灰度圖像 I 進行邊緣檢測,返回與 I 同樣大的二值圖像 BW,其中 1 表示邊緣,0 表示非邊緣。I 是 unit8 型、unit16 型,或者是 double 型,BW 是 unit8 型。
其餘 Sobel 算子、Prewitt 算子、LOG 算子、Canny 算子的實現僅需將‘roberts’用‘sobel’、‘prewitt’、‘log’、‘canny’代替即可。
例:具體實現這幾個算子的一個例程
I=imread('cameraman.tif');
BW1 = edge(I,'sobel'); %應用 Sobel 算子進行濾波
BW2 = edge(I,'roberts'); %應用 Roberts 算子進行濾波
BW3 = edge(I,'prewitt'); %應用 Prewitt 算子進行濾波
BW4 = edge(I,'log'); %應用 LOG 算子進行濾波
BW5 = edge(I,'canny'); %應用 Canny 算子進行濾波
subplot(2,3,1),imshow(I),title('原圖');
>> subplot(2,3,2),imshow(BW1),title('Sobel算子邊緣檢測');
>> subplot(2,3,3),imshow(BW2),title('Roberts算子');
>> subplot(2,3,4),imshow(BW3),title('Priwitt算子');
>> subplot(2,3,5),imshow(BW4),title('LOG算子');
>> subplot(2,3,6),imshow(BW5),title('Canny算子');
更多MATLAB圖像處理視頻請點擊 http://study.163.com/course/courseMain.htm?courseId=1003594013