低層次的圖像特徵提取——邊緣檢測

目錄

一階邊緣檢測

基本一階差分算子

Robert算子

Prewitt算子

Sobel算子

Canny算子

 二階邊緣檢測

拉普拉斯算子

LoG算子

各種邊緣檢測算子的比較


 低層次的特徵是不需要任何形狀信息(空間關係的信息)就可以從圖像中自動提取的特徵,閾值方法就是作爲一種低層次特徵提取方式,所有低層次方法都可以作爲高層次特徵提取的預處理,從而在圖像中找到形狀(邊緣)。

邊緣是一組相連的像素集合,邊緣周圍像素的灰度值存在強烈的反差。邊緣是圖像的最基本特徵,是圖像局部特性不連續的結果,廣泛存在於物體與背景之間、物體與物體之間、基元與基元之間,既是圖像分割所依賴的重要特徵,也是紋理特徵的重要信息源和形狀特徵的基礎。邊緣檢測在計算機視覺、圖像分析等應用中起着重要的作用,是圖像分析與識別的重要環節。

常見的邊緣類型主要有:屋頂狀邊緣(它位於灰度值從增加到減少的變化轉折點)、階躍型邊緣(兩邊的像素的灰度值有着顯著的不同)、斜坡邊緣、脈衝型邊緣等幾種,如下圖所示。

 經典的邊緣檢測算法利用空間域濾波方法考察圖像中每個像素在其鄰域內的灰度變化,利用輪廓處圖像灰度值局部不連續性和鄰域相似性的特點,求取圖像局部梯度來判斷圖像變化的劇烈程度。圖像輪廓的求取過程通常利用邊緣鄰近的一階或二階方向導數的變化規律,對於階躍型邊緣,二階方向導數在邊緣處呈零交叉;而對於屋頂狀邊緣,二階方向導數在邊緣處取極值。圖像梯度對應圖像的一階導數。

邊緣檢測包括以下部分:

  • 一階邊緣檢測
  • 二階邊緣檢測

一階邊緣檢測

基於邊緣檢測的特點是不易受整體光照強度變化的影響,許多圖像理解都以邊緣爲基礎,邊緣檢測強調的是圖像對比度,檢測對比度即亮度上的差別,邊緣就是亮度發生突變的地方。

圖像邊界發生亮度級的階梯變化,邊緣是階梯變化的位置,一階微分可以使階梯變化增強,而當信號沒有變化時,一階微分不響應。

一階邊緣檢測算子是具有方向依賴性的,即水平邊緣檢測算子在水平方向上的差分(差分模擬微分)爲0,形成水平相鄰像素的插值,可以用於檢測垂直邊緣而不能檢測水平邊緣。

水平邊緣檢測算子用於檢測垂直邊緣:

Ex(x,y) = |Px,y - Px+1, y|  (1)

注意這個地方沒有歧義,如上圖所示,水平邊緣檢測算子檢測到的是垂直方向上的邊緣。

相應的,爲檢測水平邊緣,需要設計垂直邊緣檢測算子:

Ey(x,y) = |Px,y - Px, y+1|  (2)

將兩個算子相結合,即可得到同時檢測水平邊緣和垂直邊緣的算子:

Ex,y = |2*Px,y - Px+1, y - Px, y+1|  (3)

卷積核如下圖所示:

利用這個算子的邊緣檢測實現很簡單,僞代碼如下:

edge(pix) 
    newpic = zeros(pic)

    for x : 0...rows(pic)-2
            for y : 0...cols(pic)-2
                newpic(x,y) = |2*pic(x,y) - pic(x,y+1) - pic(x+1,y)|
    return newpic

邊緣檢測完成後,經常會使用閾值方法選取最亮點,得到優化的邊緣。閾值的選取決定最亮點的數量,閾值越大選取得到的點越少,閾值的選取可以憑經驗,也可以由邊緣數據自動的選取。

基本一階差分算子

在實際的圖像處理中,爲了降低計算量,微分運算都用差分來近似,兩個相鄰點的灰度差分可近似表示爲微分運算。

由泰勒展開式可得以下兩式:

f(x + \triangle x) = f(x) + \triangle x*f{}'(x) + \triangle x^2 / 2 * f{}''(x) + O(\triangle x^3)  (4)

f{}'(x) = \frac{f(x+\triangle x)-f(x))}{\triangle x} - O(\triangle x)  (5)

由此可得,相鄰兩點的差值是一階導數的估算值,O(\triangle x)決定了估算誤差,減小誤差的一個辦法是:在相鄰的像素間插入一個新的像素來實現。

f{}'(x) = \frac{f(x+\triangle x)-f(x-\triangle x))}{2\triangle x} - O(\triangle x^2)  (6)

\triangle x < 1的情況下,差分模擬微分的誤差大大減小,一階差分模板就如下所示:

水平差分算子
垂直差分算子

Robert算子

Robert交叉算子(Robert,1965)是最早期的邊緣檢測算子,利用兩個模板,計算對角線上的差值,這兩個模板如下圖所示。

                                      

實現過程中,利用這些模板卷積得到的最大值作爲邊緣存儲值,邊緣點Ex,y是在圖像點Px,y對這兩個模板進行卷積得到的兩個值中的較大者。

(7)

Robert交叉算子檢測到的邊緣結果如圖所示。

Prewitt算子

Prewitt邊緣檢測算子,是在基本差分算子上擴展得到的,由於它檢測的是變化,必然對噪聲及圖像亮度的階梯式變化有所響應(功能上相當於頻域中的高通濾波器)。

Prewitt算子如下圖所示。

水平Prewitt算子
垂直Prewitt算子

Prewitt算子給出兩個結果,沿x、y兩個座標軸的亮度變化率,兩個向量的和就是該點的邊緣向量,向量包括強度和方向。

圖像的局部梯度可以用來判斷圖像變化的劇烈程度,對一個連續圖像函數f(x,y)它在位置(x,y)的梯度可表示爲一個矢量:

    (8)

上式中Gx和Gy分別沿x方向和y方向的偏導數,這個矢量的幅度(∇f)和方向角φ(x,y)分別爲: 

  (9)

方向角可以用於確定邊緣方向。

在實際的圖像處理中,爲了降低計算量,微分運算都用差分來近似,兩個相鄰點的灰度差分可近似表示爲微分運算:

  (11)

即∇xf近似∂f/∂x,∇yf近似∂f/ ∂y 。將式(11)代入式(9)得梯度

  (12)

以Prewitt水平算子爲例,邊緣檢測的實現僞代碼如下:

Prewitt_x(pic) = - \sum pic(0,y) + \sum(2,y) 

Prewitt_y(pic) = - \sum pic(x,0) + \sum(x,2) 

我們把Pewitt算子應用於正方形圖像[參見圖(a),就可以得到邊緣強度和方向,分別如圖(b)和圖(d)所示,其中(d)中沒有包括邊界點,只有執行點的邊緣方向。圖(d)所示的邊緣方向顯示的是度數,其中0°和360°表示水平方向,朝右方向,而90°表示垂直方向,朝上方向。

由於該算子的均值處理特性,雖然邊緣點的區域較寬,但邊緣數據比前面介紹的一階算子更清晰,使亮度變化明顯的區域得到加強。邊緣方向以圖像方式表示顯得不太清晰,利用的向量方式表示更好,如圖(c)所示。利用向量方式,正方形角點處的邊緣方向數據顯然無法很好表示(由於一階導數在這些點不連續)。 

Sobel算子

Sobel邊緣檢測算子是Prewitt檢測算子的擴展,在中心像素位置取權重2,由向量方式確定邊緣的兩個掩碼mask組成的,Sobel算子曾長期是最受歡迎的邊緣檢測算子,比Prewitt算子的檢測性能好(最明顯的優點是抑制噪聲的性能)。

水平Sobel算子
垂直Sobel算子

如圖所示,Sobel 邊緣檢測算子也是分兩個方向的,分別計算偏x方向的梯度分量Gx,偏y方向的梯度分量Gy,求絕對值,壓縮到 [0, 255]區間,然後合併梯度G(x, y) = Gx + Gy,就是sobel邊緣檢測後的圖像了。 將Sobel算子的邊緣檢測實現劃分爲五個步驟:

(1) 計算Gx與Gy與模板每行的卷積。

(2) 兩個3x3矩陣的卷積即將每一行每一列對應相乘然後相加。

(3) 求得3*3模板運算後的Gx、Gy。

(4) 求Gx^2 + Gy^2的平方根或者直接對Gx和Gy取絕對值後求和。

(5)設置一個閾值,運算後的像素值大於該閾值輸出爲全1,小於該閾值輸出爲全0。

順便提一下5階Sobel模板(不常用):

基於Sobel算子的邊緣檢測效果:

Canny算子

Canny算子是在Sobel算子的基礎上進行優化的,Canny在考察了邊緣檢測算子在邊緣檢測中的應用後,提出了邊緣檢測的三個原則:  

(1)  準確性,無附加響應的最優檢測(減少噪聲響應),即對輪廓的誤檢率要儘可能低,主要包括兩方面,一方面在原始圖像中邊緣出現的位置應該都能在檢測結果中有對應的邊緣點;另一方面輪廓檢測結果也沒有虛假的邊緣。 

通過最優化平滑處理來實現,最常用的是高斯濾波(Canny認爲),高斯濾波可能會將邊緣放大(區域變寬)。

(2)  精確性,即對邊緣的定位要精確,檢測到的邊緣位置要和原始圖像上對應邊緣的中心位置充分接近,儘量保證檢測到的輪廓線的中心就是原始圖像輪廓的中心;

可以通過非極大值抑制(相當於峯值檢測)來實現,非極大值抑制只返回項脊處的點,其他的點會被抑制掉。這其實是一種細化處理:返回的是正確位置上的邊緣點連成的更細的邊緣線,儘量使邊緣的寬度變成1個像素,這個像素在梯度方向上的梯度值是最大的。如果一個點兩側的梯度小於該點上的梯度,那麼它就是極大值,所以我們需要先得到邊緣法線上的梯度值。

(3)  單邊響應,即對同一邊緣要有低的響應次數,理想狀態是原始圖像上只有一個邊緣點時,檢測出來的邊緣也只保持一個點。

Canny算子的計算步驟如下:

  1. 高斯濾波器平滑圖像,去除噪聲;
  2. 一階差分偏導計算梯度值和方向,通過Sobel算子實現;
  3. 對梯度值不是極大值的地方進行抑制,把不是極值的點,全部置0,去掉了大部分弱的邊緣,所以圖像邊緣會變細;
  4. 用雙閾值連接圖上的聯通點,設置雙閾值 t1, t2, t1 <= t2 大於 t2 的點肯定是邊緣;小於 t1 的點肯定不是邊緣;在 t1, t2 之間的點,通過已確定的邊緣點,發起8領域方向的搜索(廣搜),圖中可達的是邊緣,不可達的點不是邊緣。最後得出 canny 邊緣圖。

 二階邊緣檢測

拉普拉斯算子

Prewitt梯度算子利用一階差分:f '(x) = f(x) - f(x - 1)得到內核模板,對於二階差分,有

                                                               f '(x) = (f(x + 1) - f(x)) - (f(x) - f(x - 1))

化簡後:f '(x) = f(x - 1) - 2 f(x)) + f(x + 1)。

提取前面的係數:[1, -2, 1],二維的情況下,同理可得f '(x, y) = -4 f(x, y) + f(x-1, y) + f(x+1, y) + f(x, y-1) + f(x, y+1)提取各個係數,得到模板的形式

圖像函數的拉普拉斯變換定義爲:

計算公式:

 考慮寫對角線上像素的情況下的改進型拉普拉斯算子模板爲:

梯度計算公式:

與原圖卷積運算即可求出邊緣。 

拉普拉斯算子作爲一個二階算子,它的優點是:

  • 可以利用零交叉的性質進行邊緣定位
  • 可以確定一個像素是在邊緣暗的一邊還是亮的一邊

跟Sobel梯度算子相比,它的缺點是:

  • 不能抑制噪聲(對噪聲敏感)
  • 不能檢測邊緣的方向(模板不帶方向信息)。

LoG算子

邊緣檢測關注的是像素變化明顯的邊緣而非細節,而且某些邊緣檢測算子對噪聲敏感,所以,在進行邊緣檢測之前,一般都通過選定的空間濾波器進行平滑去噪,在保持圖像邊緣信息的前提下,減少圖像的細節和噪聲。

試想一種科學的邊緣提取方案:

1)高斯濾波對圖像進行平滑去噪

2)利用拉普拉斯算子進行濾波

進而進化出了另外一種提取邊緣的算法:對高斯濾波函數進行二階求導,拿高斯二階導數生成的模板再去進行圖像濾波。這種方式就是拉普拉斯算子與高斯平滑過程一起利用零交叉找邊緣。

已知高斯函數模型:

計算得到高斯函數的拉普拉斯算子爲:

上式稱爲高斯型拉普拉斯算子LoG。

近似的5✖5階LoG模板:

高斯型函數的目的是對圖像進行平滑處理,平滑處理減少了噪聲的影響,拉普拉斯算子的目的是提供一幅用零交叉確定邊緣位置的圖像。

缺點

  • 邊緣由許多閉合環的零交叉點決定
  • 零交叉點的計算比較複雜

優點

  • 零交叉點圖像中的邊緣比梯度邊緣細
  • 抑制噪聲的能力和反干擾性能

儘管LoG的諸多優點,但是Sobel算子依然是被更多應用的邊緣檢測算子。

各種邊緣檢測算子的比較

選取特定的邊緣檢測算子取決於應用本身,許多應用並不要求複雜的高級算子。

通過對比一階微分算子和二階微分算子的處理效果發現:一階微分處理通常會產生較寬的邊緣,二階微分處理對細節有較強的響應,如細線和孤立點,一階微分處理一般對灰度階躍有較強的響應,而二階微分處理對灰度級階梯變化產生雙響應,二階微分在圖像灰度值變化相似時,對線的響應要比對灰度階梯變化強,而且對點的響應比線響應強。因此,在圖像中應用二階微分處理比一階微分處理形成增強細節的能力更好,而一階微分處理主要應用於圖像的邊緣增強和提取。 

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