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

时间:2014-03-28 18:55:43

标签: python image matplotlib plot

给定一组图像,以及与每个图像相关联的(x,y)坐标,我想创建一组我的图像的“复合”图,每个图像都在(x,y)坐标处。

例如,给定以下集合,列表中的每个项目都是(x,y,image)元组:

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

我想创建一个绘图,其中对应于image1.jpg的图像绘制在坐标(0,0)的xy图上,对应于image2.jpg的图像绘制在(0, 1)等...

我一直在使用PIL进行非常手动的处理,在那里我会进行大量的手动计算,缩放,甚至手绘轴等,以便将合成图像“粘贴”在一起。它可以工作,但我的代码很乱,结果图像不太漂亮,看起来像PIL库有一些可移植性问题。

有没有办法用Matplotlib做到这一点?我试着通过他们的例子进行搜索,但是没有一个是我想要的,而且你可以用Matplotlib做很多事情让我头晕目眩。

如果有人有任何指示可能让我开始,我们将非常感激。

作为参考,我试图针对Python 2.7,虽然我足够精明来翻译任何3.x代码。

自我编辑:也许这就是我要找的东西:

Placing Custom Images in a Plot Window--as custom data markers or to annotate those markers

编辑:看到接受的答案。为了后人,这是一个基本的工作实例。我还在图像周围添加了黑色边框,这样可以很好地触摸它:

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 个答案:

答案 0 :(得分:2)

要控制图像在数据空间中的显示位置,请使用设置extent边缘位置的imshow [left, right, bottom, top] kwarg list_of_corners = [(left0, right0, bottom0, top0), ...] list_of_images = [im0, im1, ...] ax, fig = plt.subplots(1, 1) for extent, img in zip(list_of_corners, list_of_images): ax.imshow(img, extent=extent, ...) 。类似的东西:

{{1}}

应该这样做。