Python - 在x-y坐标上绘制多幅图像
给定一组图片和与每张图片相关的 (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, ...)
这样就可以实现了。