Python - 在x-y坐标上绘制多幅图像

2 投票
1 回答
6715 浏览
提问于 2025-04-18 00:21

给定一组图片和与每张图片相关的 (x,y) 坐标,我想创建一个“合成”图,把这些图片放在它们各自的 (x,y) 坐标上。

比如,假设有这样一组数据,每个项都是一个 (x, y, 图片) 的组合:

images = [(0,0,'image1.jpg'), (0,1,'image2.jpg'), (1,0,'image3.jpg)]

我想创建一个图,在 (0,0) 的位置放上 image1.jpg,在 (0, 1) 的位置放上 image2.jpg,依此类推……

我之前用 PIL 库手动处理这个问题,做了很多手动计算、缩放,甚至还手动画坐标轴,把合成的图片拼在一起。虽然能用,但我的代码很乱,生成的图片也不太好看,而且 PIL 库在不同环境下有些兼容性问题。

有没有办法用 Matplotlib 来实现这个呢?我试着查找他们的示例,但没有找到我想要的,而且 Matplotlib 的功能太多,让我有点晕。

如果有人能给我一些建议,让我能开始做这个,我会非常感激。

作为参考,我想用 Python 2.7,不过我也能把任何 3.x 的代码转换过来。

自我补充:也许这就是我想要的:

在绘图窗口中放置自定义图片——作为自定义数据标记或注释这些标记

编辑:请查看接受的答案。为了后人,这里有一个基本的工作示例。我还在图片周围加了黑色边框,这样看起来更好:

import matplotlib.pyplot as plt
from matplotlib._png import read_png
from matplotlib.pylab import Rectangle, gca

def main():
    ax = plt.subplot(111)
    ax.set_autoscaley_on(False)
    ax.set_autoscalex_on(False)
    ax.set_ylim([0,10])
    ax.set_xlim([0,10])

    imageData = read_png('image1.png')
    plt.imshow(imageData, extent=[0,2,0,1])
    gca().add_patch(Rectangle((0,0),2, 1, facecolor=(0,0,0,0)))

    imageData = read_png('image2.png')
    plt.imshow(imageData, extent=[2,4,1,2])
    gca().add_patch(Rectangle((2,1),2, 1, facecolor=(0,0,0,0)))

    imageData = read_png('image4.png')
    plt.imshow(imageData, extent=[4,6,2,3])
    gca().add_patch(Rectangle((4,2),2, 1, facecolor=(0,0,0,0)))

    plt.draw()
    plt.savefig('out.png', dpi=300)

1 个回答

5

要控制一张图片在数据空间中的显示位置,可以使用 imshow 函数的 extent 参数。这个参数可以设置图片的四个边缘位置,分别是 [左, 右, 下, 上]。你可以这样写:

list_of_corners = [(left0, right0, bottom0, top0), ...]
list_of_images = [im0, im1, ...]
fig, ax = plt.subplots(1, 1)

for extent, img in zip(list_of_corners, list_of_images):
    ax.imshow(img, extent=extent, ...)

这样就可以实现了。

撰写回答