gpt4 book ai didi

python - 如何检测图像之间的偏移

转载 作者:太空狗 更新时间:2023-10-29 17:47:16 32 4
gpt4 key购买 nike

我正在分析多张图片,需要能够判断它们与引用图片相比是否发生了偏移。目的是判断相机是否在拍摄图像之间移动。理想情况下,我希望能够纠正偏移以便仍然进行分析,但至少我需要能够确定图像是否偏移并在超出特定阈值时将其丢弃。

以下是我想要检测的图像变化的一些示例:

reference image shifted image 1 shifted image 2

我将使用第一张图片作为引用,然后将以下所有图片与其进行比较,以确定它们是否发生了偏移。图像是灰度的(它们只是使用热图以彩色显示)并存储在二维 numpy 数组中。我有什么想法可以做到这一点?我更愿意使用我已经安装的包(scipy、numpy、PIL、matplotlib)。

最佳答案

正如 Lukas Graf 所暗示的,您正在寻找互相关。它运作良好,如果:

  1. 您的图片比例不会发生显着变化。
  2. 图像没有旋转变化。
  3. 图像中没有明显的光照变化。

对于普通翻译,互相关非常好。

最简单的互相关工具是scipy.signal.correlate。然而,它使用了简单的互相关方法,对于边长为 n 的二维图像,它的复杂度为 O(n^4)。在实践中,您的图片会花费很长时间。

更好的是 scipy.signal.fftconvolve,因为卷积和相关性密切相关。

像这样:

import numpy as np
import scipy.signal

def cross_image(im1, im2):
# get rid of the color channels by performing a grayscale transform
# the type cast into 'float' is to avoid overflows
im1_gray = np.sum(im1.astype('float'), axis=2)
im2_gray = np.sum(im2.astype('float'), axis=2)

# get rid of the averages, otherwise the results are not good
im1_gray -= np.mean(im1_gray)
im2_gray -= np.mean(im2_gray)

# calculate the correlation image; note the flipping of onw of the images
return scipy.signal.fftconvolve(im1_gray, im2_gray[::-1,::-1], mode='same')

im2_gray[::-1,::-1] 的有趣索引将其旋转 180°(水平和垂直镜像)。这就是卷积和相关的区别,相关是与第二个信号镜像的卷积。

现在,如果我们将第一张(最上面的)图像与其自身相关联,我们会得到:

enter image description here

这给出了图像自相似性的度量。最亮点在 (201, 200),它位于 (402, 400) 图像的中心。

可以找到最亮点坐标:

np.unravel_index(np.argmax(corr_img), corr_img.shape)

最亮像素的线性位置由 argmax 返回,但必须使用 unravel_index 将其转换回二维坐标。

接下来,我们通过将第一张图像与第二张图像相关联来尝试相同的操作:

enter image description here

相关图像看起来相似,但最佳相关已移动到 (149,200),即图像中向上 52 像素。这是两个图像之间的偏移量。


这似乎适用于这些简单的图像。但是,也可能存在错误的相关峰,并且此答案开头概述的任何问题都可能破坏结果。

在任何情况下,您都应该考虑使用窗口函数。功能的选择并不那么重要,只要有东西用就行。此外,如果您遇到小旋转或比例变化的问题,请尝试将几个小区域与周围的图像相关联。这将为您在图像的不同位置提供不同的位移。

关于python - 如何检测图像之间的偏移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24768222/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com