可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
If I have multiple images (loaded as NumPy arrays) how can I display the in one IPython Notebook cell?
I know that I can use plt.imshow(ima)
to display one image… but I want to show more than one at a time.
I have tried:
for ima in images:
display(Image(ima))
But I just get a broken image link:
回答1:
Short answer:
call plt.figure()
to create new figures if you want more than one in a cell:
for ima in images:
plt.figure()
plt.imshow(ima)
But to clarify the confusion with Image
:
IPython.display.Image
is for displaying Image files, not array data. If you want to display numpy arrays with Image, you have to convert them to a file-format first (easiest with 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)
A notebook illustrating both approaches.
回答2:
This is easier and works:
from IPython.display import Image
from IPython.display import display
x = Image(filename='1.png')
y = Image(filename='2.png')
display(x, y)
回答3:
Horizontal layout
Short answer
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)
Long answer
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)
回答4:
You can display multiple images in one IPython Notebook cell by using display and HTML functions. You need to create the set of html img tags as a string as follows
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))
See a example of use from http://nbviewer.ipython.org/github/PBrockmann/Dodecahedron
You may need to refresh your browser (shift + load) to see new images if they have been
changed from a previous cell.
回答5:
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)
based on @Michael answer
回答6:
Somehow related to this question (and since I was directed to this answer when I was trying to solve it), I was able to solve a similar problem by simply typing the full file-path when calling Image()
. In my case, I had to choose a random image from different folder paths stored in a list your_folder
and display them.
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)
回答7:
based on @ChaosPredictor answer
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')
then
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)
回答8:
If you don't mind an additional dependency here is a two liner using scikit-image:
from skimage.util import montage
plt.imshow(montage(np.array(images), multichannel=True))
Set multichannel=True
for color images and multichannel=False
for grayscale images.