web-dev-qa-db-fra.com

Comment afficher PIL Image dans un cahier ipython

C'est mon code

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

Je voudrais faire quelques manipulations d’images dessus, puis les montrer à l’écran.
J'ai du mal à afficher PIL Image 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>
55
WebOrCode

Vous pouvez utiliser le Module: display d'IPython pour charger l'image. Vous pouvez en lire plus sur the Doc

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

mis à jour

Comme OP a pour exigence d'utiliser PIL, si vous souhaitez afficher une image en ligne, vous pouvez utiliser matplotlib.pyplot.imshow avec numpy.asarray comme 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 avez seulement besoin d'un aperçu plutôt que d'une ligne, vous pouvez simplement utiliser show comme ceci:

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

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 juste faire:

pil_im

Mais ceci doit être la dernière ligne de la cellule, sans print après

13
WebOrCode

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')))
11
gaziya

Utilisez l'affichage IPython pour afficher les images PIL dans un cahier.

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

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 plutôt la magie matplotlib et importez la fonction explicitement:

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

Vous pouvez ouvrir une image à l'aide de la classe Image du paquet PIL et l'afficher directement avec plt.imshow.

from PIL import Image
import matplotlib.pyplot as plt
%matplotlib inline

img = Image.open(<path_to_image>)
plt.imshow(img)
1
M . Franklin

Sur la base d’autres réponses et de mes essais, la meilleure expérience serait d’abord d’installer, pillow et scipy, puis d’utiliser le code de départ suivant sur votre notebook jupyter:

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

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

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