1. 程式人生 > >圖像邊緣和輪廓特征的提取方法

圖像邊緣和輪廓特征的提取方法

和平 處理方法 大小 椒鹽噪聲 灰度 分享 產生 .so 結果

Part1:先介紹幾個關於圖像處理的概念

1 圖像銳化

圖像銳化(image sharpening)是補償圖像的輪廓,增強圖像的邊緣及灰度跳變的部分,使圖像變得清晰,分為空域處理和頻域處理兩類。圖像銳化是為了突出圖像上地物的邊緣、輪廓,或某些線性目標要素的特征。這種濾波方法提高了地物邊緣與周圍像元之間的反差,因此也被稱為邊緣增強。

2圖像平滑

概念

圖像平滑是指用於突出圖像的寬大區域、低頻成分、主幹部分或抑制圖像噪聲和幹擾高頻成分的圖像處理方法,目的是使圖像亮度平緩漸變,減小突變梯度,改善圖像質量。

方法

圖像平滑的方法包括:插值方法,線性平滑方法,卷積法等等。這樣的處理方法根據圖像噪聲的不同進行平滑,比如椒鹽噪聲,就采用線性平滑方法!

3理解低頻信號和高頻信號

  圖像中的低頻信號和高頻信號也叫做低頻分量和高頻分量。 簡單一點說,圖像中的高頻分量,指的是圖像強度(亮度/灰度)變化劇烈的地方,也就是我們常說的邊緣(輪廓);圖像中的低頻分量,指的是圖像強度(亮度/灰度)變換平緩的地方,也就是大片色塊的地方。 人眼對圖像中的高頻信號更為敏感,舉個例子,在一張白紙上有一行字,那麽我們肯定直接聚焦在文字上,而不會太在意白紙本身,這裏文字就是高頻信號,而白紙就是低頻信號。

  圖像的高低頻是對圖像各個位置之間強度變化的一種度量方法. 低頻分量:主要對整副圖像的強度的綜合度量. 高頻分量:主要是對圖像邊緣和輪廓的度量. 如果一副圖像的各個位置的強度大小相等,則圖像只存在低頻分量,從圖像的頻譜圖上看,只有一個主峰,且位於頻率為零的位置.

   如果一副圖像的各個位置的強度變化劇烈,則圖像不僅存在低頻分量,同時也存在多種高頻分量,從圖像的頻譜上看,不僅有一個主峰,同時也存在多個旁峰.

Part2:常見的邊緣檢測算子的原理

不同圖像灰度不同,邊界處一般會有明顯的邊緣,利用此特征可以分割圖像。需要說明的是:邊緣和物體間的邊界並不等同,邊緣指的是圖像中像素的值有突變的地方,而物體間的邊界指的是現實場景中的存在於物體之間的邊界。有可能有邊緣的地方並非邊界,也有可能邊界的地方並無邊緣,因為現實世界中的物體是三維的,而圖像只具有二維信息,從三維到二維的投影成像不可避免的會丟失一部分信息;另外,成像過程中的光照和噪聲也是不可避免的重要因素。正是因為這些原因,基於邊緣的圖像分割仍然是當前圖像研究中的世界級難題,目前研究者正在試圖在邊緣提取中加入高層的語義信息。

在實際的圖像分割中,往往只用到一階和二階導數,雖然,原理上,可以用更高階的導數,但是,因為噪聲的影響,在純粹二階的導數操作中就會出現對噪聲的敏感現象,三階以上的導數信息往往失去了應用價值。二階導數還可以說明灰度突變的類型。在有些情況下,如灰度變化均勻的圖像,只利用一階導數可能找不到邊界,此時二階導數就能提供很有用的信息。二階導數對噪聲也比較敏感,解決的方法是先對圖像進行平滑濾波,消除部分噪聲,再進行邊緣檢測。不過,利用二階導數信息的算法是基於過零檢測的,因此得到的邊緣點數比較少,有利於後繼的處理和識別工作。

各種算子的存在就是對這種導數分割原理進行的實例化計算,是為了在計算過程中直接使用的一種計算單位。

1.Sobel算子

其主要用於邊緣檢測,在技術上它是以離散型的差分算子,用來運算圖像亮度函數的梯度的近似值, Sobel算子是典型的基於一階導數的邊緣檢測算子,由於該算子中引入了類似局部平均的運算,因此對噪聲具有平滑作用,能很好的消除噪聲的影響。Sobel算子對於象素的位置的影響做了加權,與Prewitt算子、Roberts算子相比因此效果更好。

Sobel算子包含兩組3x3的矩陣,分別為橫向及縱向模板,將之與圖像作平面卷積,即可分別得出橫向及縱向的亮度差分近似值。實際使用中,常用如下兩個模板來檢測圖像邊緣。

檢測水平邊沿 橫向模板 :技術分享圖片 檢測垂直平邊沿 縱向模板:技術分享圖片

圖像的每一個像素的橫向及縱向梯度近似值可用以下的公式結合,來計算梯度的大小。

技術分享圖片

然後可用以下公式計算梯度方向。

技術分享圖片

在以上例子中,如果以上的角度Θ等於零,即代表圖像該處擁有縱向邊緣,左方較右方暗。

缺點是Sobel算子並沒有將圖像的主題與背景嚴格地區分開來,換言之就是Sobel算子並沒有基於圖像灰度進行處理,由於Sobel算子並沒有嚴格地模擬人的視覺生理特征,所以提取的圖像輪廓有時並不能令人滿意。

2. Isotropic Sobel算子

Sobel算子另一種形式是(Isotropic Sobel)算子,加權平均算子,權值反比於鄰點與中心點的距離,當沿不同方向檢測邊緣時梯度幅度一致,就是通常所說的各向同性Sobel(Isotropic Sobel)算子。模板也有兩個,一個是檢測水平邊沿的 ,另一個是檢測垂直平邊沿的 。各向同性Sobel算子和普通Sobel算子相比,它的位置加權系數更為準確,在檢測不同方向的邊沿時梯度的幅度一致。

3. Roberts算子

羅伯茨算子、Roberts算子是一種最簡單的算子,是一種利用局部差分算子尋找邊緣的算子,他采用對角線方向相鄰兩象素之差近似梯度幅值檢測邊緣。檢測垂直邊緣的效果好於斜向邊緣,定位精度高,對噪聲敏感,無法抑制噪聲的影響。1963年,Roberts提出了這種尋找邊緣的算子。 Roberts邊緣算子是一個2x2的模板,采用的是對角方向相鄰的兩個像素之差。從圖像處理的實際效果來看,邊緣定位較準,對噪聲敏感。適用於邊緣明顯且噪聲較少的圖像分割。Roberts邊緣檢測算子是一種利用局部差分算子尋找邊緣的算子,Robert算子圖像處理後結果邊緣不是很平滑。經分析,由於Robert算子通常會在圖像邊緣附近的區域內產生較寬的響應,故采用上述算子檢測的邊緣圖像常需做細化處理,邊緣定位的精度不是很高。

4. Prewitt算子

Prewitt算子是一種一階微分算子的邊緣檢測,利用像素點上下、左右鄰點的灰度差,在邊緣處達到極值檢測邊緣,去掉部分偽邊緣,對噪聲具有平滑作用 。其原理是在圖像空間利用兩個方向模板與圖像進行鄰域卷積來完成的,這兩個方向模板一個檢測水平邊緣,一個檢測垂直邊緣。

對數字圖像f(x,y),Prewitt算子的定義如下:

G(i)=|[f(i-1,j-1)+f(i-1,j)+f(i-1,j+1)]-[f(i+1,j-1)+f(i+1,j)+f(i+1,j+1)]| G(j)=|[f(i-1,j+1)+f(i,j+1)+f(i+1,j+1)]-[f(i-1,j-1)+f(i,j-1)+f(i+1,j-1)]| 則 P(i,j)=max[G(i),G(j)]或 P(i,j)=G(i)+G(j) 經典Prewitt算子認為:凡灰度新值大於或等於閾值的像素點都是邊緣點。即選擇適當的閾值T,若P(i,j)≥T,則(i,j)為邊緣點,P(i,j)為邊緣圖像。這種判定是欠合理的,會造成邊緣點的誤判,因為許多噪聲點的灰度值也很大,而且對於幅值較小的邊緣點,其邊緣反而丟失了。

Prewitt算子對噪聲有抑制作用,抑制噪聲的原理是通過像素平均,但是像素平均相當於對圖像的低通濾波,所以Prewitt算子對邊緣的定位不如Roberts算子。

因為平均能減少或消除噪聲,Prewitt梯度算子法就是先求平均,再求差分來求梯度。水平和垂直梯度模板分別為:

檢測水平邊沿 橫向模板 技術分享圖片 檢測垂直平邊沿 縱向模板:技術分享圖片

該算子與Sobel算子類似,只是權值有所變化,但兩者實現起來功能還是有差距的,據經驗得知Sobel要比Prewitt更能準確檢測圖像邊緣。

5.Laplacian算子

Laplace算子是一種各向同性算子,二階微分算子,在只關心邊緣的位置而不考慮其周圍的象素灰度差值時比較合適。Laplace算子對孤立象素的響應要比對邊緣或線的響應要更強烈,因此只適用於無噪聲圖象。存在噪聲情況下,使用Laplacian算子檢測邊緣之前需要先進行低通濾波。所以,通常的分割算法都是把Laplacian算子和平滑算子結合起來生成一個新的模板。

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

技術分享圖片

了更適合於數字圖像處理,將拉式算子表示為離散形式:

技術分享圖片

另外,拉普拉斯算子還可以表示成模板的形式,如下圖所示,

離散拉普拉斯算子的模板:技術分享圖片, 其擴展模板:技術分享圖片


拉式算子用來改善因擴散效應的模糊特別有效,因為它符合降制模型。擴散效應是成像過程中經常發生的現象。

Laplacian算子一般不以其原始形式用於邊緣檢測,因為其作為一個二階導數,Laplacian算子對噪聲具有無法接受的敏感性;同時其幅值產生算邊緣,這是復雜的分割不希望有的結果;最後Laplacian算子不能檢測邊緣的方向;所以Laplacian在分割中所起的作用包括:(1)利用它的零交叉性質進行邊緣定位;(2)確定一個像素是在一條邊緣暗的一面還是亮的一面;一般使用的是高斯型拉普拉斯算子(Laplacian of a Gaussian,LoG),由於二階導數是線性運算,利用LoG卷積一幅圖像與首先使用高斯型平滑函數卷積改圖像,然後計算所得結果的拉普拉斯是一樣的。所以在LoG公式中使用高斯函數的目的就是對圖像進行平滑處理,使用Laplacian算子的目的是提供一幅用零交叉確定邊緣位置的圖像;圖像的平滑處理減少了噪聲的影響並且它的主要作用還是抵消由Laplacian算子的二階導數引起的逐漸增加的噪聲影響。

6.Canny算子

該算子功能比前面幾種都要好,但是它實現起來較為麻煩,Canny算子是一個具有濾波,增強,檢測的多階段的優化算子,在進行處理前,Canny算子先利用高斯平滑濾波器來平滑圖像以除去噪聲,Canny分割算法采用一階偏導的有限差分來計算梯度幅值和方向,在處理過程中,Canny算子還將經過一個非極大值抑制的過程,最後Canny算子還采用兩個閾值來連接邊緣。

Canny邊緣檢測算法

step1: 用高斯濾波器平滑圖象;

step2: 用一階偏導的有限差分來計算梯度的幅值和方向;

step3: 對梯度幅值進行非極大值抑制

step4: 用雙閾值算法檢測和連接邊緣


幾種算子的比較
Robert算子定位比較精確,但由於不包括平滑,所以對於噪聲比較敏感。Prewitt算子和Sobel算子都是一階的微分算子,而前者是平均濾波,後者是加權平均濾波且檢測的圖像邊緣可能大於2個像素。這兩者對灰度漸變低噪聲的圖像有較好的檢測效果,但是對於混合多復雜噪聲的圖像,處理效果就不理想了。LOG濾波器方法通過檢測二階導數過零點來判斷邊緣點。LOG濾波器中的a正比於低通濾波器的寬度,a越大,平滑作用越顯著,去除噪聲越好,但圖像的細節也損失越大,邊緣精度也就越低。所以在邊緣定位精度和消除噪聲級間存在著矛盾,應該根據具體問題對噪聲水平和邊緣點定位精度要求適當選取。
討論和比較了幾種常用的邊緣檢測算子。梯度算子計算簡單,但精度不高,只能檢測出圖像大致的輪廓,而對於比較細的邊緣可能會忽略。Prewitt 和Sobel 算子比Roberts 效果要好一些。LOG 濾波器和Canny 算子的檢測效果優於梯度算子,能夠檢測出圖像較細的邊緣部分。不同的系統,針對不同的環境條件和要求,選擇合適的算子來對圖像進行邊緣檢測。

Part3:算子代碼

sobel算子MATLAB實現

 1 f=imread(D:/picture/ZiXia.jpg);
 2 f=rgb2gray(f);         %轉化成灰度圖
 3 f=im2double(f);           %函數im2double 將其值歸一化到0~1之間
 4 %使用垂直Sobcl箅子.自動選擇閾值
 5 [VSFAT Threshold]=edge(f, sobel,vertical);                    %邊緣探測
 6 figure,imshow(f),title( 原始圖像,);                      %顯示原始圖像
 7 figure,imshow(VSFAT),title( 垂直圖像邊緣檢測);
 8 %顯示邊緣探測圖像
 9 %使用水平和垂直Sobel算子,自動選擇閾值
10 SFST=edge(f,sobel,Threshold);
11 figure,imshow(SFST),title(水平和垂直圖像邊緣檢測);
12 %顯示邊緣探測圖像
13 %使用指定45度角Sobel算子濾波器,指定閡值
14 s45=[-2 -1 0;-1 0 1;0 1 2];
15 SFST45=imfilter(f,s45,replicate);%功能:對任意類型數組或多維圖像進行濾波。
16 SFST45=SFST45>=Threshold;
17 figure,imshow(SFST45),title(45度角圖像邊緣檢測) ;
18 %顯示邊緣探測圖像 

Roberts算子MATLAB實現

 1 clear all;
 2 clc;
 3 sourcePic=imread(D:/picture/ZiXia.jpg);
 4 grayPic=mat2gray(sourcePic);
 5 [m,n]=size(grayPic);
 6 newGrayPic=grayPic;
 7 robertsNum=0;
 8 robertThreshold=0.2;
 9 for j=1:m-1
10     for k=1:n-1
11         robertsNum = abs(grayPic(j,k)-grayPic(j+1,k+1)) + abs(grayPic(j+1,k)-grayPic(j,k+1));
12         if(robertsNum > robertThreshold)
13             newGrayPic(j,k)=255;
14         else
15             newGrayPic(j,k)=0;
16         end
17     end
18 end
19 figure,imshow(newGrayPic);
20 title(roberts算子的處理結果)

PreWitt邊緣算子MATLAB實現

 1 clear;
 2 sourcePic=imread(D:/picture/ZiXia.jpg);
 3 grayPic=mat2gray(sourcePic);
 4 [m,n]=size(grayPic);
 5 newGrayPic=grayPic;
 6 PrewittNum=0;
 7 PrewittThreshold=0.5;%設定閾值
 8 for j=2:m-1 %進行邊界提取
 9     for k=2:n-1
10         PrewittNum=abs(grayPic(j-1,k+1)-grayPic(j+1,k+1)+grayPic(j-1,k)-grayPic(j+1,k)+grayPic(j-1,k-1)-grayPic(j+1,k-1))+abs(grayPic(j-1,k+1)+grayPic(j,k+1)+grayPic(j+1,k+1)-grayPic(j-1,k-1)-grayPic(j,k-1)-grayPic(j+1,k-1));
11         if(PrewittNum > PrewittThreshold)
12             newGrayPic(j,k)=255;
13         else
14             newGrayPic(j,k)=0;
15         end
16     end
17 end
18 figure,imshow(newGrayPic);
19 title(Prewitt算子的處理結果)

Laplacian邊緣算子

 1 clear;
 2 sourcePic=imread(lena.jpg);%圖像讀入
 3 grayPic=mat2gray(sourcePic);%實現圖像的矩陣歸一化操作
 4 [m,n]=size(grayPic);
 5 newGrayPic=grayPic;
 6 LaplacianNum=0;%經Laplacian操作得到的每個像素的值
 7 LaplacianThreshold=0.2;%設定閾值
 8 for j=2:m-1 %進行邊界提取
 9     for k=2:n-1
10         LaplacianNum=abs(4*grayPic(j,k)-grayPic(j-1,k)-grayPic(j+1,k)-grayPic(j,k+1)-grayPic(j,k-1));
11         if(LaplacianNum > LaplacianThreshold)
12             newGrayPic(j,k)=255;
13         else
14             newGrayPic(j,k)=0;
15         end
16     end
17 end
18 figure,imshow(newGrayPic);
19 title(Laplacian算子的處理結果)

canny邊緣算子

1 I = imread(D:/picture/ZiXia.jpg);  % 讀入圖像
2 I=rgb2gray(I);               % 轉化為灰色圖像
3 imshow(I);title(原圖)
4 BW1 = edge(I,canny);  % 調用canny函數
5 figure,imshow(BW1);     % 顯示分割後的圖像,即梯度圖像
6 title(matlab canny)

圖像邊緣和輪廓特征的提取方法