如何将图像与kd-trees和最近邻搜索进行比较/匹配?

时间:2011-04-18 02:45:33

标签: computational-geometry nearest-neighbor sift kdtree

我一直在向google查询有关kd-trees和图像比较的一些材料,但我无法在使用kd-trees进行图像比较的技术之间建立“链接”。 首先,我发现一些文章谈论随机kd树的速度提升,然后我被介绍给SIFT。在基本了解了SIFT如何工作之后,我读到了最近邻搜索。

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

如果问题太愚蠢,请提供材料或搜索​​主题。

谢谢!

3 个答案:

答案 0 :(得分: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。 (Lowe是SIFT的发明者。)

为了比较两个图像I和Q,人们找到一组特征向量 - 几百到几千个SIFT向量 - 每个, 并寻找这些集合的近似匹配。 (人们可能会认为图像是分子,特征是原子; 近匹配分子比近匹配原子更难 但它有助于快速匹配原子。)

希望这有帮助。

答案 1 :(得分:0)

如果您计划在更高维度使用kd-trees进行近似NN搜索,则可能需要在此处查看实验:http://zach.in.tu-clausthal.de/software/approximate_nn/

答案 2 :(得分: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);