下面的图像显示了两个相同半径的圆,用抗锯齿渲染,只是左圆圈水平移动了一半像素(注意圆圈水平中心位于左边像素的中间,并且在像素边界处在右边)。
如果我执行互相关,我可以在相关数组上取最大值的位置,然后计算移位。但由于像素位置总是整数,我的问题是:
“如何在Numpy / Scipy中使用互相关获得两个图像之间的子像素(浮点)偏移?”
在我的脚本中,我使用的是scipy.signal.correlate2d
或scipy.ndimage.filters.correlate
,它们似乎会产生相同的结果。
这里的圆圈只是示例,但我的特定于域的功能往往会出现子像素移位,目前只获得整数移位会产生不太好的结果......
非常感谢任何帮助!
答案 0 :(得分:4)
我有一个非常类似的问题,也有转移的圈子,偶然发现了一个名为'图像注册'作者:Adam Ginsburg。它为您提供亚像素2D图像移位,并且相当快。我相信它是一个流行的MATLAB模块的Python实现,它只对x相关峰值周围的图像进行上采样。
检查出来:https://github.com/keflavich/image_registration
我一直在使用' chi2_shifts.py'效果很好。
答案 1 :(得分:3)
离散互相关(由那些实现)只能具有单个像素精度。我能看到的唯一解决方案是将2D数组内插到更精细的网格(上采样)。
Here's关于DSP关于互相关之前的上采样的一些讨论。