2011-04-18 57 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);