wake-up-neo.com

Mehrere Bilder in einer IPython Notebook-Zelle anzeigen?

Wenn ich mehrere Bilder habe (als NumPy-Arrays geladen), wie kann ich die in einer IPython Notebook-Zelle anzeigen?

Ich weiß, dass ich plt.imshow(ima) verwenden kann, um one image anzuzeigen ..., aber ich möchte mehr als eine anzeigen.

Ich habe versucht:

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

Ich bekomme aber nur einen defekten Image-Link:

enter image description here

53
David Wolever

Kurze Antwort:

rufen Sie plt.figure() auf, um neue Figuren zu erstellen, wenn Sie mehr als eine in einer Zelle haben möchten:

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

Aber um die Verwirrung mit Image zu klären:

IPython.display.Image dient zur Anzeige von Image files, nicht von Array-Daten. Wenn Sie numpy-Arrays mit Image anzeigen möchten, müssen Sie diese zuerst in ein Dateiformat konvertieren (am einfachsten mit 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)

Ein Notebook illustriert beide Ansätze.

81
minrk

Das ist einfacher und funktioniert:

from IPython.display import Image
from IPython.display import display
x = Image(filename='1.png') 
y = Image(filename='2.png') 
display(x, y)
57
dval

Horizontales Layout

 Horizontal layout demonstration

Kurze Antwort

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)

Lange Antwort

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)
45
Michael

Sie können mehrere Bilder in einer IPython Notebook-Zelle anzeigen, indem Sie Anzeige- und HTML-Funktionen verwenden. Sie müssen den Satz von html img-Tags wie folgt als Zeichenfolge erstellen

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))

Ein Anwendungsbeispiel finden Sie unter http://nbviewer.ipython.org/github/PBrockmann/Dodecahedron

Möglicherweise müssen Sie Ihren Browser aktualisieren (Umschalttaste + Laden), um neue Bilder anzuzeigen, wenn diese aus einer vorherigen Zelle geändert wurden.

16
PBrockmann

 enter image description here

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)

basierend auf @Michael Antwort

2
ChaosPredictor

Irgendwie bezogen auf diese Frage (und da ich zu dieser Antwort aufgefordert wurde, als ich versuchte, sie zu lösen), konnte ich ein ähnliches Problem lösen, indem ich beim Aufruf von Image() einfach den vollständigen Dateipfad eingab. In meinem Fall musste ich ein zufälliges Bild aus verschiedenen Ordnerpfaden auswählen, die in einer Liste your_folder gespeichert sind, und diese anzeigen. 

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)
1
Chriss Paul

basierend auf @ChaosPredictor Antwort

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')

dann

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 image grid

0
Harry Moreno

Die Antworten in diesem Thread haben mir geholfen: Mehrere Bilder horizontal mit Python kombinieren

Das Problem bei der Verwendung von matplotlib war, dass die Definition der angezeigten Bilder wirklich schlecht war. Ich habe dort eine der Antworten an meine Bedürfnisse angepasst:

Der folgende Code zeigt die horizontal verketteten Bilder in einem Jupyter-Notizbuch an. Beachten Sie die kommentierte Zeile mit dem Code, um das Bild zu speichern, wenn Sie das möchten.

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)
0
Victor Zuanazzi

Wenn Sie nichts dagegen haben, ist eine zusätzliche Abhängigkeit ein zweizeiliger Einsatz von scikit-image :

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

Stellen Sie multichannel=True für Farbbilder und multichannel=False für Graustufenbilder ein.

0
Palmstrom