基於matlab的邊緣提取方法的比較

Peter-Young發表於2017-03-01
1、Matlab簡述
Matlab是國際上最流行的科學與工程計算的軟體工具,它起源於矩陣運算,已經發展成一種高度整合的計算機語言。有人稱它為“第四代”計算機語言,它提供了強大的科學運算、靈活的程式設計流程、高質量的圖形視覺化介面設計、便捷的與其它程式和語言介面的功能。隨著Matlab語言功能越來越強大,不斷適應新的要求並提出新的解決方法,可以預見,在科學運算,自動控制與科學繪圖領域,Matlab語言將長期保持其獨一無二的地位。

2、幾種常用的邊緣檢測運算元
邊緣是影象的最重要的特徵,。邊緣是指周圍畫素灰度有階躍變化或屋頂變化的那些畫素的集合。邊緣檢測主要是灰度變化的度量、檢測和定位。有很多種不同的邊緣檢測方法,同一種方法使用的濾波器也不盡相同。影象邊緣檢測就是研究更好的邊緣檢測方法和檢測運算元。
邊緣檢測的基本思想首先是(1)利用邊緣增強運算元,突出影象中的區域性邊緣,(2)然後定義象素的“邊緣強度”,通過設定閾值的方法提取邊緣點集。由於噪聲和模糊的存在,監測到的邊界可能會變寬或在某點處發生間斷。因此,邊界檢測包括兩個基本內容:
i.         用邊緣運算元提取出反映灰度變化的邊緣點集
ii.        在邊緣點集合中剔除某些邊界點或填補邊界間斷點,並將這些邊緣連線成完整的線
常用的檢測運算元有微分運算元、拉普拉斯高斯運算元和canny運算元。
在Matlab影象處理工具箱中,提供了edge函式利用以上運算元來檢測灰度影象的邊緣。

2.1微分運算元法
   經典的邊緣提取方法是考察影象的每個畫素的某個鄰域內灰度的變化,利用邊緣鄰近一階或二階方向導數變化規律,用簡單的方法檢測邊緣,稱為微分運算元法
導數運算元具有突出灰度變化的作用,對影象運用導數運算元,灰度變化較大的點處算得的值較高,因此我們將影象的導數運算元運算值作為相應的邊界強度,所以可以通過對這些導數值設定閾值,提取邊界的點集。
一階導數是最簡單的導數運算元。已知在點f(x,y)處,梯度grad(F(x,y))的幅度為:

它們分別求出了灰度在x和y方向上的變化率,但是要對每一個畫素進行以上的運算,運算量較大,所以在實際應用中常用小區域模板卷積運算來進行近似計算。模板運算的想法是將賦予某一個畫素的值作為它本身灰度值和相鄰象素灰度值的函式。運用中,對x,y方向各用一個模板。

2.1.1 Sobel運算元
Sobel運算元是濾波運算元的形式來提取邊緣。X,Y方向各用一個模板,兩個模板組合起來構成1個梯度運算元。X方向模板對垂直邊緣影響最大,Y方向模板對水平邊緣影響最大。

圖1 Sobel運算元模板
2.1.2 robert運算元
   Robert運算元是一種梯度運算元,它用交叉的差分表示梯度,是一種利用區域性差分運算元尋找邊緣的運算元,對具有陡峭的低噪聲的影象效果最好:
模板如圖:
 
                 
    
圖2 Robert運算元模板

2.1.3 prewitt運算元 
   prewitt運算元是加權平均運算元,對噪聲有抑制作用,但是畫素平均相當於對影象進行地同濾波,所以prewitt運算元對邊緣的定位不如robert運算元。模板如圖;
     
圖3 prewitt運算元模板

程式碼如下:
原始影象為三位編織複合材料二維截面圖,對原始影象進行前期處理
i=imread('d1.jpg');
i2=im2double(i);
ihd=rgb2gray(i2);
[thr,sorh,keepapp]=ddencmp('den','wv',ihd);
ixc=wdencmp('gbl',ihd,'sym4',2,thr,sorh,keepapp);
figure,imshow(ixc),title('消噪後影象 ');
k2=medfilt2(ixc,[7 7]);
figure,imshow(k2),title('中值濾波');
isuo=imresize(k2,0.25,'bicubic');
  
%sobert、robert和prewitt運算元檢測影象邊緣
esobel=edge(isuo,'sobel');
erob=edge(isuo,'roberts');
eprew=edge(isuo,'prewitt');
subplot(2,2,1);
imshow(isuo);title('前期處理影象');
subplot(2,2,2);
imshow(esobel);title('sobel運算元提取');
subplot(2,2,3);
imshow(erob);title('roberts運算元提取');
subplot(2,2,4);
imshow(eprew);title('prewitt運算元提取');

 圖4 微分運算元邊緣檢測結果

2.2 Laplacian運算元
   拉普拉斯高斯運算元是一種二階導數運算元,將在邊緣處產生一個陡峭的零交叉。前面介紹的幾種梯度法具有方向性,不能對各種走向的邊緣都具有相同的增強效果。但是Laplacian運算元是各向同性的,能對任何走向的界線和線條進行銳化,無方向性。這是拉普拉斯運算元區別於其他演算法的最大優點。
對一個連續函式
,它在位置
的拉普拉斯運算元定義如下:

在影象邊緣檢測中,為了運算方便,函式的拉普拉斯高斯運算元也是藉助模板來實現的。其模板有一個基本要求:模板中心的係數為正,其餘相鄰係數為負,所有係數的和應該為零。

      5 Laplacian運算元模板

2.3  Canny邊緣檢測法
     Canny邊緣檢測是一種比較新的邊緣檢測運算元,具有很好的邊緣監測效能,在影象處理中得到了越來越廣泛的應用。它依據影象邊緣檢測最優準則設計canny邊緣檢測演算法:
(1)       首先用2D高斯濾波模板進行卷積以消除噪聲
(2)       利用導數運算元找到影象灰度地沿著兩個方向的偏導數
,並求出梯度的大小:  
(3)       利用(2)的結果計算出梯度的方向

(4)       一旦知道了邊緣的方向,就可以把邊緣的梯度方向大致分為四種:水平、豎直、45度方向、135度方向。通過梯度的方向,就可以找到這個畫素梯度方向的鄰接畫素。
(5)       遍歷影象,若某個畫素的灰度值與其梯度方向上前後兩個畫素的灰度值相比不是最大的,那麼這個畫素值置為0,即不是邊緣。
(6)       使用累計直方圖計算兩個閾值,大於高閾值的一定是邊緣,小於低閾值的一定不是邊緣,介於之間的,看這個畫素的鄰接畫素中有沒有超過高閾值的邊緣畫素,如果有的話那麼它
就是邊緣了,否則它就不是邊緣。
呼叫Laplacian運算元、canny運算元檢測法檢測影象邊緣的程式如下:
elog=edge(isuo,'log');
ecanny=edge(isuo,'canny');
subplot(1,2,1);
imshow(elog);title('log運算元提取');
subplot(1,2,2);
imshow(ecanny);title('canny運算元提取');
圖6 canny運算元、Laplacian運算元檢測結果

3.邊緣檢測結果比較
Roberts運算元檢測方法對具有陡峭的低噪聲的影象處理效果較好,但是利用roberts運算元提取邊緣的結果是邊緣比較粗,因此邊緣的定位不是很準確。
Sobel運算元檢測方法對灰度漸變和噪聲較多的影象處理效果較好,sobel運算元對邊緣定位不是很準確,影象的邊緣不止一個畫素。
Prewitt運算元檢測方法對灰度漸變和噪聲較多的影象處理效果較好。但邊緣較寬,而且間斷點多。
Laplacian運算元法對噪聲比較敏感,所以很少用該運算元檢測邊緣,而是用來判斷邊緣畫素視為與影象的明區還是暗區。
Canny方法不容易受噪聲干擾,能夠檢測到真正的弱邊緣。優點在於,使用兩種不同的閾值分別檢測強邊緣和弱邊緣,並且當弱邊緣和強邊緣相連時,才將弱邊緣包含在輸出影象中。
參考文獻
[1] 趙春暉.現代影象處理技術及Matlab實現[M].北京:人民郵電出版社,2001.
[2] 阮秋琦.數字影象處理學[M].北京:電子工業出版社,2001.
[3] 何斌.數字影象處理[M].北京:人民郵電出版社,2001

I=imread('lena.bmp');%  提取影象
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運算元進行邊緣檢測
h=fspecial('gaussian’,5);
BW6=edge(I,’canny’);
subplot(2,3,1), imshow(BW1);
title(‘sobel edge check’);
subplot(2,3,2), imshow(BW2);
title(‘sobel edge check’);
subplot(2,3,3), imshow(BW3);
title(‘prewitt edge check’);
subplot(2,3,4), imshow(BW4);
title(‘log edge check’);
subplot(2,3,5), imshow(BW5);
title(‘canny edge check’);
subplot(2,3,6), imshow(BW6);
title(‘gasussian&canny edge check’);%此為用高斯濾波後Canny運算元邊緣檢測結果
(注意:程式碼中有一些標點是中文模式,若輸入程式碼後標點顯示紅色,則為中文標點,改回來就行了)

相關文章