ipython - usar - type markdown and latex α2α2
¿Desea mostrar varias imágenes en una celda de IPython Notebook? (8)
Si tengo varias imágenes (cargadas como matrices NumPy), ¿cómo puedo mostrarlas en una celda de IPython Notebook?
Sé que puedo usar plt.imshow(ima)
para mostrar una imagen ... pero quiero mostrar más de una a la vez.
Yo he tratado:
for ima in images:
display(Image(ima))
Pero acabo de obtener un enlace de imagen roto:
Diseño horizontal
Respuesta corta
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)
Respuesta larga
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)
Basado en la respuesta de @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'')
entonces
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)
De alguna manera relacionada con esta pregunta (y como me dirigieron a esta respuesta cuando intentaba resolverla), pude resolver un problema similar simplemente escribiendo la ruta completa del archivo cuando llamé a Image()
. En mi caso, tuve que elegir una imagen aleatoria de diferentes rutas de carpetas almacenadas en una lista de su your_folder
y mostrarlas.
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)
Esto es más fácil y funciona:
from IPython.display import Image
from IPython.display import display
x = Image(filename=''1.png'')
y = Image(filename=''2.png'')
display(x, y)
Puede mostrar múltiples imágenes en una celda de IPython Notebook usando las funciones de visualización y HTML. Debe crear el conjunto de etiquetas img html como una cadena de la siguiente manera
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))
Vea un ejemplo de uso en http://nbviewer.ipython.org/github/PBrockmann/Dodecahedron
Es posible que deba actualizar su navegador (Mayús + carga) para ver nuevas imágenes si se han cambiado desde una celda anterior.
Respuesta corta:
llame a plt.figure()
para crear nuevas figuras si desea más de una en una celda:
for ima in images:
plt.figure()
plt.imshow(ima)
Pero para aclarar la confusión con la Image
:
IPython.display.Image
es para mostrar archivos de imagen, no datos de matriz. Si desea mostrar matrices numpy con Image, primero debe convertirlas a un formato de archivo (más fácil con 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)
Un notebook ilustra ambos enfoques.
Si no te importa una dependencia adicional, aquí hay dos liners que usan scikit-image :
from skimage.util import montage
plt.imshow(montage(np.array(images), multichannel=True))
Establezca multichannel=True
para imágenes en color y multichannel=False
para imágenes en escala de grises.
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)
basado en la respuesta de @Michael