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.