我有几张图像,它们完全重叠在同一场景上。但是所有图像之间存在一个小的偏移量,大约为1像素或更少,即亚像素偏移。假设这是问题(1):我该如何估计两个图像之间的这种亚像素偏移(实际上,我知道如何并且我在下面写了相关代码)。我在这里使用了Python。
除了问题(1),还有问题(2),涉及到整个图像上的非均匀偏移。假设有图像A和图像B,在左上角,图像A在x和y轴上与图像B相比向右下方移动了大约1像素,但在中心,图像A在x和y轴上也向右下方移动了0.5像素。图像A和B之间的偏移在整个图像表面上并不是均匀的。问题是如何估计这种非均匀偏移,称之为偏移表面,对于所有图像的所有像素(以其中一个为参考)(我也有解决方案,我将在下面解释)。
你们有什么解决问题(3)的想法吗?另外,如果您认为有更简单的方法来解决问题1和3,那也很有用!信息:我有7张16000x26000px的图片,所以解决问题(2)需要一些时间。
除了问题(1),还有问题(2),涉及到整个图像上的非均匀偏移。假设有图像A和图像B,在左上角,图像A在x和y轴上与图像B相比向右下方移动了大约1像素,但在中心,图像A在x和y轴上也向右下方移动了0.5像素。图像A和B之间的偏移在整个图像表面上并不是均匀的。问题是如何估计这种非均匀偏移,称之为偏移表面,对于所有图像的所有像素(以其中一个为参考)(我也有解决方案,我将在下面解释)。
最后,问题(3)将使用估计的位移面(在(2)上计算)来移动图像。例如,我知道如何将图像在X轴上移动0.5像素,在Y轴上移动1.2像素。但是我不知道如何为每个像素移动一个特定的偏移量的数组。
我的解决方案:
问题(1):可以使用傅里叶空间中的互相关来解决这个问题。在scipy库中已经存在一个函数:register_translation
此处的参考文献,我只需要将两个图像作为参数,并指定所需的浮点精度即可。
问题(2):请记住,偏移在图像表面上并不均匀。我所做的是,在500x500像素的窗口上,偏移是均匀的,并且可以从问题(1)中轻松估计。因此,我使用500x500像素的窗口和100像素的步长计算了整个图像表面上的偏移。因此,我现在已经估计出非均匀偏移,如下所示。然后,我可以从这些点估计的偏移值插值出一个表面,这将为图像的每个像素提供一个估计的偏移值。为此,我必须使用与图像分辨率相同的表面进行插值。我使用
numpy.griddata
完成了这项工作。以下是两个分量(x和y)的结果。因此,我已经估计出了整个图像表面上的非均匀偏移。
scipy.ndimage
的函数fourier_shift
,您可以在这里找到,但是您只能为所有图像提供单个移位。在这里,我希望为图像的每个像素提供一个移位。你们有什么解决问题(3)的想法吗?另外,如果您认为有更简单的方法来解决问题1和3,那也很有用!信息:我有7张16000x26000px的图片,所以解决问题(2)需要一些时间。