2016-09-18 97 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);