2016-09-18 96 views
0

我試圖按照Lowe的paper中所述的方式,優雅地構造SIFT特徵描述符。我見過的大多數方法都相當混亂,我想找到一個這樣做的優雅方法。我有我的關鍵點作爲插值(X,Y)座標,並且我一直在使用決定在我的圖像的所有像素的梯度大小和方向:使用指數矩陣在MATLAB中構建SIFT特徵矢量

[Gmag,Gdir]=imgradient(image) 

我可以很容易地找到每一個關鍵點梯度的16×16窗口通過切片Gdir。我現在需要構建每個單元格的直方圖。我用下面的代碼來獲得一個段數爲每個方位/大小:

binned=discretize(local_Gdir,[-180:45:180]) 

binned現在是對應於針對每個小區(它充滿了數字1-8的特徵向量索引的矩陣;所述索引的binned對應於局部梯度指數)。

爲了構建128個元素特徵描述符,我需要確定16個單元的特徵向量(直方圖)。我一直試圖將binned矩陣拆分爲16個單元格,同時保留索引,以便我可以快速引用局部梯度幅度矩陣,將每個單元格的每個單元格中的梯度求和,然後將它們附加到最終描述符中,但我可以找不到乾淨的方式來做到這一點。

如何使用索引矩陣來構建16個單元格的16個特徵向量?也許更一般地說,在不丟失原始行/列索引的情況下,將索引矩陣分成16個子矩陣的好方法是什麼?

回答

0

在16 * 16窗口中有16個4 * 4子窗口,16 * 16窗口的所有元素都具有1到8的值,所以應該爲每個子窗口分別創建一個直方圖。這意味着在循環中應該調用16次的hist函數。

相反,我們可以爲每個子窗口添加一個數字,然後每個子窗口的值變得與其他子窗口不同。

例如用於我們添加0到離散化值,使得值的範圍從1到8

用於第二子窗口的第一子窗口,我們添加8到離散化值,使得值的範圍從9到16。

爲第三個窗口添加16 .....

然後只有一次調用hist函數並計算128個值。

% exmaple of a 16 * 16 window 
binned_16 = randi([1 8],16 ,16); 
% the values to be added to each 16* 16 window ;this matrix only one time needs to be computed 
values_to_add = kron(reshape((0 : 15), 4, 4)*8 , ones(4)); 
% values added to the window 
binned_added_values = values_to_add + binned_16; 
% histogram computed 
h = hist(binned_added_values(:), 1:128);