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.