圖像邊緣及matlab實現

圖像邊緣是圖像的重要特徵,是圖像中特性(如像素灰度、紋理等)分佈的不連續處,圖像周圍特性有階躍變化或屋脊狀變化的那些像素集合。圖像的邊緣部分集中了圖像的大部分信息,一幅圖像的邊緣結構與特點往往是決定圖像特質的重要部分。圖像邊緣的另一個定義是指其周圍像素灰度變化不連續的那些像素的集合。邊緣廣泛存在於物體與背景之間、物體與物體之間,因此,邊緣是圖像分割、圖像理解及圖像識別的重要特徵。

圖像邊緣檢測主要用於增強圖像中的輪廓邊緣、細節以及灰度跳變部分,形成完整的物體邊界,達到將物體從圖像中分離出來或將表示同一物體表面的區域檢測出來的目的。目前爲止最通用的方法是檢測亮度值的不連續性,用一階和二階導數檢測的。

(1)微分法

微分法的目的是利用微分運算求信號的變化率,加強高頻分量的作用,從而使輪廓清晰。遵循如下兩個基本準則之一:找到亮度的一階導數在幅度上比指定的閾值大的地方;找到亮度的二階導數有零交叉的地方。

(2)差分邊緣檢測方法

利用像素灰度的一階導數算子在灰度迅速變化處得到高值來進行奇異點的檢測。它在某一點的值就代表該點的邊緣強度,通過對這些值設置閾值來進一步得到邊緣圖像。差分邊緣檢測方法是最原始、最基本的方法。但要求差分方向與邊緣方向垂直,這就需要對圖像的不同方向(一般爲垂直方向、水平方向和對角線方向)都進行差分運算,增加了實際運算的繁瑣性,目前很少採用。

(3)Roberts邊緣檢測算子

Roberts邊緣檢測算子根據任意一對互相垂直方向上的差分可用來計算梯度的原理,採用對角線方向相鄰兩像素之差然後計算出Roberts的梯度幅度值.
Roberts檢測器較爲簡單,但具有一些功能上的限制,例如,它是非對稱的,而且不能檢測諸如45°倍數的邊緣。然而,它還是經常用於硬件實現中,因爲它既簡單又快速。

(4)Sobel邊緣檢測算子

對數字圖像的每個像素,考察它上下左右鄰點灰度的加權差,與之接近的鄰點的權大。
Sobel算子很容易在空間上實現,邊緣檢測效果較好,且受噪聲的影響也較小。鄰域增大抗噪性會更好,但計算量也會增大,得出的邊緣也會相應變粗。Sobel算子會檢測出許多僞邊緣,邊緣定位精度不夠高,在精度要求不高時是一種較常用的邊緣檢測方法。

(5)Prewitt邊緣檢測算子

圖像中的每個像素都用這兩個核作卷積,一個核對垂直邊緣影響最大,另一個核對水平邊緣影響最大。兩個卷積的絕對值的最大值作爲該點的輸出值。不能簡單的將小於0的值處理爲0,這樣會丟失信息。它比Sobel檢測器在計算上要簡單一些,但比較容易產生一些噪聲。

(6)拉普拉斯邊緣檢測算子

拉普拉斯邊緣檢測算子是一種二階微分算子,與其它邊緣檢測方法的不同之處在於,該方法是一種各向同性的檢測方法,即其邊緣的增強程度與邊緣的方向無關,從而可以滿足不同走向的邊緣銳化的要求。
拉普拉斯算子自身很少被直接用作邊緣檢測,因爲二階導數對噪聲具有無法接受的敏感性,它的幅度會產生雙邊緣,而且它不能檢測邊緣的方向。然而,當與其它邊緣檢測技術組合使用時,拉普拉斯算子是一種有效的補充方法。例如,雖然它的雙邊緣使得它不適合直接用於邊緣檢測,但該性質可用於邊緣定位。

MATLAB實現

在MATLAB中可以由edge函數實現各算子對邊緣的檢測,其調用格式爲:

  • BW = edge(I,’METHOD’)—自動選擇閾值用指定的算子進行邊緣檢測;
  • BW = edge(I,’METHOD’,THRESH)—根據給定的閾值THRESH用指定的算子進行邊緣檢測,忽略所有小於閾值的邊緣。當THRESH爲空時,自動選擇閾值;
  • [BW, THRESH] = edge(I,’METHOD’,…)—返回edge使用的閾值,以確定哪個梯度值足夠大到可以稱爲邊緣點。

其中,I爲輸入圖像。返回圖像BW爲與I同大的二值圖像,1表示邊緣,0表示非邊緣。I是unit8型、unit16型,或者是double型,BW是unit8型。
METHOD:使用檢測算子的類型,經常使用的有:
sobel:缺省值,用導數的sobel近似值檢測邊緣,那些梯度最大的點返回邊緣。
roberts:用導數的roberts近似值檢測邊緣,那些梯度最大的點返回邊緣。
prewitt:用導數的prewitt近似值檢測邊緣,那些梯度最大的點返回邊緣。
LoG:用LoG算子檢測邊緣。
Canny:用Canny算子檢測邊緣。
THRESH:指定的閾值,所有不強於thresh的邊緣都被忽略。

由edge函數實現各算子對圖像的邊緣檢測
clear all;
I = imread('dzgz4.jpg);
I=rgb2gray(I);
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)
subplot(2,3,2),imshow(BW1)
subplot(2,3,3),imshow(BW2)
subplot(2,3,4),imshow(BW3)
subplot(2,3,5),imshow(BW4)
subplot(2,3,6),imshow(BW5)

這裏寫圖片**重點內容**描述

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