我一直试图在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中做到这一点并使其看起来像左手图像。
答案 0 :(得分:5)
预先解决方案。
宽度/高度/比例:300/375 / 0.800
宽度/高度/比率:400/464 / 0.862
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")
您在问题中提供的最重要信息是:
从这些观点得出的结论是:其中一个图像的长宽比必须改变。这可以使用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)
元组完全一致,如果你可能依赖缩略图来获得这个确切的大小。