【问题标题】:Alternative to distance metric in nearest neighbor algorithm?替代最近邻算法中的距离度量?
【发布时间】:2011-03-10 04:40:14
【问题描述】:

我遇到了一个最近邻算法的实现,用于查找两个相似图像中某些关键点之间的匹配。关键点由 SIFT 算法生成。这些点由一个 128 维的向量来描述,两幅图像中都有很多这样的点。

匹配算法使用最近邻搜索,对于一张图像中的每个点,计算另一张图像中对应的最近点。 “接近度”由点的向量之间的最小欧几里德距离来描述。通过仅选取距离低于某个阈值的点对来选择最佳匹配。

然而,我遇到的实现是将一个图像中关键点的所有矢量与另一张图像中的矢量相乘,从而形成一个产品矩阵。然后它会找到乘积高于给定阈值的点。

这个实现给出了正确的结果,但我想知道它是如何工作的。它是使用向量之间的相关性作为度量还是这里发生了其他事情。

【问题讨论】:

  • 我对图像处理知之甚少,但我对内积和度量空间的了解让我想知道实现是否定义了某种不寻常的内积......我不知道现在有很多工作要做,所以我不妨研究一下。看起来很有趣。
  • 这是哪个实现?另外,你能发布一段相关的代码吗?
  • 这是 SIFT GPU 源代码cs.unc.edu/~ccwu/siftgpu 的一部分,可以在 ProgramCU.cu 文件中的 SIFT 匹配部分下找到。我没有在这里发布它,因为它有点庞大和复杂,因为它是 CUDA 内核函数的一部分。

标签: computer-vision nearest-neighbor correlation kdtree sift


【解决方案1】:

看来这毕竟不是内积不同的问题,也不是点积本身的问题。原来这是一个简单的数学问题。

基本上...

假设 abs(a + b) = C,其中 C 是某个常数。 a * b 的最大可能值将始终是 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)

【讨论】:

  • 啊!!现在我确实觉得问这个很傻。事实上,它直接从欧几里德距离公式中计算出来。非常感谢
  • 好吧,使用点积: |a + b|^2 = (a + b) 。 (a + b ) = a.a + 2 a.b + b.b,并且 SIFT 向量都具有相同的长度 a.a = b.b,因此最小化 a.b 最小化 |a + b| .
猜你喜欢
  • 2019-05-26
  • 2015-01-25
  • 2018-09-13
  • 2011-06-18
  • 2014-03-03
  • 2015-03-21
  • 2014-07-10
  • 2018-12-02
  • 2020-08-28
相关资源
最近更新 更多