【问题标题】:Difference between images of different sizes不同尺寸图像之间的差异
【发布时间】:2021-06-25 18:19:10
【问题描述】:

我的问题如下。我有一个图像img0(数组形状(A,B,3)),然后从该图像的中间切出一张脸img1(通过我无法访问的算法:我的输入只是整个图像,并且从中切出的脸),现在是一个形状为(C,D,3) 的数组,其中 Ccolored 不同)——这些操作不会影响img1 仅包含人脸的数组,它将保持为 (C,D,3)。由于形状不匹配,img0-img1 之类的东西不起作用。

我猜想在img0 中找到面部起始坐标的方法适用于切出的面部是矩形的情况(我可以使用,但并不理想),因为可以保证img1img0 中的面部完全相同。也就是说,要得到背景,我们只需要在img0中找到img1数组的起始坐标,从img0中剪掉后面的元素(对应img1),就剩下了与背景。在我对脸部做了任何我想做的事情之后,我可以使用新的 (C,D,3) 数组来代替整个图像中之前的 img1 部分 (img0)。

有没有办法在 Python 中做到这一点?即,计算两个不同大小的图像之间的差异,其中一个图像是另一个图像的“子图像”?或者,如果我们不能找到对应于我们可用的矩形切口 (img1) 的图像矩形部分 (img0) 的起始 坐标?

【问题讨论】:

  • 使用 cv2.matchTemplate() 在大图像的原始剪切上找到小剪切在大图像中的位置。获取最佳匹配的坐标。然后使用它们将经过颜色修改的切口放回大图像中的该位置。

标签: python image numpy opencv image-processing


【解决方案1】:

或者,如果我们不能找到对应于我们可用的矩形切口 (img1) 的图像 (img0) 的矩形部分的起始坐标?

一种简单的方法是将您的零均值剪切与零均值原始图像进行交叉关联。由于您没有向图像添加噪声,因此互相关的任何最大值都是可能的候选者。

但是:

(i) 如果您不使用面孔,但例如块,会有多个最大值,你没有唯一的解决方案。 (ii) 这不是解决您问题的完美解决方案。

我修改了 [1] 中的代码示例以使其更清晰:

from scipy import signal, misc
import numpy as np

face = misc.face(gray=True)
face = face - np.mean(face)
face_cutout = np.copy(face[300:365, 670:750])
face_cutout = face_cutout - np.mean(face_cutout)

corr = signal.correlate2d(face, face_cutout, mode='valid')
y, x = np.unravel_index(np.argmax(corr), corr.shape)  # find the match

print(f'x: {x} y: {y}')

[1]https://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.correlate2d.html

【讨论】: