如何用scipy进行亚像素精度的图像互相关

时间:2012-12-05 19:28:07

标签: python image-processing scipy cross-correlation

下面的图像显示了两个相同半径的圆,用抗锯齿渲染,只是左圆圈水平移动了一半像素(注意圆圈水平中心位于左边像素的中间,并且在像素边界处在右边)。

如果我执行互相关,我可以在相关数组上取最大值的位置,然后计算移位。但由于像素位置总是整数,我的问题是:

“如何在Numpy / Scipy中使用互相关获得两个图像之间的子像素(浮点)偏移?”

在我的脚本中,我使用的是scipy.signal.correlate2dscipy.ndimage.filters.correlate,它们似乎会产生相同的结果。

这里的圆圈只是示例,但我的特定于域的功能往往会出现子像素移位,目前只获得整数移位会产生不太好的结果......

非常感谢任何帮助!

enter image description here

2 个答案:

答案 0 :(得分:4)

我有一个非常类似的问题,也有转移的圈子,偶然发现了一个名为'图像注册'作者:Adam Ginsburg。它为您提供亚像素2D图像移位,并且相当快。我相信它是一个流行的MATLAB模块的Python实现,它只对x相关峰值周围的图像进行上采样。

检查出来:https://github.com/keflavich/image_registration

我一直在使用' chi2_shifts.py'效果很好。

答案 1 :(得分:3)

离散互相关(由那些实现)只能具有单个像素精度。我能看到的唯一解决方案是将2D数组内插到更精细的网格(上采样)。

Here's关于DSP关于互相关之前的上采样的一些讨论。