我意识到这是一个非常专业化的问题..但是这里有。我正在使用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)我假设这个偏移是编程相关的,可能与从尺度空间关键点坐标到图像空间关键点坐标的转换有关。
我希望有人遇到过这个问题,或者可以指出我如何从比例空间转换为图像空间的参考。
答案 0 :(得分:4)
与Mikola的断言相反,有可能从SIFT中获得规模和方向。 SIFT尝试找到具有最大DOG极值( s )的比例,并且还找到主导方向( r )。 SIFT特征的每个位置向量都返回(x,y,s,r)
要了解缩放空间如何转换为像素,请尝试使用VLFeat的implementation。特别是,使用vl_plotsiftdescriptor绘制描述符。您可以看到 s 如何相对于此实现的像素进行缩放。要找出其他实现,请在两个实现中找到相同的功能,并查看比例因子 s 的不同。
答案 1 :(得分:2)
首先是一般性评论:
SIFT只为您提供像素坐标中x,y位置的要素。它并没有直接告诉你任何关于给定特征的尺度或旋转的设计,实际上它是SIFT的定义特征,特征向量在这些类型的变换下是不变的(这就是SIFT工作的原因)。 ~~(编辑:这是错的,当我写这篇文章的时候,WTF在想什么?)
0.5像素的偏移是微不足道的,并且对于这种差异可能存在大量可能的解释。一种可能性是两种实现使用不同的原点坐标;例如,一个将原点放在中间,而另一个将它放在一个角落。这可能会影响舍入,这可能会导致报告的像素位置的差异为0.5。另一种可能性是它们使用的旋转样品数量不同;或者可能考虑的尺度数量。改变这些参数中的任何一个都可以想象地影响观察到的特征多达几个像素。当然,这完全是纯粹的推测,因为人们必须真正看到实现说出任何明确的内容。
现在解决您更具体的问题:
这是一个不好的假设。直线采样的图像在旋转下通常不是恒定的。如果您的SIFT实现采样的旋转次数不是4的倍数,即使旋转90度的倍数也会导致问题。但是,如果有足够的样本,您可以期望它接近正确的结果,但它几乎不会是准确的(除非在一些非常特殊的退化情况下)。
你怎么知道他们给出了正确的抵消?它们可能都是相同代码库的克隆或端口,并且可能有类似的错误。
我不知道为什么你会期望它是相同的,因为SIFT依赖于许多内部旋转因素,这些因素可能因实现而异。
最后,我不确定你的意思是“从规模空间转换为图像空间”。缩放空间是为图像定义的 - 而不是点 - 并且在缩放空间和图像空间中的坐标之间没有1:1的映射。如果您只想将比例空间图像转换为常规图像,只需采用0比例切片即可。如果您想将图像转换为比例空间表示,请将其与一堆不同半径的高斯进行卷积。