ORB特徵檢測算法小結

1. 定義

ORB (Oriented FAST and Rotated BRIEF),是一種特徵檢測算子,其特徵點的性能介於SIFT和SURF之間,但是其速度是SURF算法速度的10倍。

2. 特性

  1. 速度快:基本上在特徵檢測算子方面借鑑了FAST特徵檢測算子,在特徵描繪子方面借鑑了brief特徵描繪算子,這兩個方法都比較快。

  2. 具備旋轉不變性,對噪聲不敏感。

3. 算法流程

1. 特徵檢測部分

在特徵檢測部分,ORB採用了FAST的特徵檢測算法,同時對其進行改進,使其具有尺度不變性和旋轉不變性。
如何計算一個特徵點的方向呢?首先我們在計算FAST特徵點的時候要在一個鄰域內,這個領域的中心點設爲C,同時我們找出這個圖像鄰域內的重心位置P,那麼C與P的連線方向便是該特徵點的方向。那麼如何計算一個patch內的像素重心呢?方法是Image moment。

1.1 圖像重心計算

首先,從概率上來講,一個一階隨機變量X在c點的k階矩定義如下:
E(X)=xf(x)
E((xc)k)

特別的,有以下兩種情況:
1.c=0,此時ak=E(Xk) 成爲X 的k階中心矩
2.c=E(xk) ,此時μk=E[(XE(X))k] 成爲X 的k階中心矩

對於2維pq階矩的計算可見下式。

mpq=x,yxpyqI(x,y)

一般而言,零階矩是物體的質量,一階矩和零階矩可以算出物體的中心,而二階矩是用來計算物體的方向的。拿圖像出來來說,圖像可以看成是一個平板的物體,其一階矩和零階矩就可以拿來計算某個形狀的重心,而二階矩就可以拿來計算形狀的方向。
首先對圖像而言,m10m00=x,yxI(x,y)x,yI(x,y) 代表了圖像像素在x方向上的偏重,這就是重心的x座標。(x加權的總量與總重量相比顯示出來了x在哪裏(圖像的哪一列)的時候像素值較大)。同樣的,m01m00=x,yyI(x,y)x,yI(x,y) 代表了圖像像素在y方向上的偏重,這就是重心的y座標。
因此,重心座標爲(m10m00,m01m00)

1.2 帶有方向特徵的FAST特徵點

在計算出特徵點所在patch的重心之後,可以定義特徵點的方向,即爲patch中心與重心連線的向量,其角度爲
θ=atan2(m01,m10)
此外,爲了更好的描述旋轉不變性,我們還可以把patch設計爲圓形,這樣對於各個方向更加公平。

在表徵點的方向的時候,除了上述的基於重心和中心連線的方向的方法,還有兩種方法:1.MAX法:利用patch內最大的梯度方向作爲特徵點的方向。
2.BIN法: 在patch內做一個梯度直方圖,直方圖之間的方向取樣間距爲10度,類似於sift提取方向的方法,選取梯度直方圖中最大值對應的方向爲特徵點的方向。 然而這兩種方法都不如重心和中心連線的方向的方法,具體的性能對比如下圖所示
這裏寫圖片描述
在圖像噪聲不斷加大的情況下,基於重心和中心連線的方向的方法性能最優。

1.3 更多ORB特徵檢測的細節

  1. 尺度不變性: FAST特徵點不是多尺度的特徵點,我們在圖像上建立尺度金字塔,在每一層金字塔上都做一次FAST特徵檢測,之後再利用Harris算法去除部分不合理的特徵點
  2. 在ORB的原文中,採用的FAST特徵點是FAST-9,也就是以9爲半徑的patch

2.特徵描述部分

ORB的特徵描述是基於BRIEF特徵點的改進算法。我們首先介紹BRIEF算法,再介紹ORB改進的帶有方向的BRIEF算子。

2.1 BRIEF特徵描述子

首先對圖像進行平滑濾波(這一點很重要),之後再特徵點周圍設計一個patch,brief描述子就是基於這個patch中特徵點之間像素比較的01二進制串,其取0還是取1滿足以下方程

τ(p:x,y)={10p(x)<p(y))p(x)>p(y)

這是生成BRIEF描述子的一次binary test。其中p(x) 代表在x處像素的值。

一個BRIEF特徵點可以定義爲一個包含n次binary test的向量。

fn(p)=1in2i1τ(p:x,y)

這樣就在數學上形成了一串二進制碼,而τ(p:x,y) 是此二進制碼在每一位的值。

下面是一些技術細節
1. 我們的binary test怎麼選擇點對?對哪些點做test?
雖然有很多binary test選擇的點的分佈方法,設我們處理的是S×S 的patch大小,我們的對做binary test的x和y點的選擇有以下幾種

  • x和y都服從均勻分佈,均勻的分佈在patch中
  • x與y服從高斯分佈,N(0,125s2) , 這樣代表着patch中距離中心點近的點對容易被選中做binary test
  • 把p固定爲(0,0),q在周圍隨機採樣

    我們選擇第二種

    1. 我們的n選多少個?做多少次test
      在ORB的原文中選擇做256次,所以生成的brief的vector有256維。我們可以設置爲128,256或512,這三種參數在OpenCV中都有提供,默認256.
    2. BRIEF特徵點的匹配
      直接對兩個二進制串採用漢明距離來匹配,就是查看二進制串對應位上有多少不一樣。

BRIEF性能評價
1:不具備旋轉不變性
2:對噪聲敏感
3:不具備尺度不變性

4:在速度上是surf的10倍。


2.1 ORB特徵描述子

下面介紹ORB如何改進BRIEF使之具備旋轉不變性。
對於做過n次binary test的點對定義一個2×n 大小的矩陣

這裏寫圖片描述

通過patch的方向θ 來計算一個旋轉矩陣Rθ ,之後我們更改S矩陣爲

Sθ=RθS

那麼此時由Sθ 中點的順序得來的新的binary test,我們定義此時的BRIEF descriptor爲
gn(p,θ)=fn(p)|(xi,yi)Sθ

在這個位置,ORB的作者說是將360度離散爲30份,建立一個查找表來預計算BRIEF patterns,一旦特徵點的方向θ 與全局的view一致,那麼就採用此時的Sθ 來計算BRIEF descriptor。這一點有點不清楚,希望有讀者知道的話能指導我一下,謝謝!

附上原文鏈接: 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

發佈了46 篇原創文章 · 獲贊 10 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章