Cómo mostrar la imagen PIL en un cuaderno ipython

110

Este es mi codigo

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

Me gustaría manipular la imagen y luego mostrarla en la pantalla.
Tengo problemas para mostrar la imagen PIL en el cuaderno de Python.

Yo he tratado:

print pil_im

Y solo

pil_im

Pero ambos solo dame:

<PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=569x800 at 0x10ECA0710>
WebOrCode
fuente
¿Desea mostrar la imagen para obtener una vista previa o desea mostrar una imagen en línea?
Anzel
1
en línea, después de la celda
WebOrCode

Respuestas:

163

Puede usar IPython Module: displaypara cargar la imagen. Puede leer más en el Doc .

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

actualizado

Como requisito de OP es utilizar PIL, si desea mostrar la imagen en línea, puede utilizar matplotlib.pyplot.imshowcon numpy.asarrayesta manera también:

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 solo necesita una vista previa en lugar de una en línea, puede usar showasí:

pil_im = Image.open('data/empire.jpg', 'r')
pil_im.show()
Anzel
fuente
5
No importe nada de la IPython.coreAPI no es estable, exponemos la API estable directamente en IPython.display. Yo mismo edité la publicación.
Matt
está mostrando la imagen del archivo. Le pregunté a PIL como en mi ejemplopil_im
WebOrCode
@ Matt, gracias por aclarar esto. Aunque nunca he tenido problemas con el uso core, me alegro de haber aprendido algo nuevo :)
Anzel
@WebOrCode, he actualizado mi respuesta para proporcionar soluciones utilizando PILcomo se solicita en OP.
Anzel
1
@greatvovan, esa vista previa es para quien use un cuaderno ipython, sin navegador, por ejemplo (o jupyter para una versión más reciente), no necesariamente tiene que tener el navegador web, si eso tiene sentido.
Anzel
48

Utilice la pantalla IPython para renderizar imágenes PIL en un cuaderno.

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
fuente
3
y si solo desea inspeccionar rápidamente una imagen, puede simplemente "devolverla", para ver su valor, y se mostrará automáticamente
Ciprian Tomoiagă
1
Esto es mucho más simple que otras respuestas: no es necesario convertir a BytesIO o matriz numpy.
levis501
también debe ser más eficaz (a menos que el intérprete entienda que los datos se están transcribiendo de nuevo y en cuarto lugar)
Baedsch
Desafortunadamente, no puedo hacer que esto funcione en un cuaderno Colab: - /
Levon
este es el enfoque más simple: gracias por dividir solo el objeto de visualización de IPython y la imagen de PIL. Estaba usando PIL para crear una imagen a partir de datos extraños y solo quería mostrarla en mi cuaderno; esto funcionó de manera hermosa y sencilla.
Dave Campbell
20

Encontré que esto está funcionando

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

Después de esto, puedo hacer:

pil_im

Pero esta debe ser la última línea en la celda, sin ningún printdespués

WebOrCode
fuente
2
Puede usar display.display para mostrar la imagen de display.Image que creó inmediatamente, evitando la dependencia de ser el último en la celda: display.display (ip_img). Puede ver esto usado aquí: tensorflow.org/tutorials/mandelbrot
David F
@DavidF no, parece que no puedes. Intentando todas las permutaciones de arriba. ¿Cómo se muestra una imagen en el cuaderno?
Christopher
15

caso 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
fuente
Muestra la imagen en su tamaño original. Por ejemplo, si la imagen es de 32x32, la salida también será muy pequeña. ¿Cómo dar el tamaño manualmente en la función HTML?
Pramod Patil
@PramodPatil Solución fácil: pegar style=\"width:100px; height:100px;\"entre <imgysrc
Samy Bencherif
7

mucho más simple en jupyter usando almohada.

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

Puede abrir una imagen usando la clase Image del paquete PIL y mostrarla directamente 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)
M. Franklin
fuente
2

Si está utilizando la extensión pylab, puede convertir la imagen en una matriz numpy y utilizar imshow de matplotlib.

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

EDITAR: Como se menciona en los comentarios, el módulo pylab está en desuso, así que use la magia matplotlib en su lugar e importe la función explícitamente:

%matplotlib
from matplotlib.pyplot import imshow 
imshow(array(pil_im))
Robar
fuente
2
pylab está en desuso, no lo use.
Matt
2

Según otras respuestas y mis intentos, la mejor experiencia sería instalar primero, pillow y scipy, luego usar el siguiente código de inicio en su cuaderno jupyter:

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

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

Una versión más limpia de Python3 que usa numpy, matplotlib y PIL estándar. Fusionando la respuesta para abrir desde 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
fuente
0

Sugiero seguir la instalación sin mostrar la imagen img.show () (de la imagen de importación PIL)

$ sudo apt-get install imagemagick

Dr.-Ing. Hiesik KIm
fuente
0

Solo usa

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