2010-06-30 60 views
2

我遇到了最近鄰算法的實現,用於查找兩個相似圖像中某些關鍵點之間的匹配。關鍵點是由SIFT算法生成的。點由128維矢量描述,並且在這兩個圖像中都有很多這樣的點。最近鄰算法中距離度量的替代方法?

匹配算法使用最近鄰居搜索,併爲一幅圖像中的每個點計算另一幅圖像中對應的最近點。 '接近度'由點向量之間的最小歐氏距離描述。通過僅選取距離低於特定閾值的那些點來選擇最好的這種匹配。

但是,我遇到的實現將一個圖像中的關鍵點的所有向量與另一個圖像中的關鍵點的向量相乘,從而形成產品矩陣。然後它發現產品高於給定閾值的點。

該實現給出了正確的結果,但我想知道它是如何工作的。它是否使用向量之間的相關性作爲度量標準,或者是否存在其他內容。

+0

我對圖像處理知之甚少,但是我所知道的內部產品和度量空間讓我懷疑實現是否定義了某種不尋常的內部產品......我沒有太多的事要做現在正在工作,所以我不妨看看它。看起來很有趣。 – JAB 2010-06-30 15:33:07

+0

這是哪個實現?另外,你可以發佈相關部分的代碼嗎? – Jacob 2010-06-30 15:41:08

+0

這是SIFT GPU源代碼http://www.cs.unc.edu/~ccwu/siftgpu/ 的一部分,可以在ProgramCU.cu文件的SIFT匹配部分下找到。我沒有在這裏發佈它,因爲它是CUDA內核函數的一部分,它有點龐大而複雜。 – Slartibartfast 2010-06-30 17:37:16

回答

2

看來,它畢竟不是內部產品的差異,也不是點積產品本身的問題。原來這是一個簡單的數學問題。

基本上...

假設ABS(A + B)= C,其中C爲某個常數。 a * b的最大可能值將始終是結果(s),其中a == b == + - C/2。因此,a和b之間的距離在其乘積最大時最小,反之亦然。這適用於所有實數(包括正數和負數),也可以擴展到多個維度,所以它可能適用於複數(儘管我沒有用這種方法測試過)。

實施例與C = 20:

((A,B),距離,產品)

((0,  20),  20.0,0)
((1,  19 ),  18.0,19)
((2,  18),16.0  ,36)
((3,  17),14.0  ,51)
((4,  16),  12.0,64)
((5,  15),  10.0,75)
((6,  14),  8.0,    84)
((7,  13),  6.0     91)
((8,  12),  4.0,    96)
((9,  11),  2.0,    99)
((10,10),0.0,  100)           (正如你可以看到,該距離爲最小,同時該產品是最大。)
((11,9),    2。0,    99)
((12,8),    4.0,    96)
((13,7),    6.0,    91)
((14,6),    8.0,    84)
((15,5),    10.0,75)
((16,4),    12.0,64)
((17,3),    14.0,51)
((18,2),    16.0,36)
((19,1),    18.0,19)
((20,0),    20.0,0)

+0

啊!現在我對這個問題感到很無聊。事實上,它直接根據歐式距離公式計算出來。非常感謝你 – Slartibartfast 2010-06-30 17:30:06

+0

你很受歡迎。 – JAB 2010-06-30 17:53:00

+0

那麼,使用點積:| a + b |^2 =(a + b)。 (a + b)= a.a + 2 a.b + b.b,並且SIFT向量都具有相同的長度a.a = b.b,所以使a.b最小化| a + b | 。 – denis 2011-04-22 13:40:16