在一个IPython Notebook单元格中显示多个图像?

Dav*_*ver 57 ipython ipython-notebook

如果我有多个图像(加载为NumPy数组),我如何在一个IPython Notebook单元格中显示?

我知道我可以plt.imshow(ima)用来显示一张图片...但我想一次显示多张图片.

我试过了:

 for ima in images:
     display(Image(ima))
Run Code Online (Sandbox Code Playgroud)

但我只是得到一个破碎的图像链接:

在此输入图像描述

min*_*nrk 90

简短回答:

plt.figure()如果您想在单元格中使用多个数字,请致电创建新数据:

for ima in images:
    plt.figure()
    plt.imshow(ima)
Run Code Online (Sandbox Code Playgroud)

但澄清混淆Image:

IPython.display.Image用于显示图像文件,而不是数组数据.如果要使用Image显示numpy数组,则必须先将它们转换为文件格式(使用PIL最简单):

from io import BytesIO
import PIL
from IPython.display import display, Image

def display_img_array(ima):
    im = PIL.Image.fromarray(ima)
    bio = BytesIO()
    im.save(bio, format='png')
    display(Image(bio.getvalue(), format='png'))

for ima in images:
    display_img_array(ima)
Run Code Online (Sandbox Code Playgroud)

说明这两种方法的笔记本.

  • 链接笔记本的微妙之处:如果您希望图像出现,您需要执行 `%matplotlib inline`。 (2认同)
  • 有没有很好的解释为什么我必须在每个图像之前'plt.figure()`? (2认同)

dva*_*val 68

这更容易,有效:

from IPython.display import Image
from IPython.display import display
x = Image(filename='1.png') 
y = Image(filename='2.png') 
display(x, y)
Run Code Online (Sandbox Code Playgroud)

  • 这应该是公认的答案.如果你有一个图像数组,这可以工作:`display(*images)` (11认同)
  • 我喜欢这个,但它显示的图像比“plt.imshow()”大得多。[似乎无法控制大小](https://ipython.readthedocs.io/en/stable/api/ generated/IPython.display.html#IPython.display.display)。 (3认同)
  • 正是我需要的 - 我没有使用numpy数组或实际情节,我只是有.pngs显示,这是完美的.谢谢! (2认同)

Mic*_*ael 51

水平布局

水平布局演示

简短的回答

plt.figure(figsize=(20,10))
columns = 5
for i, image in enumerate(images):
    plt.subplot(len(images) / columns + 1, columns, i + 1)
    plt.imshow(image)
Run Code Online (Sandbox Code Playgroud)

答案很长

import glob
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
%matplotlib inline

images = []
for img_path in glob.glob('images/*.jpg'):
    images.append(mpimg.imread(img_path))

plt.figure(figsize=(20,10))
columns = 5
for i, image in enumerate(images):
    plt.subplot(len(images) / columns + 1, columns, i + 1)
    plt.imshow(image)
Run Code Online (Sandbox Code Playgroud)

  • 行数应该是整数。将 plt.subplot(len(images) / columns + 1, columns, i + 1) 更改为 plt.subplot(int(len(images) / columns + 1), columns, i + 1) (5认同)
  • 这是一个伟大而有用的答案! (4认同)
  • 这是枚举多个数字的好方法 (2认同)

PBr*_*ann 16

您可以使用显示和HTML功能在一个IPython Notebook单元格中显示多个图像.您需要创建一组html img标记作为字符串,如下所示

from IPython.display import Image, HTML, display
from glob import glob
imagesList=''.join( ["<img style='width: 120px; margin: 0px; float: left; border: 1px solid black;' src='%s' />" % str(s) 
                 for s in sorted(glob('yourimage*.png')) ])
display(HTML(imagesList))
Run Code Online (Sandbox Code Playgroud)

http://nbviewer.ipython.org/github/PBrockmann/Dodecahedron查看使用示例

您可能需要刷新浏览器(shift + load)以查看新图像(如果它们已从先前的单元格更改).


Kar*_*Żak 11

您可以使用IPyPlot快速轻松地完成此操作

import ipyplot

ipyplot.plot_images(images_array, max_images=20, img_width=150)
Run Code Online (Sandbox Code Playgroud)

你会得到一个类似于这样的情节:
在此处输入图片说明

它正在使用IPython.displayHTML在引擎盖下,它可以拍摄以下格式的图像:

  • string 文件路径
  • PIL.Image 对象
  • numpy.ndarray 表示图像的对象

显示numpy array500 张图像只需几秒钟


小智 5

今天,我在google Colab和jupyter笔记本中遇到了这个问题,我将在MNIST数据集上分享一个简单的解决方案:

for index in range(1,6):
    plt.imshow(train_set.dataset[index], cmap='gray')
Run Code Online (Sandbox Code Playgroud)

输出仅显示最后一张图像:

在此输入图像描述

因为两个 IDE 中的单元格仅显示最后一个图像。因此我添加了plt.show()解决这个问题的方法:

for index in range(1,6):
    plt.imshow(train_set.dataset[index], cmap='gray')
    plt.show()
Run Code Online (Sandbox Code Playgroud)

输出:

在此输入图像描述

最后评论:我喜欢这种方式,因为我可以input() and plot() functions在循环中添加在一起,而不像我尝试过的其他方法。