【问题标题】:PIL: overlaying images with different dimensions and aspect ratiosPIL:覆盖具有不同尺寸和纵横比的图像
【发布时间】:2015-04-23 21:34:50
【问题描述】:

我一直试图在 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 中执行此操作并使其正确地看起来像左手图像。

【问题讨论】:

    标签: python python-imaging-library


    【解决方案1】:

    提前解决。

    背景图片

    宽度/高度/比例: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(),如下所述)。总而言之,目标很简单:

    将较大尺寸的图像(前景图像)调整为较小背景图像的精确尺寸。即,不一定要保持前景图像的纵横比。

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

    您的方法有两个 cmet:

    首先,我推荐使用最新版本的 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) 元组的确切位置,以及您之后是否可能依赖缩略图来获得这个确切的大小。

    【讨论】:

    • 太好了,谢谢!真正全面的解决方案。我从其他地方收集了一些方法来达到错误的结果。这完全符合我的需要。纵横比错误不是主要问题,可以纠正。
    • 很高兴能帮上忙。我知道这很容易发生,尤其是对于像 PIL 这样的“旧”和已建立的库。但是,返回原始文档以全面了解单个方法的实际作用总是有帮助的。
    猜你喜欢
    • 2014-09-26
    • 1970-01-01
    • 2018-08-28
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 2013-06-13
    • 2016-08-06
    • 2021-06-06
    相关资源
    最近更新 更多