C++ 大卫·洛';s SIFT——关于比例空间和图像坐标的问题(奇怪的偏移问题)

C++ 大卫·洛';s SIFT——关于比例空间和图像坐标的问题(奇怪的偏移问题),c++,image-processing,computer-vision,sift,C++,Image Processing,Computer Vision,Sift,我意识到这是一个高度专业化的问题。。但事情是这样的。我正在使用SIFT的一个实现来查找两幅图像上的匹配项。在我目前的实现中,当我匹配一个90度或180度版本的图像时,我得到的匹配一致地偏离了大约半个像素,但它在一个范围内变化。例如,如果在im1中的像素坐标(x,y)处找到匹配,则其90度旋转图像im2中的对应匹配位于(x,y+0.5)。如果使用180度图像,则偏移将同时显示在x和y坐标中,并且仅在使用270度(-90)旋转图像时才显示在x坐标中 1) 首先,我假设SIFT应该在旋转图像中给我相同

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

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

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

3) 我假设该偏移与编程有关,可能与从比例空间关键点坐标到图像空间关键点坐标的转换有关


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

首先是一般性评论:

SIFT只提供在像素坐标中具有x、y位置的特征。通过设计,它不会直接告诉您任何关于给定特征的比例或旋转的信息,事实上,SIFT的定义特征是特征向量在这些类型的变换下是不变的(即这就是SIFT工作的原因)。~(编辑:这是错误的,我写这篇文章时是否在思考WTF?)

0.5像素的偏移量是无关紧要的,对于这种差异可能有很多可能的解释。一种可能性是两种实现使用不同的原点坐标;例如,一个放在中间,另一个把它放在角落里。这可能会影响舍入,这可能导致报告的像素位置相差0.5。另一种可能性是,它们在使用的旋转样本数量上存在差异;或者可能是在所考虑的尺度数量上。可以想象,更改这些参数中的任何一个都会对观察到的特征产生多达几个像素的影响。当然,这都是纯粹的猜测,因为要说任何确定的话,都必须实际看到实现

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

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

  • 你怎么知道他们给出了正确的补偿?它们可能都是相同代码库的克隆或端口,并且可能有类似的bug

  • 我不知道为什么您会期望它是相同的,因为SIFT依赖于许多内部旋转因素,这些因素在不同的实现中可能会有所不同


  • 最后,我不知道你所说的“从比例空间转换到图像空间”是什么意思。比例空间是为图像而不是点定义的,并且比例空间和图像空间中的坐标之间没有1:1的映射。如果只想将缩放空间图像转换为常规图像,只需获取0比例切片。如果你想把一幅图像转换成一个尺度空间表示,用一组不同半径的高斯函数来卷积它。

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


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

    有趣的是,您是否有代码可以共享?我想您忘记了问题的“问题”部分……这是相机图像还是医学图像?。你需要考虑像素间距吗?你能发布样本图像吗?