Como mostrar a imagem PIL no notebook ipython


111

Este é o meu código

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

Eu gostaria de fazer alguma manipulação de imagem nele e depois mostrá-lo na tela.
Estou tendo problemas para mostrar a imagem PIL no bloco de notas python.

Eu tentei:

print pil_im

E somente

pil_im

Mas ambos me dão:

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

deseja mostrar a imagem para visualização ou deseja mostrar a imagem embutida?
— Anzel

1
inline, após a célula
— WebOrCode

Respostas:


163

Você pode usar o IPython Module: displaypara carregar a imagem. Você pode ler mais no Doc .

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

Atualizada

Como o requisito do OP é usar PIL, se você quiser mostrar uma imagem embutida, você também pode usar matplotlib.pyplot.imshowcom numpy.asarray:

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 você precisar apenas de uma visualização em vez de inline, você pode usar showdesta forma:

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

5
Não importe nada da IPython.coreAPI não estável, expomos a API estável diretamente no IPython.display. Eu mesmo editei a postagem.
— Matt

você está exibindo imagem de arquivo. Eu perguntei do PIL como no meu exemplopil_im
— WebOrCode

@Matt, obrigado por esclarecer isso. Embora eu nunca tenha core
— tido

@WebOrCode, atualizei minha resposta para fornecer soluções usando PILconforme solicitado no OP.
— Anzel

1
@greatvovan essa visualização é para quem usa notebook ipython - sem navegador, por exemplo (ou jupyter para a versão mais recente), não necessariamente precisa ter o navegador da web, se isso faz sentido?
— Anzel

48

Use a exibição IPython para renderizar imagens PIL em um 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 você apenas deseja inspecionar rapidamente uma imagem, você pode apenas "devolvê-la", para ver seu valor, e ela será exibida automaticamente
— Ciprian Tomoiagă

1
Isso é muito mais simples do que outras respostas - não há necessidade de converter para BytesIO ou array numpy.
— levis501

também deve ter mais desempenho (a menos que o intérprete entenda que os dados estão sendo transcritos de volta e quarto)
— Baedsch

Infelizmente não consigo fazer isso funcionar em um bloco de notas colab: - /
— Levon

esta é a abordagem mais simples - obrigado por separar apenas o objeto de exibição do IPython e a imagem do PIL. Eu estava usando o PIL para criar uma imagem a partir de dados estranhos e só queria exibi-la no meu notebook - funcionou de maneira linda e simples.
— Dave Campbell

20

Eu descobri que isso 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)

Depois disso, posso apenas fazer:

pil_im

Mas esta deve ser a última linha da célula, sem printdepois


2
Você pode usar display.display para exibir o display.Image que você criou imediatamente, evitando a dependência de ser o último na célula: display.display (ip_img). Você pode ver isso usado aqui: tensorflow.org/tutorials/mandelbrot
— David F

@DavidF não, parece que você não pode. Tentando todas as permutações acima. Como mostrar uma imagem no caderno?
— 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 a imagem em seu tamanho original. por exemplo, se a imagem for 32x32, a saída também será muito pequena. Como dar o tamanho manualmente na função HTML?
— Pramod Patil

@PramodPatil Easy soln: paste style=\"width:100px; height:100px;\"in between <imgesrc
— Samy Bencherif

7

muito mais simples em jupyter usando travesseiro.

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

4

Você pode abrir uma imagem usando a classe Image do pacote PIL e exibi-la diretamente com 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 você estiver usando a extensão pylab, pode converter a imagem em um array numpy e usar o imshow do matplotlib.

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

EDIT: Conforme mencionado nos comentários, o módulo pylab está obsoleto, então use a mágica matplotlib e importe a função explicitamente:

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

2
pylab está obsoleto, não use.
— Matt

2

Com base em outras respostas e minhas tentativas, a melhor experiência seria primeiro instalar, pillow e scipy e, em seguida, usar o seguinte código inicial em seu notebook jupyter:

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

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

1

Uma versão mais limpa do Python3 que usa numpy padrão, matplotlib e PIL. Mesclando a resposta para abrir a partir do 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

Eu sugiro a instalação seguinte por no image show img.show () (da imagem de importação PIL)

$ sudo apt-get install imagemagick


0

Apenas use

from IPython.display import Image 
Image('image.png')
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.