gpt4 book ai didi

python - 如何仅使用 numpy 和 PIL 检测图像翻译

转载 作者:行者123 更新时间:2023-11-30 21:54:53 25 4
gpt4 key购买 nike

给定两个图像,我需要检测两者之间是否存在平移偏移。我只能使用 numpy 和 PIL。

This post展示了如何使用 PIL 应用 (x, y) 翻译,但尚未找到类似的内容来检测翻译。

根据我的阅读,互相关似乎是解决方案的一部分,并且有 numpy.correlate功能。但是,我不知道如何使用该函数的输出来检测水平和垂直平移坐标。

first image

second image

最佳答案

由于这些(几乎)是二维数组,因此您需要 scipy.signal.correlate2d() 函数。

首先,读取图像并转换为数组:

import numpy as np
from PIL import Image
import requests
import io

image1 = "/image/lf2lc.png"
image2 = "/image/MMSdM.png"

img1 = np.asarray(Image.open(io.BytesIO(requests.get(image1).content)))
img2 = np.asarray(Image.open(io.BytesIO(requests.get(image2).content)))

# img2 is greyscale; make it 2D by taking mean of channel values.
img2 = np.mean(img2, axis=-1)

现在我们有了两个图像,我们可以调整 the scipy.signal.correlate2d() documentation 中的示例:

from scipy import signal

corr = signal.correlate2d(img1, img2, mode='same')

如果您出于某种原因想避免使用 scipy,那么这应该是等效的:

pad = np.max(img1.shape) // 2
fft1 = np.fft.fft2(np.pad(img1, pad))
fft2 = np.fft.fft2(np.pad(img2, pad))
prod = fft1 * fft2.conj()
result_full = np.fft.fftshift(np.fft.ifft2(prod))
corr = result_full.real[1+pad:-pad+1, 1+pad:-pad+1]

现在我们可以计算最大相关性的位置:

y, x = np.unravel_index(np.argmax(corr), corr.shape)

现在我们可以可视化结果,再次调整文档示例:

import matplotlib.pyplot as plt

y2, x2 = np.array(img2.shape) // 2

fig, (ax_img1, ax_img2, ax_corr) = plt.subplots(1, 3, figsize=(15, 5))
im = ax_img1.imshow(img1, cmap='gray')
ax_img1.set_title('img1')
ax_img2.imshow(img2, cmap='gray')
ax_img2.set_title('img2')
im = ax_corr.imshow(corr, cmap='viridis')
ax_corr.set_title('Cross-correlation')
ax_img1.plot(x, y, 'ro')
ax_img2.plot(x2, y2, 'go')
ax_corr.plot(x, y, 'ro')
fig.show()

绿点是img2的中心。红点是放置绿点时相关性最大的位置。

img1, img2 and correlation

关于python - 如何仅使用 numpy 和 PIL 检测图像翻译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58174390/

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