我有几个完全重叠在同一场景上的图像。但是所有图像之间都有很小的偏移,例如1px或更小,因此只有一个亚像素偏移。可以说这是问题(1):如何估算2张图像之间的亚像素偏移(实际上,我知道如何并且我在下面编写有关此代码)。我在这里使用了python。
除了问题(1)之外,还有问题(2),它与整个图像上的不均匀偏移有关。让我们给出图像A和图像B,在左上角,图像A在x和y轴上偏离图像B约1px,但在中心,图像A在x和y轴上也偏离图像B 0.5px。图像A和B之间的偏移在图像的整个表面之间不均匀。问题是我如何估计所有图像的所有像素(以一个为参考)的这种非均匀偏移(我们将其命名为一个偏移的表面)(我对此问题也有解决方案,下面将对其进行解释)。
最后,问题(3)将要使用估计的移位表面(由(2)计算)移位图像。我知道如何将图像移动到X轴上的0.5像素和Y轴上的1.2像素。但是我不知道如何对每个像素进行特定移位的数组。
我的解决方案:
问题(1):可以使用Fourier空间中的互相关来解决此问题。 scipy库中已经存在一个函数:register_translation
reference here,我只需要提供两个图像作为参数和所需的浮点精度即可。
问题(2):请记住,图像的所有表面之间的偏移都不均匀。我所做的基本上是在500x500像素的窗口上进行的,偏移是均匀的,可以根据问题(1)轻松估算。因此,我使用窗口500x500px和100px的步长计算了图像所有表面之间的偏移。因此,我现在估算出非均匀偏移,如下所示。然后,我可以根据该轴估计位移对表面进行插值,这将为我提供图像每个像素的估计位移。为此,我必须对具有相同图像分辨率的表面进行插值。我使用numpy.griddata
做到了。这是两个分量(x和y)的结果。因此,我估计了图像所有表面之间的不均匀偏移。
问题(3):我现在想将此移位应用于所有图像。我不知道该怎么做。要以亚像素偏移图像,可以使用scipy.ndimage
命名为fourier_shift
的函数,可以找到here,但只能对所有图像进行一次偏移。在这里,我想对图像的每个像素进行平移。
你们有解决问题的任何想法(3)吗?另外,如果您认为有最简单的方法来解决问题1和3,它仍然会很有用!作为参考,我有7张16000x26000px的图像,因此需要花一些时间来解决问题(2)。
答案 0 :(得分:1)
您现在需要在位置(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)