PIL:覆盖具有不同尺寸和宽高比的图像

时间:2015-02-22 14:25:18

标签: python python-imaging-library

我一直试图在python中叠加两个图像以匹配坐标,左上角和右下角具有相同的坐标,它们的方面几乎相同,只有几个像素。虽然它们的分辨率不同。

使用PIL我已经能够覆盖图像,但是在覆盖它们之后,图像输出是方形但分辨率是背景图像的分辨率,前景图像也被错误地重新调整大小(据我所见) 。我一定是做错了。

import Image
from PIL import Image

#load images
background = Image.open('ndvi.png')
foreground = Image.open('out.png')

#resizing
foreground.thumbnail((643,597),Image.ANTIALIAS)
#overlay
background.paste(foreground, (0, 0), foreground)
#save
background.save("overlay.png")
#display
background.show()

当将图像放入像powerpoint这样可怕的东西时,图像方面几乎完全相同。我已经包含了一个示例图像,左边的图像是我手工叠加的图像,右边的图像是python的输出。代码中某些点的背景垂直压扁,也影响叠加。我希望能够在python中做到这一点并使其看起来像左手图像。

enter image description here

1 个答案:

答案 0 :(得分:5)

预先解决方案。

背景图片

宽度/高度/比例:300/375 / 0.800

enter image description here

前景图像

宽度/高度/比率:400/464 / 0.862

enter image description here

重叠

from PIL import Image

imbg = Image.open("bg.png")
imfg = Image.open("fg.png")
imbg_width, imbg_height = imbg.size
imfg_resized = imfg.resize((imbg_width, imbg_height), Image.LANCZOS)
imbg.paste(imfg_resized, None, imfg_resized)
imbg.save("overlay.png")

enter image description here

讨论

您在问题中提供的最重要信息是:

  • 您的前景和背景图片的宽高比相等,但类似
  • 两个图像的左上角和右下角最后需要对齐。

从这些观点得出的结论是:其中一个图像的长宽比必须改变。这可以使用resize()方法(而非thumbnail()来实现,如下所述)。总而言之,目标只是:

将尺寸较大的图像(前景图像)调整为较小背景图像的精确尺寸。也就是说,不一定要保持前景图像的宽高比。

这就是上面的代码正在做的事情。

对你的方法有两点评论:

首先,我建议使用Pillow的最新版本(Pillow是PIL的延续项目,它与API兼容)。在2.7版本they have largely improved the image re-scaling quality中。该文档可在http://pillow.readthedocs.org/en/latest/reference找到。

然后,您显然需要控制两个图像的纵横比如何在整个程序中发展。例如,thumbnail() 会改变图像的宽高比,即使您的size元组与原始图像的宽高比不同。引自thumbnail()文档:

  

此方法修改图像以包含缩略图版本   本身,不大于给定的大小。这个方法计算一个   适当的缩略图大小为保留图像的方面

所以,我不确定你的确与你的(643,597)元组完全一致,如果你可能依赖缩略图来获得这个确切的大小。