【发布时间】:2019-05-15 07:18:44
【问题描述】:
我有几张完全重叠同一场景的图像。但是所有图像之间都有一个小的偏移,比如 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):这个问题可以使用傅里叶空间中的互相关来解决。 scipy库中已经存在一个函数:register_translationreference here,我只需要给两个图像作为参数和我想要的浮点精度。
问题 (2):请记住,图像的所有表面之间的偏移是不均匀的。我所做的基本上是在 500x500 像素的窗口上,偏移是均匀的,可以从问题 (1) 中轻松估计。因此,我计算了窗口为 500x500px 和步长为 100px 的图像所有表面之间的偏移。因此,我现在有估计如下 所示的非均匀移位。然后,我可以从这个估计的偏移中插入一个表面,这将为我提供图像每个像素的估计偏移。为此,我必须插入具有相同图像分辨率的表面。我做到了,使用numpy.griddata。这是两个分量(x 和 y) 的结果。因此,我估计了图像所有表面之间的非均匀偏移。
问题 (3):我现在想将这种转变应用于所有图像。我不知道该怎么做。要以子像素移动图像,您可以使用scipy.ndimage 命名fourier_shift 中的函数,您可以找到here,但您只能对所有图像进行一次移动。在这里,我想对图像的每个像素进行偏移。
你们有解决问题(3)的想法吗?此外,如果您认为有解决问题 1 和 3 的最简单方法,它仍然很有用!供参考,我有 7 张 16000x26000px 的图像,所以像我一样解决问题 (2) 需要一些时间。
【问题讨论】:
标签: python image fft image-registration