特徵提取算法--ORB

本文主要參考了一下博客:
http://blog.csdn.net/hujingshuang/article/details/46984411
http://blog.csdn.net/stellar0/article/details/8741676
http://blog.sina.com.cn/s/blog_567a58300101iarh.html

ORB算法的論文來自”ORB: an efficient alternative to SIFT or SURF”,作者是OpenCV維護和開發的公司willowgarage的,論文名字起的很牛氣,摘要裏說,ORB算法比sift算法效率高兩個數量級。江湖上流傳的說法是ORB算法綜合性能在各種測評裏是最好的。

ORB就是BRIEF的改進,BRIEF太簡單了,就不介紹了,有興趣的朋友自己看paper吧。ORB的paper我讀下來,感覺改進主要有以下幾點:用FAST作爲特徵點提取的算法,更快了,添加了特徵點的主方向,這樣就具有了旋轉不變性。最後一點其實我也想到了,當時看BRIEF的時候就想應該可以優化,就是ORB採用貪婪窮舉的方法得到了相關性較低的隨機點對,還有一個改進就是對於隨機點對,受噪聲的影響很大BRIEF的辦法就是對原圖像濾波,降低噪聲的影響,ORB不在使用像素點的直接比較,而是選擇該像素爲中心的一個小patch作爲比較對象,提高了抗噪能力。

實際上,ORB算法是將FAST角點檢測與BRIEF特徵描述結合並進行了改進。ORB特徵,就是oFAST和rBRIEF的組合。oFast就是帶方向的Fast特徵點,rBRIEF就是旋轉不變性的BRIEF。
1) Fast特徵檢測算法
FAST只是一種特徵點檢測算法,並不涉及特徵點的特徵描述。 FAST的提出者Rosten等將FAST角點定義爲:若某像素與其周圍鄰域內足夠多的像素點相差較大,則該像素可能是角點。
這裏寫圖片描述

1、上圖所示,一個以像素p爲中心,半徑爲3的圓上,有16個像素點(p1、p2、…、p16)。
2、定義一個閾值。計算p1、p9與中心p的像素差,若它們絕對值都小於閾值,則p點不可能是特徵點,直接pass掉;否則,當做候選點,有待進一步考察;
3、若p是候選點,則計算p1、p9、p5、p13與中心p的像素差,若它們的絕對值有至少3個超過閾值,則當做候選點,再進行下一步考察;否則,直接pass掉;
4、若p是候選點,則計算p1到p16這16個點與中心p的像素差,若它們有至少9個超過閾值,則是特徵點;否則,直接pass掉。
5、對圖像進行非極大值抑制:計算特徵點出的FAST得分值(即score值,也即s值),判斷以特徵點p爲中心的一個鄰域(如3x3或5x5)內,計算若有多個特徵點,則判斷每個特徵點的s值(16個點與中心差值的絕對值總和),若p是鄰域所有特徵點中響應值最大的,則保留;否則,抑制。若鄰域內只有一個特徵點(角點),則保留。得分計算公式如下(公式中用N表示得分,這裏寫圖片描述):
這裏寫圖片描述
上面是FAST-9,當然FAST-10、FAST-11、FAST-12也是一樣的,只是步驟4中,超過閾值的個數不一樣。FAST算法實現起來簡單,尤其是以速度快著稱。
以上便是FAST特徵檢測的過程,清晰明瞭,而對於角點的定義也是做到了返璞歸真,大師就是大師,還原本質的能力很強,估計以前這種簡單想法被很多人忽略了。

在ORB中Fast算法得到改進,
1、假設在圖像中要提取N個特徵點,則降低FAST的閾值,使FAST算法檢測到的特徵點大於N;找此keypoint不是爲了直接用這個點的座標去求特徵,而是根據此點的位置計算這個patch的方向,再用這個方向去steer原始的BRIEF。
2、在特徵點位置處,計算特徵點的Harris響應值R,取前N個響應值大的點作爲FAST特徵點(Harris角點響應計算:Harris角點檢測中的數學推導);
3、由於要解決BRIEF算法的旋轉不變性,則需要計算特徵點的主方向。
ORB中利用重心來計算,如下(其中(x,y)是特徵鄰域內的點):
這裏寫圖片描述
這裏寫圖片描述
這裏寫圖片描述
atan2表示反正切,得到的θ值就是FAST特徵點的主方向。
FAST算法不能處理多尺度圖像,如果需要處理多尺度的話,就對原來的圖像作金字塔,然後對每個圖都進行步驟2和3的處理。解決尺度不變性的問題。

2) BRIEF特徵描述
BRIEF是對已檢測到的特徵點進行描述,它是一種二進制編碼的描述子,擯棄了利用區域灰度直方圖描述特徵點的傳統方法,大大的加快了特徵描述符建立的速度,同時也極大的降低了特徵匹配的時間,是一種非常快速,很有潛力的算法。
算法步驟如下:
1、爲減少噪聲干擾,先對圖像進行高斯濾波(方差爲2,高斯窗口爲9x9)。
2、以特徵點爲中心,取SxS(31x31)的鄰域窗口。在窗口內隨機選取一對(兩個)點,比較二者像素的大小,進行如下二進制賦值。
這裏寫圖片描述
其中,p(x),p(y)分別是隨機點x=(u1,v1),y=(u2,v2)的像素值。
3、在窗口中隨機選取N對隨機點,重複步驟2的二進制賦值,形成一個二進制編碼,這個編碼就是對特徵點的描述,即特徵描述子。(一般N=256)
以上便是BRIEF特徵描述算法的步驟。
關於一對隨機點的選擇方法,原作者測試了以下5種方法,其中方法(2)比較好。
這裏寫圖片描述
優點:計算速度快
缺點:對噪聲敏感(因爲二進制編碼是通過比較具體像素值來判定的),不具備旋轉不變性,不具備尺度不變性。

ORB算法主要解決前兩個缺點:噪聲敏感、旋轉不變性。
1、解決噪聲敏感問題
BRIEF中,採用了9x9的高斯算子進行濾波,可以一定程度上解決噪聲敏感問題,但一個濾波顯然是不夠的。ORB中提出,利用積分圖像來解決:在31x31的窗口中,產生一對隨機點後,以隨機點爲中心,取5x5的子窗口,比較兩個子窗口內的像素和的大小進行二進制編碼,而非僅僅由兩個隨機點決定二進制編碼。(這一步可有積分圖像完成)。
2、解決旋轉不變性
爲了把steered BRIEF方差增大,相關性降低,用了一種窮舉方法挑選binary test。binary test應該包括
:1)怎麼選抽樣點,2)那個像素比較完後怎麼組合各bit形成bit串,這個跟點對比較結果的排列的順序有關的。
本文用了窮舉的方法挑點對,而不是原始BRIEF中用高斯等分佈抽樣點對。具體理解大概如下:
1)取一個點對(兩個對)一共有M種取法,針對所有訓練用的patches,每一個patch都根據這M種binary
tests取點,做像素比較測試,得到0/1一個bit。因爲一共有300k個關鍵點,所以這一步可以得到一個300k*M的矩陣,每個元素都是0或1。
2)對該矩陣的每個列向量,即每個binary test(包括選點對的兩點位置及像素比較),計算其均值,然後它們重新排序,均值越接近0.5的,排越前面。排好後,組成一個向量(實際上是個矩陣),管它叫T。
3)貪婪搜索:從T中把排第一的那個binary test放到R中,T中就沒有這個測試了;然後把T中排下一個的點對與R中所有測試求相關,如果相關值超過某一事先設定的閾值,就扔了它,否則就把這個點對像素比較放到R裏面;重複上一步直到R中有256個測試爲止。如果全找完了也不夠256個,就把閾值升高一些,再重試一遍。
利用FAST中求出的特徵點的主方向θ,對特徵點鄰域進行旋轉,Calonder建議先將每個塊旋轉後,再進行BRIEF描述子的提取,但這種方法代價較大。ORB算法採用的是:每一個特徵點處,對產生的256對隨機點(以256爲例),將其進行旋轉,後進行判別,再二進制編碼。如下:S表示隨機點位置(2xn的矩陣),Sθ表示旋轉後的隨機點的位置(2xn的矩陣),x1=(u1,v1)是一個座標向量,其餘雷同。n=256。
這裏寫圖片描述
這裏寫圖片描述
這裏寫圖片描述
得到新的隨機點位置後,利用積分圖像進行二進制編碼,即可。

3)利用BRIEF特徵進行配準
經過上面的特徵提取算法,對於一幅圖中的每一個特徵點,都得到了一個256bit的二進制編碼。接下來對有相似或重疊部分的兩幅圖像進行配準。
特徵配對是利用的漢明距離進行判決:
1、兩個特徵編碼對應bit位上相同元素的個數小於128的,一定不是配對的。
2、一幅圖上特徵點與另一幅圖上特徵編碼對應bit位上相同元素的個數最多的特徵點配成一對。

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