【CV】ORB演算法原理
2011年, Rublee, 在ICCV上,發表《ORB: an efficient alternative to SIFT or SURF》,用於實現快速的特徵點提取和匹配,可作為SIFT、SURF的一種替代方案。
ORB = Oriented Fast + Rotated BRIEF
Oriented Fast : Orientation Features from Accelerated Segment Test,用於檢測特徵點.
Rotated BRIEF : 旋轉因子+Binary Robust IndependentElementary Features,用於提取特徵描述符
效能:據說,ORB演算法的速度是sift的100倍,是surf的10倍。
一、OFast特徵提取:
原理:在使用FAST提取出特徵點之後,給其定義一個特徵點方向,以此來實現特徵點的旋轉不變形。
Fast提取特徵點方法:
步驟一:粗提取。該步能夠提取大量的特徵點,但是有很大一部分的特徵點的質量不高。下面介紹提取方法。從影象中選取一點P,如上圖1。我們判斷該點是不是特徵點的方法是,以P為圓心畫一個半徑為3pixel的圓。圓周上如果有連續n個畫素點的灰度值比P點的灰度值大或者小,則認為P為特徵點。一般n設定為12。為了加快特徵點的提取,快速排出非特徵點,首先檢測1、9、5、13位置上的灰度值,如果P是特徵點,那麼這四個位置上有3個或3個以上的的畫素值都大於或者小於P點的灰度值。如果不滿足,則直接排出此點。
備註:每個小方格代表一個畫素,方格內的顏色只是為了便於區分,不代表該畫素點的顏色。
步驟二:機器學習的方法篩選最優特徵點。簡單來說就是使用ID3演算法訓練一個決策樹,將特徵點圓周上的16個畫素輸入決策樹中,以此來篩選出最優的FAST特徵點。
步驟三:非極大值抑制 去除 區域性較密集特徵點。使用非極大值抑制演算法去除臨近位置多個特徵點的問題。為每一個特徵點計算出其響應大小。計算方式是特徵點P和其周圍16個特徵點偏差的絕對值和。在比較臨近的特徵點中,保留響應值較大的特徵點,刪除其餘的特徵點。【響應閾值?】
【Get Features with Harris Corner response value
步驟四:特徵點的尺度不變形。構造金字塔,來實現特徵點的多尺度不變性。即利用步驟1-3策略,在每層金字塔上採用Fast演算法提取特徵點/採用,按角點響應值排序,選取前N個特徵點。
具體首先設定一個比例因子scaleFactor(opencv預設為1.2)和金字塔的層數nlevels(pencv預設為8)。將原影象按比例因子縮小成nlevels幅影象。縮放後的影象為:I’= I/scaleFactork(k=1,2,…, nlevels)。nlevels幅不同比例的影象提取特徵點總和作為這幅影象的oFAST特徵點。
【Orientation by Intensity Centroid】
!!!步驟五:計算關鍵點的角點方向,描述特徵點的旋轉不變性。ORB演算法提出使用灰度質心法/矩(moment)法來確定FAST特徵點的方向。也就是說通過矩來計算特徵點以r為半徑範圍內的質心,特徵點座標到質心形成一個向量作為該特徵點的方向。矩定義如下:
其中,I(x,y)為影象灰度表示式。該矩的質心為:
假設角點座標為O,則向量的角度即為該特徵點的方向。計算公式如下:
【Compute Feature Descriptors,涉及到旋轉】
二、 rBRIEF特徵描述
原理:是在BRIEF特徵描述的基礎上加入旋轉因子改進的,用一種貪婪學習演算法篩選具有高variance和高不相關的steered brief結果。
BRIEF計算出來的結果是一個二進位制串的特徵描述符。計算方式:
在一個特徵點的鄰域內(SxS,一般取31),選擇n對畫素點pi、qi(i=1,2,…,n)。然後比較每個點對的灰度值的大小。如果I(pi)> I(qi),則生成二進位制串中的1,否則為0。所有的點對都進行比較,則生成長度為n的二進位制串。一般n取128、256或512,opencv預設為256。
注意:為了增加特徵描述符的抗噪性,演算法首先需要對影象進行高斯平滑處理。在ORB演算法中,在這個地方進行了改進,在使用高斯函式進行平滑後,又用了其他操作,使其更加的具有抗噪性。
論文中提到,在特徵點SxS的區域內有5種選取點對的方法:
1)在影象塊內平均取樣;
2)p和q都符合(0,S2/25)的高斯分佈;
3)p符合(0,S2/25)的高斯分佈,而q符合(0,S2/100)的高斯分佈;
4)在空間量化極座標下的離散位置隨機取樣;
5)把p固定為(0,0),q在周圍平均取樣。
五種取樣方法的示意圖如下:
論文指出,在旋轉不是非常厲害的影象裡,第二種方法可以取得較好的匹配結果。用BRIEF生成的描述子的匹配質量非常高,作者測試的大多數情況中都超越了SURF。
但在旋轉大於30°後,BRIEF的匹配率快速降到0左右。
BRIEF的耗時較SURF少的多。
steered BRIEF(旋轉不變性改進)
假設原始的BRIEF演算法在特徵點Patch(SxS,一般S取31)鄰域內選取n對點集。
ORB在使用oFast演算法計算出的特徵點中包括了特徵點的方向角度θ。在選擇點對集之前,經過旋轉角度θ旋轉,得到新的點對
在新的點集位置上比較點對的大小形成二進位制串的描述符。
注意:在使用oFast演算法是在不同的尺度上提取的特徵點。因此,在使用BRIEF特徵描述時,要將影象轉換到相應的尺度影象上,然後在尺度影象上的特徵點處取SxS鄰域,然後選擇點對並旋轉,得到二進位制串描述符。
rBRIEF-改進特徵點描述子的相關性
使用steeredBRIEF方法得到的特徵描述子具有旋轉不變性,但是卻在另外一個性質上不如原始的BRIEF演算法。是什麼性質呢,是描述符的可區分性,或者說是相關性。這個性質對特徵匹配的好壞影響非常大。
描述子是特徵點性質的描述。描述子表達了特徵點不同於其他特徵點的區別。我們計算的描述子要儘量的表達特徵點的獨特性。如果不同特徵點的描述子的可區分性比較差,匹配時不容易找到對應的匹配點,引起誤匹配。
圖2 特徵描述子的均值分佈.X軸代表距離均值0.5的距離,y軸是相應均值下的特徵點數量統計
由上圖:
BRIEF演算法落在0上的特徵點數較多,因此BRIEF演算法計算的描述符的均值在0.5左右,每個描述符的方差較大,可區分性較強。
steeredBRIEF演算法失去了這個特性。
至於為什麼均值在0.5左右,方差較大,可區分性較強的原因,這裡大概分析一下。這裡的描述子是二進位制串,裡面的數值不是0就是1,如果二進位制串的均值在0.5左右的話,那麼這個串有大約相同數目的0和1,那麼方差就較大了。
用統計的觀點來分析二進位制串的區分性,如果兩個二進位制串的均值都比0.5大很多,那麼說明這兩個二進位制串中都有較多的1時,在這兩個串的相同位置同時出現1的概率就會很高。那麼這兩個特徵點的描述子就有很大的相似性。這就增大了描述符之間的相關性,減小之案件的可區分性。
對於rBRIEF,在計算特徵點第二個步驟選擇點對時,使用統計學習的方法來重新選擇點對集合,而非BRIEF中的5種之一。具體步驟如下:
建立300k個特徵點測試集。對於測試集中的每個點,考慮其31x31鄰域。
先對影象進行高斯平滑。
使用鄰域中的某個點的5x5鄰域灰度平均值來代替某個點對的值,進而比較點對的大小。使得特徵值更具備抗噪性。
在31x31的特徵點Patch鄰域內,共有(31-5+1)x(31-5+1)=729個這樣的子視窗,那麼從這些視窗中,選取點對的方法共有M=265356種,我們就要在這M種方法中選取256種取法,選擇的原則是這256種取法之間的相關性最小。
從N個視窗中隨機選兩個做比較即構成描述子的一個bit,論文中採用M=205590種可能的情況。
具體選取方法:
1)在300k特徵點的每個31x31鄰域內按M種方法取點對,比較點對大小,形成一個300kxM的二進位制矩陣Q。矩陣的每一列代表300k個點按某種取法得到的二進位制數。
2)對Q矩陣的每一列求取平均值,按照平均值到0.5的距離大小重新對Q矩陣的列向量排序,形成矩陣T。
3)將T的第一列向量放到R中。
4)取T的下一列向量和R中的所有列向量計算相關性,如果相關係數小於設定的閾值,則將T中的該列向量移至R中。
5)按照4)的方式不斷進行操作,直到R中的向量數量為256。
通過這種方法就選取了這256種取點對的方法。這就是rBRIEF演算法。
---------------------------------------------------------------------------------
1.對所有樣本點,做M種測試,構成M維的描述子,每個維度上非1即0;
2.按均值對M個維度排序(以0.5為中心),組成向量T;
3.貪婪搜尋:把向量T中第一個元素移動到R中,然後繼續取T的第二個元素,與R中的所有元素做相關性比較,如果相關性大於指定的閾值Threshold, 拋棄T的這個元素,否則加入到R中;
4.重複第3個步驟,直到R中有256個元素,若檢測完畢,少於256個元素,則降低閾值,重複上述步驟;
----------------------------------------------------------------------------------
三、特徵點的匹配:
例如特徵點A、B的描述子如下。
A:10101011
B:10101010
我們設定一個閾值,比如80%。當A和B的描述子的相似度大於80%時,我們判斷A,B是相同的特徵點,即這2個點匹配成功。在這個例子中A,B只有最後一位不同,相似度為87.5%,大於80%。則A和B是匹配的。
我們將A和B進行異或操作就可以輕鬆計算出A和B的相似度。而異或操作可以借組硬體完成,具有很高的效率,加快了匹配的速度。
四、OPencv中計算方法
1.首先構造尺度金字塔;
金字塔共n層,與SIFT不同,每層僅有一副影象;
第s層的尺度為,Fator初始尺度(預設為1.2),原圖在第0層;
第s層影象大小:
2.在不同尺度上採用Fast檢測特徵點;
在每一層上按公式計算需要提取的特徵點數n,在本層上按Fast角點響應值排序,提取前2n個特徵點,然後根據Harris角點響應值排序,取前n個特徵點,作為本層的特徵點;
3.計算每個特徵點的主方向(質心法):computeOrientation()
4.旋轉每個特徵點的Patch到主方向,採用上述步驟3的選取的最優的256對特徵點做τ測試,構成256維描述子,佔32個位元組;n=256.
4.採用漢明距離做特徵點匹配;
細節:
Opencv定義中,描述子佔用的位元組數,預設32位元組;描述子型別,8位整形數
nfeatures:需要的特徵點總數;
scaleFactor:尺度因子;
nlevels:金字塔層數;
edgeThreshold:邊界閾值;
firstLevel:起始層;
WTA_K:描述子形成方法,WTA_K=2表示,採用兩兩比較;
scoreType:角點響應函式,可以選擇Harris或者Fast的方法;
patchSize:特徵點鄰域大小;
ORB::operator()
特徵提取及形成描述子:通過這個函式對影象提取Fast特徵點或者計算特徵描述子。
_image:輸入影象;
_mask:掩碼影象;
_keypoints:輸入角點;
_descriptors:如果為空,只尋找特徵點,不計算特徵描述子;
_useProvidedKeypoints:如果為true,函式只計算特徵描述子;
(1)提取角點:computeKeyPoints(…)
輸入引數imagePyramid:即構造好的金字塔,其它引數。
(2)為每個角點計算主方向,質心法:computeOrientation()
輸入引數:圖片,角點,patchsize等。
(3)計算特徵點描述子:computeDescriptors()
總結:
關鍵點:
ORB演算法的特徵匹配實現較穩定的尺度不變性:通過構建不同高斯金字塔(即對影象進行縮放)分別進行特徵檢測。
ORB演算法的特徵匹配實現較穩定的旋轉不變性:為每個特徵點增加角度特徵。
ORB演算法在尺度方面效果較差,在增加演算法的尺度變換的情況下仍然沒有取得較好的結果。
ORB是一種快速的特徵提取和匹配的演算法。它的速度非常快,但是相應的演算法的質量較差。和sift相比,ORB使用二進位制串作為特徵描述,這就造成了高的誤匹配率。
參考文章: