13

我意识到这是一个高度专业化的问题..但是这里有。我正在使用 SIFT 的实现来查找两个图像上的匹配项。使用我当前的实现,当我将图像与 90 度或 180 度版本匹配时,我得到的匹配一致地偏离了大约半个像素,但它在一个范围内变化。因此,例如,如果在 im1 中的像素坐标 (x,y) 处找到匹配项,则其 90 度旋转图像 im2 中的对应匹配项位于 (x,y + 0.5) 处。如果我使用 180 度图像,则偏移量出现在 x 和 y 坐标中,如果我使用 270 度 (-90) 旋转图像,则仅在 x 中出现。

1)首先,我假设 SIFT 应该在旋转图像中给我相同的匹配位置。一个隐含的假设是旋转不会改变我确认为真的图像的像素值。(我使用 IRFAN View 旋转并保存为 .pgm 并且像素值保持不变)。

2)我有其他没有给出这个偏移量的实现。

3)我假设这个偏移量与编程相关,并且可能与从比例空间关键点坐标到图像空间关键点坐标的转换有关。

我希望有人遇到过这个问题,或者可以向我指出如何从比例空间转换为图像空间的参考。

4

2 回答 2

4

与 Mikola 的断言相反,可以从 SIFT 中获得规模和方向。SIFT 试图找到具有最大 DOG 极值 ( s ) 的尺度,并找到一个主导方向 ( r )。SIFT 特征的每个位置向量返回(x, y, s, r)

要查看比例空间如何转换为像素,请尝试 VLFeat 的实现。特别是,使用 vl_plotsiftdescriptor 来绘制描述符。对于此实现,您可以看到s如何相对于像素进行缩放。要找出其他实现,请找到两种实现的相同功能,并查看比例因子s有何不同。

于 2011-06-16T16:24:52.773 回答
2

首先是一般性评论:

SIFT 只为您提供像素坐标中 x,y 位置的特征。它并没有直接告诉您任何关于给定特征的缩放或旋转设计的任何信息,事实上,特征向量在这些类型的变换下是不变的(即这就是 SIFT 工作的原因)是 SIFT 的定义特征。 ~~(编辑:这是错误的,我写这个的时候在想什么?)

0.5 像素的偏移是微不足道的,对于这种差异可能有很多可能的解释。一种可能性是两种实现使用不同的原点坐标;例如,一个将原点放在中间,而另一个将它放在角落。这可能会影响舍入,这可能导致报告的像素位置存在 0.5 的差异。另一种可能性是它们在使用的旋转样本数量上有所不同。或者也许在考虑的尺度数量上。改变这些参数中的任何一个都可能会影响观察到的特征多达几个像素。当然,这都是纯粹的猜测,因为必须真正看到实现才能说出任何确定的内容。

现在解决您更具体的问题:

  1. 这是一个不好的假设。直线采样的图像在旋转下通常不是不变的。如果您的 SIFT 实现对不是 4 倍数的旋转次数进行采样,即使旋转 90 度的倍数也会导致问题。但是,如果有足够的样本,您可以期望它接近正确的结果,但它几乎永远不会是准确的(除了一些非常特殊的退化情况)。

  2. 你怎么知道他们给出了正确的偏移量?它们可能都是相同代码库的克隆或移植,并且可能有类似的错误。

  3. 我不知道为什么你会期望它是一样的,因为 SIFT 依赖于许多内部旋转因素,这些因素可能因实现而异。

最后,我不确定“从比例空间转换为图像空间”是什么意思。比例空间是为图像定义的——不是点——并且在比例空间和图像空间中的坐标之间没有 1:1 的映射。如果你只是想将一个尺度空间图像转换成一个常规图像,只需取 0-scale 切片。如果要将图像转换为尺度空间表示,请将其与一堆不同半径的高斯进行卷积。

于 2011-06-13T19:36:43.277 回答