Come mostrare l'immagine PIL in ipython notebook


112

Questo è il mio codice

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

Vorrei manipolare le immagini su di esso e poi mostrarlo sullo schermo.
Ho problemi con la visualizzazione dell'immagine PIL nel notebook Python.

Ho provato:

print pil_im

E solo

pil_im

Ma entrambi mi danno solo:

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

vuoi mostrare l'immagine per l'anteprima o vuoi mostrare l'immagine in linea?
Anzel

1
in linea, dopo la cella
WebOrCode

Risposte:


164

Puoi usare IPython Module: displayper caricare l'immagine. Puoi leggere di più dal Doc .

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

aggiornato

Come requisito di OP è quello di utilizzare PIL, se si desidera mostrare un'immagine in linea, è possibile utilizzare matplotlib.pyplot.imshowcon numpy.asarraycome anche questo:

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

Se hai bisogno solo di un'anteprima piuttosto che di un inline, puoi semplicemente usare in showquesto modo:

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

5
Non importare nulla da IPython.coreesso non è un'API stabile, esponiamo l'API stabile direttamente in IPython.display. Ho modificato il post da solo.
Matt

stai visualizzando un'immagine da file. Ho chiesto a PIL come nel mio esempiopil_im
WebOrCode

@ Matt, grazie per aver chiarito questo. Anche se non ho mai avuto problemi nell'utilizzo core, sono contento di aver imparato una cosa nuova :)
Anzel

@WebOrCode, ho aggiornato la mia risposta per fornire soluzioni utilizzando PILcome richiesto in OP.
Anzel

1
@greatvovan quell'anteprima è per chiunque utilizzi ipython notebook - ad esempio nessun browser (o jupyter per la versione più recente), non deve necessariamente avere il browser web, se ha senso?
Anzel

48

Usa la visualizzazione IPython per eseguire il rendering delle immagini PIL in un notebook.

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)

3
e se vuoi solo ispezionare rapidamente un'immagine, puoi semplicemente "restituirla", per vedere il suo valore, e verrà visualizzata automaticamente
Ciprian Tomoiagă

1
Questo è molto più semplice di altre risposte: non è necessario convertire in BytesIO o array numpy.
levis501

inoltre deve essere più performante (a meno che l'interprete non capisca che i dati vengono trascritti indietro e quarto)
Baedsch

Sfortunatamente non riesco a farlo funzionare su un taccuino colab: - /
Levon

questo è l'approccio più semplice - grazie per aver estratto solo l'oggetto di visualizzazione da IPython e l'immagine da PIL. stavo usando PIL per creare un'immagine da dati strani e volevo solo visualizzarla nel mio taccuino: funzionava magnificamente e semplicemente.
dave campbell

20

Ho scoperto che funziona

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

Dopo questo posso semplicemente fare:

pil_im

Ma questa deve essere l'ultima riga della cella, senza nessun printdopo


2
È possibile utilizzare display.display per visualizzare il display.Image creato immediatamente, evitando la dipendenza dall'essere l'ultimo nella cella: display.display (ip_img). Puoi vedere questo usato qui: tensorflow.org/tutorials/mandelbrot
David F

@DavidF no, sembra che non puoi. Provando tutte le permutazioni di cui sopra. Come si mostra un'immagine nel taccuino?
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')))

Mostra l'immagine nella sua dimensione originale. Ad esempio, se l'immagine è 32x32, anche l'output sarà molto piccolo. Come assegnare manualmente la dimensione nella funzione HTML?
Pramod Patil

@PramodPatil Easy soln: incolla style=\"width:100px; height:100px;\"tra <imgesrc
Samy Bencherif

7

molto più semplice in jupyter usando il cuscino.

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

4

È possibile aprire un'immagine utilizzando la classe Image dal pacchetto PIL e visualizzarla direttamente con plt.imshow.

# 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

Se stai usando l'estensione pylab, puoi convertire l'immagine in un array numpy e usare imshow di matplotlib.

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

EDIT: come accennato nei commenti, il modulo pylab è deprecato, quindi usa invece la magia matplotlib e importa la funzione esplicitamente:

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

2
pylab è deprecato, non utilizzare.
Matt

2

Sulla base di altre risposte e dei miei tentativi, la migliore esperienza sarebbe prima installare, pillow e scipy, quindi utilizzare il seguente codice di partenza sul tuo notebook jupyter:

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

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

1

Una versione più pulita di Python3 che utilizza numpy, matplotlib e PIL standard. Unire la risposta per l'apertura dall'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

Suggerisco di seguire l'installazione senza immagine mostra img.show () (da PIL import Image)

$ sudo apt-get install imagemagick


0

Basta usare

from IPython.display import Image 
Image('image.png')
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.