2011-04-18 58 views
3

我一直在查询谷歌有关kd-trees和图像比较的一些材料,但是我无法制作使用kd-tree进行图像比较的工艺之间的'链接'。首先,我发现一些文章谈论随机化kd树的速度改进,然后我被介绍给SIFT。基本了解SIFT如何工作后,我读了最近邻居搜索。它如何比较/匹配图像与kd-trees和最近邻居搜索?

我真正的问题是:如果我有一个来自SIFT的点的网格,那么我为每个图像创建一个kd-tree。最近邻居搜索如何帮助我比较图像?起初,我认为比较图像与树会使用一些检查树结构的算法,以及每个点来自图像A与图像B中同一节点上的点的距离有多近。

如果问题是太愚蠢,请建议材料或一些主题进行搜索。

谢谢!

+0

我同意尊重kdtree,sift,surf ..等等,我认为我们可以通过Google Talk或其他任何方式联系并谈论这个问题。与我联系:http://codepad.org/TmazIhsY :) – Wiliam 2011-08-13 11:49:20

回答

8

我建议先理解慢特征匹配,不用kdtrees。

  • 输入:1000个参考特征,例如,面部或花朵;打电话给这些F1 .. F1000
  • 一个查询功能问:哪个脸或者花的功能最接近Q?

大家知道, SIFT 减少图像特征128的8位数字,缩放,使得
   相似性(特征F,特征Q)= 欧几里得距离(SIFT(F),SIFT (Q))。

发现其F1的.. F1000是最想让Q 只是一个看F1,F2 ...一个最简单的方法:

# find the feature of F1 .. F1000 nearest Q 
nearestdistance = infinity 
nearestindex = 0 
for j in 1 .. 1000: 
    distance = Euclideandistance(SIFT(Fj), SIFT(Q)) # 128 numbers vs. 128 numbers 
    if distance < nearestdistance: 
     nearestdistance = distance 
     nearestindex = j 

(当然一个计算SIFT号在环外)

A Kdtree 只是一种快速找到附近载体的方法; 它与什么正在匹配 (向量的数字代表...),或如何(欧几里德距离)。 现在kdtrees对于2d,3d ...非常快,可能高达20d, ,但可能不会比20d以上的所有数据的线性扫描更快。 那么kdtree如何为128d中的功能工作?主要诀窍是尽早退出搜索。 Muja和Lowe的文章 Fast approximate nearest neighbors with automatic algorithm configuration, 2009,10p描述了用于匹配128d SIFT特征的多个随机kdtrees。 (罗威是SIFT的发明者。)

要比较两个图像I和Q,人们发现了一组特征向量 - 几百高达几千SIFT向量 - 每个, 并查找接近这些集合的匹配。 (可以将图像想象成分子,作为原子的特征; 近似匹配的分子是很多比近似匹配的原子更难, ,但它有助于能够快速匹配原子。)

希望这会有所帮助。

0

我建议你来提取每个图像的颜色代码值,并创建一个KD树使用这些特征向量。

您可以使用以下mat实验室代码来提取颜色代码功能。

im = imread('image.jpg'); 

len = size(im,3); 
if(len == 1) 
    im = ind2rgb(im, colourMap); 
    im = uint8(im.*255); 
end 

im(logical( 0 <= im & im <= 63)) = 0; 
im(logical(64 <= im & im <= 127)) = 1; 
im(logical(128 <= im & im <= 191)) = 2; 
im(logical(192 <= im & im <= 255)) = 3; 
im = im(:,:,1) * 16 + im(:,:,2) * 4 + im(:,:,3); 

imHist = histc(im(:),0:63);