1. 定義
ORB (Oriented FAST and Rotated BRIEF),是一種特徵檢測算子,其特徵點的性能介於SIFT和SURF之間,但是其速度是SURF算法速度的10倍。
2. 特性
速度快:基本上在特徵檢測算子方面借鑑了FAST特徵檢測算子,在特徵描繪子方面借鑑了brief特徵描繪算子,這兩個方法都比較快。
具備旋轉不變性,對噪聲不敏感。
3. 算法流程
1. 特徵檢測部分
在特徵檢測部分,ORB採用了FAST的特徵檢測算法,同時對其進行改進,使其具有尺度不變性和旋轉不變性。
如何計算一個特徵點的方向呢?首先我們在計算FAST特徵點的時候要在一個鄰域內,這個領域的中心點設爲C,同時我們找出這個圖像鄰域內的重心位置P,那麼C與P的連線方向便是該特徵點的方向。那麼如何計算一個patch內的像素重心呢?方法是Image moment。
1.1 圖像重心計算
首先,從概率上來講,一個一階隨機變量X在c點的k階矩定義如下:
特別的,有以下兩種情況:
1.c=0,此時
2.c=
對於2維pq階矩的計算可見下式。
一般而言,零階矩是物體的質量,一階矩和零階矩可以算出物體的中心,而二階矩是用來計算物體的方向的。拿圖像出來來說,圖像可以看成是一個平板的物體,其一階矩和零階矩就可以拿來計算某個形狀的重心,而二階矩就可以拿來計算形狀的方向。
首先對圖像而言,
因此,重心座標爲
1.2 帶有方向特徵的FAST特徵點
在計算出特徵點所在patch的重心之後,可以定義特徵點的方向,即爲patch中心與重心連線的向量,其角度爲
此外,爲了更好的描述旋轉不變性,我們還可以把patch設計爲圓形,這樣對於各個方向更加公平。
在表徵點的方向的時候,除了上述的基於重心和中心連線的方向的方法,還有兩種方法:1.MAX法:利用patch內最大的梯度方向作爲特徵點的方向。
2.BIN法: 在patch內做一個梯度直方圖,直方圖之間的方向取樣間距爲10度,類似於sift提取方向的方法,選取梯度直方圖中最大值對應的方向爲特徵點的方向。 然而這兩種方法都不如重心和中心連線的方向的方法,具體的性能對比如下圖所示
在圖像噪聲不斷加大的情況下,基於重心和中心連線的方向的方法性能最優。
1.3 更多ORB特徵檢測的細節
- 尺度不變性: FAST特徵點不是多尺度的特徵點,我們在圖像上建立尺度金字塔,在每一層金字塔上都做一次FAST特徵檢測,之後再利用Harris算法去除部分不合理的特徵點
- 在ORB的原文中,採用的FAST特徵點是FAST-9,也就是以9爲半徑的patch
2.特徵描述部分
ORB的特徵描述是基於BRIEF特徵點的改進算法。我們首先介紹BRIEF算法,再介紹ORB改進的帶有方向的BRIEF算子。
2.1 BRIEF特徵描述子
首先對圖像進行平滑濾波(這一點很重要),之後再特徵點周圍設計一個patch,brief描述子就是基於這個patch中特徵點之間像素比較的01二進制串,其取0還是取1滿足以下方程
這是生成BRIEF描述子的一次binary test。其中
一個BRIEF特徵點可以定義爲一個包含n次binary test的向量。
這樣就在數學上形成了一串二進制碼,而
下面是一些技術細節
1. 我們的binary test怎麼選擇點對?對哪些點做test?
雖然有很多binary test選擇的點的分佈方法,設我們處理的是
- x和y都服從均勻分佈,均勻的分佈在patch中
- x與y服從高斯分佈,
N(0,125s2) , 這樣代表着patch中距離中心點近的點對容易被選中做binary test 把p固定爲(0,0),q在周圍隨機採樣
我們選擇第二種
- 我們的n選多少個?做多少次test
在ORB的原文中選擇做256次,所以生成的brief的vector有256維。我們可以設置爲128,256或512,這三種參數在OpenCV中都有提供,默認256. - BRIEF特徵點的匹配
直接對兩個二進制串採用漢明距離來匹配,就是查看二進制串對應位上有多少不一樣。
- 我們的n選多少個?做多少次test
BRIEF性能評價
1:不具備旋轉不變性
2:對噪聲敏感
3:不具備尺度不變性
4:在速度上是surf的10倍。
2.1 ORB特徵描述子
下面介紹ORB如何改進BRIEF使之具備旋轉不變性。
對於做過n次binary test的點對定義一個
通過patch的方向
那麼此時由
在這個位置,ORB的作者說是將360度離散爲30份,建立一個查找表來預計算BRIEF patterns,一旦特徵點的方向
附上原文鏈接: ORB: an efficient alternative to SIFT or SURF
附上OpenCV3.1.0在ORB上的講解 :http://docs.opencv.org/3.0-beta/doc/py_tutorials/py_feature2d/py_orb/py_orb.html