綜述
底層次的特徵是不需要任何形狀信息(空間關係的信息)就可以從圖像中自動提取的特徵,這樣看來,閾值方法就是作爲點處理的一種低層次特徵提取方式,所有低層次方法都可以作爲高層次特徵提取的預處理,從而在圖像中找到形狀。
邊緣檢測相當於漫畫家的草稿,瞭解頻域將有利於分析低層次特徵提取。
角點檢測,原理上是檢測線條上曲率突變的點,是一種局部特徵檢測。
所以低層次的特徵提取包括以下部分:
- 一階邊緣檢測
- 二階邊緣檢測
- 相位一致性
- 局部特徵檢測
- 光流估計
一階邊緣檢測原理
基於邊緣檢測的特點是不易受整體光照強度變化的影響,許多圖像理解都以邊緣爲基礎,邊緣檢測強調的是圖像對比度(contrast),檢測對比度,即亮度上的差別,邊緣就是亮度發生突變的地方。
圖像邊界發生亮度級的階梯變化,邊緣是階梯變化的位置,一階微分可以使階梯變化增強,而當信號沒有變化時,一階微分不響應。
一階邊緣檢測算子是具有方向依賴性的,即水平邊緣檢測算子在水平方向上的差分(差分模擬微分)爲0,形成水平相鄰像素的插值,可以用於檢測垂直邊緣而不能檢測水平邊緣。
水平邊緣檢測算子用於檢測垂直邊緣:
注意這個地方沒有歧義,如上圖所示,水平邊緣檢測算子檢測到的是垂直方向上的邊緣。
相應的,爲檢測水平邊緣,需要設計垂直邊緣檢測算子:
將兩個算子相結合,即可得到同時檢測水平邊緣和垂直邊緣的算子:
下圖是卷積模板,這個算子的實現很簡單,這裏給出僞代碼。
2 | -1 |
-1 | 0 |
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
利用邊緣檢測算子後,經常使用使用均勻閾值方法選取最亮點,得到連續的邊緣線,閾值的選取決定最亮點的數量,閾值越大選取得到的點越少,閾值的選取可以憑經驗,也可以由邊緣數據自動的選取。
一階差分算子
由泰勒展開式可得以下兩式:
由此可得,相鄰兩點的差值是一階導數的估算值,決定了估算誤差,減小誤差的一個辦法是:在相鄰的像素間插入一個新的像素來實現。
的情況下,差分模擬微分的誤差大大減小,改進的一階差分模板就如下所示:
水平邊緣檢測模板檢測出中心位置的垂直邊緣, 垂直邊緣檢測模板檢測出中心位置的水平邊緣!
Robert算子
Robert交叉算子(Robert,1965)是最早期的邊緣檢測算子,利用兩個模板,計算對角線上的差值,這兩個模板分別是M+和M-。
實現過程中,利用這些模板卷積得到的最大值作爲邊緣存儲值,邊緣點Ex,y是在圖像點Px,y對這兩個模板進行卷積得到的兩個最大值中的較大者。
Robert交叉算子檢測到的邊緣結果如圖所示。
Prewitt算子
Prewitt邊緣檢測算子,類似於微分處理算子,由於它檢測的是變化,必然對噪聲及圖像亮度的階梯式變化有所響應,(模擬頻域高通濾波器)。是對一階邊緣檢測算子的擴展(將一階差分模板進行擴展):
Prewitt算子給出兩個結果,沿x、y兩個座標軸的亮度變化率,兩個向量的和就是該點的邊緣向量,向量包括強度和方向:
Gx和Gy的符號可以用於確定邊緣方向的相應象限。
prewitt算子的實現僞代碼如下:
我們把Pewitt算子應用於正方形圖像[參見圖(a)],就可以得到邊緣強度和方向,分別如圖(b)和圖(d)所示,其中(d)中沒有包括邊界點,只有執行點的邊緣方向。圖(d)所示的邊緣方向顯示的是度數,其中0°和360°表示水平方向,朝右方向,而90°表示垂直方向,朝上方向。
由於該算子的均值處理特性,雖然邊緣點的區域較寬,但邊緣數據比前面介紹的一階算子更清晰,使亮度變化明顯的區域得到加強。邊緣方向以圖像方式表示顯得不太清晰,利用的向量方式表示更好,如圖(c)所示。利用向量方式,正方形角點處的邊緣方向數據顯然無法很好表示(由於一階導數在這些點不連續)。
Sobel算子(索貝爾算子)
Sobel邊緣檢測算子是Prewitt檢測算子的擴展,在中心像素位置取權重2,由向量方式確定邊緣的兩個掩碼mask組成的,Sobel算子曾長期是最受歡迎的邊緣檢測算子,比Prewitt算子的檢測性能好(最明顯的優點是抑制噪聲的性能)。
如圖所示,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算子的計算步驟如下:
- 高斯濾波器平滑圖像,去除噪聲
- 一階差分偏導計算梯度值和方向,通過Sobel算子實現。
- 對梯度值不是極大值的地方進行抑制,把不是極值的點,全部置0,去掉了大部分弱的邊緣,所以圖像邊緣會變細。
- 用雙閾值連接圖上的聯通點,設置雙閾值 t1, t2, t1 <= t2 大於 t2 的點肯定是邊緣;小於 t1 的點肯定不是邊緣;在 t1, t2 之間的點,通過已確定的邊緣點,發起8領域方向的搜索(廣搜),圖中可達的是邊緣,不可達的點不是邊緣。最後得出 canny 邊緣圖。
拉普拉斯算子
邊緣檢測算子的比較
選取特定的邊緣檢測算子取決於應用本身,許多應用並不要求複雜的高級算子。
所有邊緣檢測算子的結果都是用滯後閾值處理來實現的,爲了更好的反映性能,閾值都是手動選擇的,基礎的一階算子對噪聲的響應非常好()。