我一直在向google查询有关kd-trees和图像比较的一些材料,但我无法在使用kd-trees进行图像比较的技术之间建立“链接”。 首先,我发现一些文章谈论随机kd树的速度提升,然后我被介绍给SIFT。在基本了解了SIFT如何工作之后,我读到了最近邻搜索。
我真正的问题是:如果我有来自SIFT的点网格,那么我为每个图像创建kd树。最近邻搜索如何帮助我比较图像?起初,我认为将图像与树进行比较可以使用一些算法来检查树结构,以及每个点距图像A的距离和图像B中同一节点中的点的距离。
如果问题太愚蠢,请提供材料或搜索主题。
谢谢!
答案 0 :(得分:8)
我建议先了解慢速特征匹配,不要使用kdtrees。
如你所知, 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);