如何估算非均匀平移/旋转下图像的亚像素位移

5
我有几张图像,它们完全重叠在同一场景上。但是所有图像之间存在一个小的偏移量,大约为1像素或更少,即亚像素偏移。假设这是问题(1):我该如何估计两个图像之间的这种亚像素偏移(实际上,我知道如何并且我在下面写了相关代码)。我在这里使用了Python。
除了问题(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像素的步长计算了整个图像表面上的偏移。因此,我现在已经估计出非均匀偏移,如下所示non-uniform shift estimated。然后,我可以从这些点估计的偏移值插值出一个表面,这将为图像的每个像素提供一个估计的偏移值。为此,我必须使用与图像分辨率相同的表面进行插值。我使用numpy.griddata完成了这项工作。以下是两个分量(x和y)的结果x and y components of the non-uniform shift interpolated。因此,我已经估计出了整个图像表面上的非均匀偏移。

问题(3):我现在想将此移位应用于所有图像,但不知道如何操作。要将图像移动到亚像素位置,您可以使用来自scipy.ndimage的函数fourier_shift,您可以在这里找到,但是您只能为所有图像提供单个移位。在这里,我希望为图像的每个像素提供一个移位。
你们有什么解决问题(3)的想法吗?另外,如果您认为有更简单的方法来解决问题1和3,那也很有用!信息:我有7张16000x26000px的图片,所以解决问题(2)需要一些时间。
1个回答

3

现在您需要在位置(x + x_shift(x,y), y + y_shift(x,y))处进行原始图像的插值。可能scipy.interpolate.interpn是最有效的方法。

我认为您的代码应该是这样的(未经过测试):

import numpy as np
import spicy

# ... (load data, find shifts, etc.)

input_coords = (np.arange(x_size), np.arange(y_size))
output_coords = np.column_stack((
   ( x_shift + input_coords[0] ).ravel(),
   ( y_shift + input_coords[1][None,:] ).ravel() ))
output_image = scipy.interpolate.interpn(input_coords, original_image, output_coords,
                                         method='linear', bounds_error=False)

谢谢,它完成了任务! - Lionel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接