So zeigen Sie PIL-Bilder in ipython notebook an


108

Das ist mein Code

from PIL import Image
pil_im = Image.open('data/empire.jpg')

Ich möchte einige Bildmanipulationen daran vornehmen und sie dann auf dem Bildschirm anzeigen.
Ich habe Probleme beim Anzeigen des PIL-Bilds im Python-Notizbuch.

Ich habe versucht:

print pil_im

Und nur

pil_im

Aber beide geben mir nur:

<PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=569x800 at 0x10ECA0710>

Möchten Sie das Bild für die Vorschau anzeigen oder möchten Sie ein Inline-Bild anzeigen?
Anzel

1
Inline, nach der Zelle
WebOrCode

Antworten:


162

Sie können IPythons verwenden Module: display, um das Image zu laden. Sie können mehr aus dem Dokument lesen .

from IPython.display import Image 
pil_img = Image(filename='data/empire.jpg')
display(pil_img)

Aktualisiert

Als OP Anforderung zu verwenden ist PIL, wenn Sie Inline - Bild zeigen möchten, können Sie matplotlib.pyplot.imshowmit , numpy.asarraywie dieser zu:

from matplotlib.pyplot import imshow
import numpy as np
from PIL import Image

%matplotlib inline
pil_im = Image.open('data/empire.jpg', 'r')
imshow(np.asarray(pil_im))

Wenn Sie nur eine Vorschau anstelle einer Inline benötigen, können Sie Folgendes verwenden show:

pil_im = Image.open('data/empire.jpg', 'r')
pil_im.show()

5
Importieren Sie nichts IPython.coredavon ist keine stabile API, wir legen die stabile API direkt in IPython.display. Ich habe den Beitrag selbst bearbeitet.
Matt

Sie zeigen ein Bild aus einer Datei an. Ich fragte von PIL wie in meinem Beispielpil_im
WebOrCode

@ Matt, danke für die Klarstellung. Obwohl ich nie auf Probleme mit der Verwendung core
gestoßen

@WebOrCode, ich habe meine Antwort aktualisiert, um Lösungen bereitzustellen, die PILwie in OP angefordert verwendet werden.
Anzel

1
@greatvovan diese Vorschau ist für jeden, der ein ipython-Notebook verwendet - zum Beispiel kein Browser (oder jupyter für eine neuere Version) -, muss der Webbrowser nicht unbedingt vorhanden sein, wenn dies sinnvoll ist?
Anzel

48

Verwenden Sie die IPython-Anzeige, um PIL-Bilder in einem Notizbuch zu rendern.

from PIL import Image               # to load images
from IPython.display import display # to display images

pil_im = Image.open('path/to/image.jpg')
display(pil_im)

2
und wenn Sie ein Bild nur schnell untersuchen möchten, können Sie es einfach "zurückgeben", um seinen Wert zu sehen, und es wird automatisch angezeigt
Ciprian Tomoiagă

1
Dies ist so viel einfacher als andere Antworten - es ist nicht erforderlich, in BytesIO oder Numpy-Array zu konvertieren.
Levis501

es muss auch performanter sein (es sei denn, der Dolmetscher versteht, dass die Daten zurück und viertens transkribiert werden)
Baedsch

Leider kann ich das nicht in einem Colab-Notizbuch zum Laufen bringen: - /
Levon

Dies ist der einfachste Ansatz - danke, dass Sie nur das Anzeigeobjekt aus IPython und das Bild aus PIL herausgebrochen haben. Ich habe PIL verwendet, um ein Bild aus seltsamen Daten zu erstellen, und wollte es nur in meinem Notizbuch anzeigen - das hat wunderbar und einfach funktioniert.
Dave Campbell

20

Ich habe festgestellt, dass dies funktioniert

# source: http://nbviewer.ipython.org/gist/deeplook/5162445
from io import BytesIO

from IPython import display
from PIL import Image


def display_pil_image(im):
   """Displayhook function for PIL Images, rendered as PNG."""

   b = BytesIO()
   im.save(b, format='png')
   data = b.getvalue()

   ip_img = display.Image(data=data, format='png', embed=True)
   return ip_img._repr_png_()


# register display func with PNG formatter:
png_formatter = get_ipython().display_formatter.formatters['image/png']
dpi = png_formatter.for_type(Image.Image, display_pil_image)

Danach kann ich einfach machen:

pil_im

Dies muss jedoch die letzte Zeile in der Zelle sein, ohne printdanach


2
Sie können display.display verwenden, um die Anzeige anzuzeigen. Das von Ihnen erstellte Bild wird sofort erstellt, um die Abhängigkeit vom letzten Platz in der Zelle zu vermeiden: display.display (ip_img). Sie können dies hier verwendet sehen: tensorflow.org/tutorials/mandelbrot
David F

@ DavidF nein, es scheint, als ob Sie nicht können. Versuchen Sie alle Permutationen von oben. Wie zeigt man ein Bild im Notizbuch?
Christopher

15

case python3

from PIL import Image
from IPython.display import HTML
from io import BytesIO
from base64 import b64encode

pil_im = Image.open('data/empire.jpg')
b = BytesIO()  
pil_im.save(b, format='png')
HTML("<img src='data:image/png;base64,{0}'/>".format(b64encode(b.getvalue()).decode('utf-8')))

Es zeigt das Bild in seiner Originalgröße. Wenn das Bild beispielsweise 32 x 32 ist, ist die Ausgabe ebenfalls sehr klein. Wie kann man die Größe manuell in der HTML-Funktion angeben?
Pramod Patil

@PramodPatil Einfache Lösung: Einfügen style=\"width:100px; height:100px;\"zwischen <imgundsrc
Samy Bencherif

7

viel einfacher in jupyter mit kissen.

from PIL import Image
image0=Image.open('image.png')
image0

4

Sie können ein Bild mit der Image-Klasse aus dem Paket PIL öffnen und direkt mit plt.imshow anzeigen.

# First import libraries.
from PIL import Image
import matplotlib.pyplot as plt

# The folliwing line is useful in Jupyter notebook
%matplotlib inline

# Open your file image using the path
img = Image.open(<path_to_image>)

# Since plt knows how to handle instance of the Image class, just input your loaded image to imshow method
plt.imshow(img)

2

Wenn Sie die Pylab-Erweiterung verwenden, können Sie das Bild in ein Numpy-Array konvertieren und die Imshow von matplotlib verwenden.

%pylab # only if not started with the --pylab option
imshow(array(pil_im))

BEARBEITEN: Wie in den Kommentaren erwähnt, ist das Pylab-Modul veraltet. Verwenden Sie stattdessen die Matplotlib-Magie und importieren Sie die Funktion explizit:

%matplotlib
from matplotlib.pyplot import imshow 
imshow(array(pil_im))

2
Pylab ist veraltet, nicht verwenden.
Matt

2

Basierend auf anderen Antworten und meine Versuche, würde beste Erfahrung erste Installation sein, Kissen und scipy, dann den folgenden Startcode auf Ihrem jupyter Notebook:

%matplotlib inline
from matplotlib.pyplot import imshow
from scipy.misc import imread

imshow(imread('image.jpg', 1))

1

Eine sauberere Python3-Version, die Standard-Numpy, Matplotlib und PIL verwendet. Zusammenführen der Antwort zum Öffnen über die URL.

import matplotlib.pyplot as plt
from PIL import Image
import numpy as np

pil_im = Image.open('image.jpg')
## Uncomment to open from URL
#import requests
#r = requests.get('https://www.vegvesen.no/public/webkamera/kamera?id=131206')
#pil_im = Image.open(BytesIO(r.content))
im_array = np.asarray(pil_im)
plt.imshow(im_array)
plt.show()

0

Ich schlage vor, nach der Installation kein Bild zu zeigen img.show () (aus PIL-Import Bild)

$ sudo apt-get install imagemagick


0

Benutz einfach

from IPython.display import Image 
Image('image.png')
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.