81

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

我知道我可以用它plt.imshow(ima)来显示一张图像……但我想一次显示不止一张。

我努力了:

 for ima in images:
     display(Image(ima))

但我只是得到一个损坏的图像链接:

在此处输入图像描述

4

12 回答 12

116

简短的回答:

plt.figure()如果您想在一个单元格中创建多个图形,请调用创建新图形:

for ima in images:
    plt.figure()
    plt.imshow(ima)

但要澄清混淆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)

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

于 2013-10-20T22:22:18.697 回答
94

这更容易并且有效:

from IPython.display import Image
from IPython.display import display
x = Image(filename='1.png') 
y = Image(filename='2.png') 
display(x, y)
于 2015-08-06T17:32:37.620 回答
85

横向布局

横向布局演示

简短的回答

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)

长答案

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)
于 2017-07-24T12:37:27.280 回答
16

您可以使用 display 和 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))

请参阅http://nbviewer.ipython.org/github/PBrockmann/Dodecahedron中的使用示例

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

于 2015-01-06T08:50:39.933 回答
13

您可以使用IPyPlot快速轻松地完成它:

import ipyplot

ipyplot.plot_images(images_array, max_images=20, img_width=150)

你会得到一个类似这样的情节:
在此处输入图像描述

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

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

numpy array显示500 张图像只需几秒钟

于 2020-05-04T13:00:37.000 回答
3

如果您不介意额外的依赖,这里有一个使用scikit-image的两个衬垫:

from skimage.util import montage
plt.imshow(montage(np.array(images), multichannel=True))

multichannel=True为彩色图像和multichannel=False灰度图像设置。

于 2018-09-14T14:43:58.737 回答
2

不知何故与这个问题有关(因为当我试图解决这个问题时,我被引导到这个答案),我能够通过在调用Image(). 就我而言,我必须从存储在列表中的不同文件夹路径中选择一个随机图像your_folder并显示它们。

import random, os 
for i in range(len(your_folder)):
   ra1 = "../"+your_folder[i]+"/"+random.choice(os.listdir(your_folder[i]))
   image = Image(ra1)
   display(image)
于 2017-01-22T15:11:07.063 回答
2

在此处输入图像描述

from matplotlib.pyplot import figure, imshow, axis
from matplotlib.image import imread

mypath='.'
hSize = 5
wSize = 5
col = 4

def showImagesMatrix(list_of_files, col=10):
    fig = figure( figsize=(wSize, hSize))
    number_of_files = len(list_of_files)
    row = number_of_files/col
    if (number_of_files%col != 0):
        row += 1
    for i in range(number_of_files):
        a=fig.add_subplot(row,col,i+1)
        image = imread(mypath+'/'+list_of_files[i])
        imshow(image,cmap='Greys_r')
        axis('off')

showImagesMatrix(listOfImages,col)

基于@Michael的回答

于 2017-11-13T14:59:00.777 回答
1

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

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

输出只显示最后一张图片:

在此处输入图像描述

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

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

输出:

在此处输入图像描述

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

于 2021-07-06T10:46:58.223 回答
1

自从提出这个问题以来已经有几年了,但遗憾的是这个功能还没有进入 jupyter notebooks 的核心。

我希望有一个imshow足够简单的功能

  • 接受单个或多个图像作为输入
  • 即使有 100 张图片,也可以为我整齐地布置它们

看起来像:

imshow(img)
imshow(img1, img2)
imshow(*imgs[:100])

一些不错的可选参数:

  • 标题
  • 尺寸
  • 行和/或列
  • 地图

不幸的是,该功能不是笔记本的一部分。希望将来会在那里。目前,我在imshowtoolsimshow中实现了该功能。它在引擎盖下使用 matplotlib。

假设您有 MNIST 并imshow使用

from imshowtools import imshow
import tensorflow as tf

(x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data()

然后你可以简单地使用

imshow(x_train[0])
imshow(x_train[0], x_train[1], x_train[2])
imshow(*x_train[:20], cmap='binary')
imshow(*x_train[:100], cmap='binary', size=(10, 10))

mnist_img

有时,您希望它们在一行或一列中:

imshow(*x_train[:15], cmap='Purples', rows=1)
imshow(*x_train[:24], cmap='Greens', columns=4)

mnist_rows_cols

于 2021-08-17T00:46:19.527 回答
0

该线程中的答案对我有帮助:使用 Python 水平组合多个图像

使用 matplotlib 的问题是显示图像的定义非常糟糕。我根据自己的需要调整了其中一个答案:

以下代码在 jupyter notebook 中显示水平连接的图像。如果您愿意,请注意带有代码的注释行以保存图像。

import numpy as np
import PIL
from IPython.display import display

list_im = ['Test1.jpg', 'Test2.jpg', 'Test3.jpg']
imgs    = [ PIL.Image.open(i) for i in list_im ]
# pick the image which is the smallest, and resize the others to match it (can be arbitrary image shape here)
min_shape = sorted( [(np.sum(i.size), i.size ) for i in imgs])[0][1]
imgs_comb = np.hstack( (np.asarray( i.resize(min_shape) ) for i in imgs ) )

# save that beautiful picture
imgs_comb = PIL.Image.fromarray( imgs_comb)
#imgs_comb.save( 'combo.jpg' )    

display(imgs_comb)
于 2019-04-22T09:02:18.137 回答
0

基于@ChaosPredictor 答案

from matplotlib.pyplot import figure, imshow, axis
from matplotlib.image import imread

def showImagesMatrix(list_of_files, col=10, wSize=5, hSize=5, mypath='.'):
    fig = figure(figsize=(wSize, hSize))
    number_of_files = len(list_of_files)
    row = number_of_files / col
    if (number_of_files % col != 0):
        row += 1
    for i in range(number_of_files):
        a=fig.add_subplot(row, col, i + 1)
        image = imread(mypath + '/' + list_of_files[i])
        imshow(image, cmap='Greys_r')
        axis('off')

然后

from pathlib import Path
p = Path('.')
num_images = 30
list_of_image_paths = [str(x) for x in list(p.glob('../input/train/images/*'))[:num_images]]

showImagesMatrix(list_of_image_paths)

# or with named args
showImagesMatrix(list_of_image_paths, wSize=20, hSize=10, col=5)

matplotlib 图像网格

于 2018-09-13T06:05:40.420 回答