【问题标题】:Python - plotting multiple images on x-y coordinatesPython - 在 x-y 坐标上绘制多个图像
【发布时间】:2014-03-28 18:55:43
【问题描述】:

给定一组图像,以及与每个图像关联的 (x,y) 坐标,我想为我的一组图像创建一个“合成”图,每个图像都位于其 (x,y) 坐标处。

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

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

我想创建一个绘图,其中与 image1.jpg 对应的图像绘制在坐标 (0,0) 处的 x-y 图上,对应于 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)

【问题讨论】:

  • 您真的想使用像 (0, 1) 这样的 xy 坐标,还是这是一个简化的示例?如果这就是您所需要的,您可以在子图网格中使用imshow。如果您需要将它们放置在更复杂的排列中,那就更麻烦了。
  • 是的,这是一个简化的例子。本质上我想要一个图像的“散点图”。
  • 你有没有看过这个问题:stackoverflow.com/q/4860417/1025391
  • 您也可以使用extent kwarg 到imshow 将其放在数据空间中您想要的任何位置stackoverflow.com/questions/12425395/…
  • 啊,谢谢@tcaswell,这就是我想要的。我周末花了很多时间阅读有关艺术家和盒子以及 Matplotlib 的其他(对我而言)令人困惑的方面。似乎图像空间和数据空间之间的混淆是这类问题中最令人头疼的问题,而且我没有看到将注释扩展到数据空间的明显方法。您的解决方案很简单,可以得到我想要的。

标签: python image matplotlib plot


【解决方案1】:

要控制图像在数据空间中的显示位置,请使用imshowextent kwarg,它设置[left, right, bottom, top] 边缘的位置。比如:

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, ...)

应该可以解决问题。

【讨论】:

  • 此方法无法在一张图中绘制多张图片
猜你喜欢
  • 2014-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-21
  • 2022-01-23
  • 1970-01-01
  • 2021-03-01
  • 2015-08-11
相关资源
最近更新 更多