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>
WebOrCode
quelle
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()
Anzel
quelle
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)
sathyz
quelle
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

WebOrCode
quelle
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')))
Gaziya
quelle
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
Prabhat
quelle
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)
M. Franklin
quelle
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))
rauben
quelle
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))
Ebrahim Byagowi
quelle
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()
Punnerud
quelle
0

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

$ sudo apt-get install imagemagick

Dr.-Ing. Hiesik KIm
quelle
0

Benutz einfach

from IPython.display import Image 
Image('image.png')
Quanlong
quelle