For David Wolever, who asked on SO.
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
from IPython.display import display, Image
from glob import glob
Load a collection of image files with PIL into RGB numpy arrays,
which can be displayed with plt.imshow
import PIL
images = [ PIL.Image.open(f) for f in glob('img/*') ]
def img2array(im):
if im.mode != 'RGB':
im = im.convert(mode='RGB')
return np.fromstring(im.tostring(), dtype='uint8').reshape((im.size[1], im.size[0], 3))
np_images = [ img2array(im) for im in images ]
For multiple figures in one cell, just call plt.figure()
for each new figure:
for img in np_images:
plt.figure()
plt.imshow(img)
Image
is for display image file data, not numpy arrays.
You can display images with filenames:
for im in images:
display(Image(filename=im.filename, retina=True))
But if what you are starting with is numpy array data,
we need to convert it into an image format before displaying it with Image
:
from io import BytesIO
def display_img_array(ima):
im = PIL.Image.fromarray(ima)
bio = BytesIO()
im.save(bio, format='png')
display(Image(bio.getvalue(), format='png', retina=True))
for ima in np_images:
display_img_array(ima)