Comment afficher l'image PIL dans un notebook ipython


112

C'est mon code

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

J'aimerais faire une manipulation d'image dessus, puis l'afficher à l'écran.
J'ai un problème avec l'affichage de l'image PIL dans un cahier python.

J'ai essayé:

print pil_im

Et juste

pil_im

Mais les deux me donnent juste:

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

voulez-vous afficher l'image pour l'aperçu, ou voulez-vous afficher l'image en ligne?
Anzel

1
en ligne, après la cellule
WebOrCode

Réponses:


164

Vous pouvez utiliser IPython Module: displaypour charger l'image. Vous pouvez en savoir plus sur le Doc .

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

actualisé

Comme l'exigence d'OP est d'utiliser PIL, si vous souhaitez afficher une image en ligne, vous pouvez également l'utiliser matplotlib.pyplot.imshowavec numpy.asarraycomme ceci:

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

Si vous n'avez besoin que d'un aperçu plutôt que d'un en ligne, vous pouvez simplement utiliser showcomme ceci:

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

5
N'importez rien depuis IPython.corece n'est pas une api stable, nous exposons directement l'api stable dans IPython.display. J'ai édité le message moi-même.
mat

vous affichez une image à partir d'un fichier. J'ai demandé à PIL comme dans mon exemplepil_im
WebOrCode

@Matt, merci d'avoir clarifié cela. Bien que je n'ai jamais rencontré de problème d'utilisation core, je suis content d'avoir appris une nouvelle chose :)
Anzel

@WebOrCode, j'ai mis à jour ma réponse pour fournir des solutions en utilisant PILcomme demandé dans OP.
Anzel

1
@greatvovan que l'aperçu est à quiconque utilise ipython notebook - sans navigateur par exemple (ou jupyter pour la version plus récente), pas nécessairement besoin d'avoir le navigateur Web, si cela a du sens?
Anzel

48

Utilisez l'affichage IPython pour rendre les images PIL dans un bloc-notes.

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
et si vous voulez juste inspecter rapidement une image, vous pouvez simplement la «renvoyer», pour voir sa valeur, et elle sera affichée automatiquement
Ciprian Tomoiagă

1
C'est tellement plus simple que les autres réponses - il n'est pas nécessaire de convertir en BytesIO ou en tableau numpy.
levis501

il doit aussi être plus performant (à moins que l'interprète ne comprenne que les données sont en cours de transcription arrière et quatrième)
Baedsch

Malheureusement, je ne peux pas faire fonctionner cela dans un cahier Colab: - /
Levon

c'est l'approche la plus simple - merci de ne sortir que l'objet d'affichage d'IPython et l'image de PIL. J'utilisais PIL pour créer une image à partir de données étranges, et je voulais juste l'afficher dans mon cahier - cela fonctionnait magnifiquement et simplement.
dave campbell le

20

J'ai trouvé que ça marche

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

Après cela, je peux simplement faire:

pil_im

Mais ce doit être la dernière ligne de la cellule, sans printaprès


2
Vous pouvez utiliser display.display pour afficher le display.Image que vous avez créé immédiatement, en évitant la dépendance d'être le dernier dans la cellule: display.display (ip_img). Vous pouvez le voir utilisé ici: tensorflow.org/tutorials/mandelbrot
David F

@DavidF non, il semble que vous ne puissiez pas. Essayer toutes les permutations ci-dessus. Comment afficher une image dans le cahier?
Christopher le

15

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

Il montre l'image dans sa taille d'origine. Par exemple, si l'image est 32x32, la sortie sera également très petite. Comment donner la taille manuellement dans la fonction HTML?
Pramod Patil

@PramodPatil Easy soln: coller style=\"width:100px; height:100px;\"entre <imgetsrc
Samy Bencherif

7

beaucoup plus simple en jupyter en utilisant un oreiller.

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

4

Vous pouvez ouvrir une image en utilisant la classe Image du package PIL et l'afficher directement avec 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

Si vous utilisez l'extension pylab, vous pouvez convertir l'image en un tableau numpy et utiliser imshow de matplotlib.

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

EDIT: Comme mentionné dans les commentaires, le module pylab est obsolète, utilisez donc la magie matplotlib à la place et importez la fonction explicitement:

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

2
pylab est obsolète, ne pas utiliser.
mat

2

Sur la base d'autres réponses et de mes essais, la meilleure expérience serait d'abord l'installation, l' oreiller et le scipy, puis l'utilisation du code de démarrage suivant sur votre notebook jupyter:

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

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

1

Une version plus propre de Python3 qui utilise numpy, matplotlib et PIL standard. Fusion de la réponse pour l'ouverture à partir de l'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

Je suggère de suivre l'installation par aucune image show img.show () (à partir de l'image d'importation PIL)

$ sudo apt-get install imagemagick


0

Juste utiliser

from IPython.display import Image 
Image('image.png')
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.