特徵提取算法--Surf

本文參考了
http://blog.csdn.net/a784763307/article/details/17289251
http://blog.csdn.net/yujiflying/article/details/8203511
http://blog.csdn.net/cxp2205455256/article/details/41311013
SURF意指 加速的具有魯棒性的特徵,由Bay在2006年首次提出,這項技術可以應用於計算機視覺的物體識別以及3D重構中。SURF算子由SIFT算子改進而來,一般來說,標準的SURF算子比SIFT算子快好幾倍,並且在多幅圖片下具有更好的魯棒性。SURF最大的特徵在於採用了harr特徵以及積分圖像integral image的概念,這大大加快了程序的運行時間。
1. 構造高斯金字塔尺度空間
surf構造的金字塔圖像與sift有很大不同,就是因爲這些不同才加快了其檢測的速度。Sift採用的是DOG圖像,而surf採用的是Hessian矩陣行列式近似值圖像。首先來看看圖像中某個像素點的Hessian矩陣,如下:
這裏寫圖片描述
即每一個像素點都可以求出一個Hessian矩陣。
H矩陣判別式爲:
這裏寫圖片描述
判別式的值是H矩陣的特徵值,可以利用判定結果的符號將所有點分類,根據判別式取值正負,來判別該點是或不是極值點。在SURF算法中,用圖像像素l(x,y)代替函數值f(x,y),由於我們的特徵點需要具備尺度無關性,所以在進行Hessian矩陣構造前,需要選用二階標準高斯函數作爲濾波器,經過濾波後在進行Hessian的計算,其公式如下:給定圖像I中的一點X(x,y),在X點處,尺度爲σ的Hessian矩陣H(x,σ)爲
這裏寫圖片描述
其中Lxx(x, σ)是高斯濾波後圖像g(σ)的在x方向的二階導數,其他的Lyy(x, σ)、Lxy(x, σ)都是g(σ)的二階導數。
L(X,σ)= G(σ) x I(X)
L(X,σ)是一副圖像在不同解析度下的表示,可以用高斯核G(σ)和圖像函數I(X)在點X處的卷積實現,σ爲高斯方差,這樣就可以爲圖像中每個像素計算H行列式的特徵值,並用這個值判別特徵點。
一般計算圖像的二階導時,利用下面的公式d2f(x)/dx2=(f(x+1)-f(x))-(f(x)-f(x-1))=-2*f(x)+f(x+1)+f(x-1)。但是f(x)=g(h(x))【h(x)爲圖像的灰度值,f(x)是將h(x)高斯濾波處理的灰度函數。

最終我們要的是原圖像的一個變換圖像,因爲我們要在這個變換圖像上尋找特徵點,然後將其位置反映射到原圖中,在surf中,就是原圖每個像素的Hessian矩陣行列式的近似值構成的。其行列式近似公式如下:
這裏寫圖片描述
響應值還要根據濾波器大小進行歸一化處理,以保證任意大小濾波器的F範數是統一的。0.9^2是濾波器響應的相關權重w是爲了平衡Hessian行列式的表示式。這是爲了保持高斯核與近似高斯核的一致性。

由於求Hessian時要先高斯平滑,然後求二階導數,這在離散的像素點是用模板卷積形成的,這2種操作合在一起用一個模板代替就可以了,比如說y方向上的模板如下:
這裏寫圖片描述
該圖的左邊即用高斯平滑然後在y方向上求二階導數的模板,爲了加快運算用了近似處理,其處理結果如右圖所示,這樣就簡化了很多。並且右圖可以採用積分圖來運算,大大的加快了速度。
同理,x和y方向的二階混合偏導模板如下所示:
這裏寫圖片描述

積分圖像,顧名思義,即指當前像素點所在位置距原點(0,0)所包圍面的所有灰度之和。
這裏寫圖片描述
這裏寫圖片描述
那麼,當我們想要計算圖片一個區域的積分,就只需計算這個區域的四個頂點在積分圖像裏的值,便可以通過2步加法和2步減法計算得出,其數學公式如下:
這裏寫圖片描述
這樣計算圖像中任意一塊矩形區域的灰度之和Sx只需要利用矩形4個頂點(Xi,Yi)(i=1,2,3,4 順序爲從上之下,先左後右)的積分值S(x,y)即可。
Sx=S(X1,Y1)+S(X4,Y4)-S(X2,Y2)-S(X3,Y3)
近似二階導數的高斯模板並引入積分圖像,只需要在函數定義之前計算各個座標點的積分圖像,然後就能方便的求出hessian的特徵值。

上面講的這麼多隻是得到了一張近似hessian行列式圖,這好比sift中的DOG圖,但是在金字塔圖像中分爲很多層,每一層叫做一個octave,每一個octave中又有幾張尺度不同的圖片。在sift算法中,同一個octave層中的圖片尺寸(即大小)相同,但是尺度(即模糊程度)不同,而不同的octave層中的圖片尺寸大小也不相同,因爲它是由上一層圖片降採樣得到的。在進行高斯模糊時,sift的高斯模板大小是始終不變的,只是在不同的octave之間改變圖片的大小。而在surf中,圖片的大小是一直不變的,不同的octave層得到的待檢測圖片是改變高斯模糊尺寸大小得到的,當然了,同一個octave中的圖片用到的高斯模板尺度也不同。
使用近似的Hessian矩陣行列式來表示圖像中某一點x處的斑點響應值,遍歷圖像中所有的像元點,便形成了在某一尺度下斑點檢測的響應圖像。使用不同的模板尺寸,便形成了多尺度斑點響應的金字塔圖像,利用這一金字塔圖像,就可以進行斑點響應極值點的搜索。
這裏寫圖片描述
右圖是Surf的金字塔圖。

2. 根據是否爲鄰域極大值判斷特徵點
這裏要引入圖像堆的概念,說簡單點,就是一組大小相同的圖像,這些圖像都是根據不同大小高斯濾波二階導模板, 得到的平滑後圖像 。
所有小於預設極值的取值都被丟棄,增加極值使檢測到的特徵點數量減少,最終只有幾個特徵最強點會被檢測出來。檢測過程中使用與該尺度層圖像解析度相對應大小的濾波器進行檢測。
按照模板大小從小到大將平滑後圖像沿z軸方向排布,這樣中間層的每個像素點的領域就爲3X3X3(包括上下兩層)。若該點的特徵值α爲這27個點中的最大值,那麼可以認爲該點爲Feature points–特徵點(圖像依據這些特徵點的匹配進行更多的操作,比如拼接,比較相似性等等)。
這裏寫圖片描述

和sift一樣使用採用3維線性插值法得到亞像素級的特徵點,同時也去掉那些值小於一定閾值的點。

3. 主方向確定
這一步與sift也大有不同。Sift選取特徵點主方向是採用在特徵點領域內統計其梯度直方圖,取直方圖bin值最大的以及超過最大bin值80%的那些方向做爲特徵點的主方向。而在surf中,不統計其梯度直方圖,而是統計特徵點領域內的harr小波特徵。
爲保證旋轉不變性,首先以特徵點爲中心,計算半徑爲6s(S爲特徵點所在的尺度值)的鄰域內的點在z、y方向的Haar小波(Haar小波邊長取4s)響應,並給這些響應值賦高斯權重係數,使得靠近特徵點的響應貢獻大,而遠離特徵點的響應貢獻小,其次將60度扇型範圍內的響應相加以形成新的矢量,遍歷整個圓形區域,選擇最長矢量的方向爲該特徵點的主方向。這樣,通過特徵點逐個進行計算,得到每一個特徵點的主方向。
這裏寫圖片描述

4.構造surf特徵點描述算子
在sift中,是在特徵點周圍取16*16的鄰域,並把該領域化爲4*4個的小區域,每個小區域統計8個方向梯度,最後得到4*4*8=128維的向量,該向量作爲該點的sift描述子。
在surf中,首先將座標軸旋轉爲關鍵點的方向,以確保旋轉不變性。在特徵點周圍取一個正方形框,框的邊長爲20s(s是所檢測到該特徵點所在的尺度)。該框帶方向,方向當然就是第4步檢測出來的主方向了。然後把該框分爲16個子區域,每個子區域統計25個像素的水平方向和垂直方向的haar小波特徵,這裏的水平和垂直方向都是相對主方向而言的。該haar小波特徵爲水平方向值之和,水平方向絕對值之和,垂直方向之和,垂直方向絕對值之和。該過程的示意圖如下所示:
這裏寫圖片描述
這樣每個小區域就有4個值,所以每個特徵點就是16*4=64維的向量,相比sift而言,少了一半,這在特徵匹配過程中會大大加快匹配速度。

5. 採用最簡單的兩向量內積最大值爲最匹配的點,設定一閾值,只有當這個最大值大於該閾值方可認爲兩特徵點匹配。

這樣Surf的算法知識大致就是這些,有一些部分我也沒搞懂,就是積分圖像計算Hessian矩陣的。

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