Como posso exibir uma imagem de um arquivo no Jupyter Notebook?

190

Gostaria de usar um notebook IPython como uma maneira de analisar interativamente alguns gráficos de genoma que estou criando com o GenomeDiagrammódulo Biopython . Embora exista documentação extensa sobre como usarmatplotlib para obter gráficos alinhados no notebook IPython, o GenomeDiagram usa o kit de ferramentas ReportLab, que não creio ser suportado para gráficos embutidos no IPython.

Eu estava pensando, no entanto, que uma maneira de contornar isso seria escrever o diagrama de plotagem / genoma em um arquivo e abrir a imagem em linha que teria o mesmo resultado com algo como isto:

gd_diagram.write("test.png", "PNG")
display(file="test.png")

No entanto, não consigo descobrir como fazer isso - ou sei se é possível. Alguém sabe se as imagens podem ser abertas / exibidas no IPython?

zach
fonte

Respostas:

332

Como cortesia desta postagem , você pode fazer o seguinte:

from IPython.display import Image
Image(filename='test.png') 

( documentos oficiais )

zach
fonte
É melhor usar a API pública sem acessar os internos: from IPython.display import Imagedeve funcionar desde 0,13.
tomyun
64
isso não exibe imagem se estiver dentro de um loop
muon
6
A maioria das pessoas gostaria da resposta do DrMcCleod.
AturSams 23/01
3
Isso só funciona para mim se eu passar Image (filename = 'test.png') para exibir, conforme recomendado em um tópico abaixo: from IPython.core.display import Image, display<b /> display(Image(filename='test.png'))
John Strong
1
No caso de você deseja que a imagem para mostrar também no modo de apresentação diapositivos (que você executa com jupyter nbconvert mynotebook.ipynb --to slides --post serve), então o caminho da imagem deve começar com /de modo que é um caminho absoluto da raiz web, ou seja![alt text](/test.jpg "Some Title")
ccpizza
213

Se você estiver tentando exibir uma imagem dessa maneira dentro de um loop, precisará envolver o construtor Image em um método de exibição.

from IPython.display import Image, display

listOfImageNames = ['/path/to/images/1.png',
                    '/path/to/images/2.png']

for imageName in listOfImageNames:
    display(Image(filename=imageName))
DrMcCleod
fonte
1
Por quê? (Não me diga que, caso contrário, não funcionará. Explique por que essa chamada para 'display' é necessária em um loop, mas não se você apenas exibir uma imagem).
Kris
10
Como os Notebooks IPython mostram apenas o último valor de retorno em uma célula, sempre que houver duas saídas da mesma célula, você precisará usar o método 'display'. Veja esta pergunta para mais.
DrMcCleod 1/17
1
Você é meu herói - estou procurando isso há dois dias.
ZaxR 15/10
1
Isso é ótimo. Como eu faria a próxima imagem substituir a existente, como um efeito animado, à medida que a imagem muda com o tempo?
blissweb
2
Fiquei me perguntando, como poderíamos ladrilhar as imagens? Por exemplo, para mostrar um grupo de imagens 4x4.
Gmagno 23/05/19
31

Observe que, até agora, as soluções postadas funcionam apenas para png e jpg!

Se você deseja ainda mais fácil sem importar mais bibliotecas ou deseja exibir um arquivo GIF animado ou não animado em seu Ipython Notebook. Transforme a linha em que deseja exibi-la no markdown e use este belo e curto hack!

![alt text](test.gif "Title")
Philipp Schwarz
fonte
2
coloque a imagem na mesma pasta do bloco de anotações Jupyter ou, em vez de "test.gif", use "relative / path / test.gif"
Philipp Schwarz
23

Isso importará e exibirá uma .jpgimagem no Jupyter (testado com Python 2.7 no ambiente Anaconda)

from IPython.display import display
from PIL import Image


path="/path/to/image.jpg"
display(Image.open(path))

Pode ser necessário instalar o PIL

no Anaconda, isso é feito digitando

conda install pillow
Conor Cosnett
fonte
8

Como cortesia desta página, achei que funcionava quando as sugestões acima não funcionavam:

import PIL.Image
from cStringIO import StringIO
import IPython.display
import numpy as np
def showarray(a, fmt='png'):
    a = np.uint8(a)
    f = StringIO()
    PIL.Image.fromarray(a).save(f, fmt)
    IPython.display.display(IPython.display.Image(data=f.getvalue()))
Inspiração
fonte
4

Você pode usar no código html na seção de remarcação: exemplo:

 <img src="https://www.tensorflow.org/images/colab_logo_32px.png" />
Moumen Lahmidi
fonte
2

Uma versão mais limpa do Python3 que usa numpy padrão, matplotlib e PIL. Mesclando a resposta para a abertura do URL.

import matplotlib.pyplot as plt
from PIL import Image
import numpy as np

pil_im = Image.open('image.png') #Take jpg + png
## 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
fonte
2

Se você deseja exibir com eficiência um grande número de imagens, recomendo usar o pacote IPyPlot

import ipyplot

ipyplot.plot_images(images_array, max_images=20, img_width=150)

insira a descrição da imagem aqui

Existem outras funções úteis nesse pacote nas quais é possível exibir imagens em guias interativas (guia separada para cada etiqueta / classe), o que é muito útil para todas as tarefas de classificação de ML.

insira a descrição da imagem aqui

Karol Żak
fonte
0

Ao usar GenomeDiagramcom o Jupyter (iPython), a maneira mais fácil de exibir imagens é convertendo o GenomeDiagram em uma imagem PNG. Isso pode ser quebrado usando um objeto IPython.display.Image para exibi-lo no notebook.

from Bio.Graphics import GenomeDiagram
from Bio.SeqFeature import SeqFeature, FeatureLocation
from IPython.display import display, Image
gd_diagram = GenomeDiagram.Diagram("Test diagram")
gd_track_for_features = gd_diagram.new_track(1, name="Annotated Features")
gd_feature_set = gd_track_for_features.new_set()
gd_feature_set.add_feature(SeqFeature(FeatureLocation(25, 75), strand=+1))
gd_diagram.draw(format="linear", orientation="landscape", pagesize='A4',
                fragments=1, start=0, end=100)
Image(gd_diagram.write_to_string("PNG"))

[Veja o caderno]

Quantum7
fonte