Comment afficher une image à partir d'un fichier dans Jupyter Notebook?

199

Je voudrais utiliser un cahier IPython pour analyser de manière interactive certaines cartes génomiques que je crée avec le GenomeDiagrammodule de Biopython . Bien qu'il existe une documentation complète sur la façon d'utiliser matplotlibpour obtenir des graphiques en ligne dans le bloc-notes IPython, GenomeDiagram utilise la boîte à outils ReportLab qui, je ne pense pas, est prise en charge pour la création de graphiques en ligne dans IPython.

Je pensais, cependant, qu'une façon de contourner ce problème serait d'écrire le diagramme intrigue / génome dans un fichier, puis d'ouvrir l'image en ligne, ce qui aurait le même résultat avec quelque chose comme ceci:

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

Cependant, je ne peux pas comprendre comment faire cela - ou savoir si c'est possible. Alors, est-ce que quelqu'un sait si les images peuvent être ouvertes / affichées dans IPython?

zach
la source

Réponses:

349

Avec l'aimable autorisation de cet article , vous pouvez effectuer les opérations suivantes:

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

( documents officiels )

zach
la source
Il vaut mieux utiliser l'API publique sans accéder aux internes: from IPython.display import Imagedevrait fonctionner depuis la 0.13.
tomyun
65
cela n'affiche pas l'image si à l'intérieur d'une boucle
muon
6
La plupart des gens voudraient la réponse de DrMcCleod.
AturSams
3
Cela ne fonctionne pour moi que si je passe l'image (filename = 'test.png') à afficher, comme recommandé dans un fil de discussion ci-dessous: from IPython.core.display import Image, display<b /> display(Image(filename='test.png'))
John Strong
1
Si vous souhaitez que l'image s'affiche également en mode de présentation des diapositives (avec lequel vous exécutez jupyter nbconvert mynotebook.ipynb --to slides --post serve), le chemin de l'image doit commencer par de /sorte qu'il s'agisse d'un chemin absolu depuis la racine Web, c'est![alt text](/test.jpg "Some Title")
ccpizza
230

Si vous essayez d'afficher une image de cette manière dans une boucle, vous devez encapsuler le constructeur Image dans une méthode d'affichage.

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
la source
1
Pourquoi? (Ne me dites pas que sinon cela ne fonctionne pas. Veuillez expliquer pourquoi cet appel à «afficher» est nécessaire dans une boucle mais pas si vous affichez juste une image).
Kris
15
Étant donné que les blocs-notes IPython affichent uniquement la dernière valeur de retour dans une cellule, chaque fois que vous avez deux sorties de la même cellule, vous devrez utiliser la méthode «affichage». Consultez cette question pour en savoir plus.
DrMcCleod
1
Tu es mon héros - je le cherche depuis deux jours.
ZaxR
1
C'est bien. Comment puis-je faire en sorte que l'image suivante remplace celle existante, comme pour un effet animé lorsqu'une image change avec le temps?
blissweb
2
Je me demandais, comment pourrions-nous carreler les images? Par exemple pour montrer un groupe d'images 4x4.
gmagno
32

Notez que jusqu'à présent, les solutions publiées ne fonctionnent que pour png et jpg!

Si vous le souhaitez encore plus facilement sans importer d'autres bibliothèques ou si vous souhaitez afficher un fichier GIF animé ou non animé dans votre bloc-notes Ipython. Transformez la ligne où vous souhaitez l'afficher en démarque et utilisez ce joli petit hack!

![alt text](test.gif "Title")
Philipp Schwarz
la source
2
mettez l'image dans le même dossier que le notebook Jupyter, ou au lieu de "test.gif", utilisez "relative / path / test.gif"
Philipp Schwarz
25

Cela importera et affichera une .jpgimage dans Jupyter (testé avec Python 2.7 dans l'environnement Anaconda)

from IPython.display import display
from PIL import Image


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

Vous devrez peut-être installer PIL

dans Anaconda, cela se fait en tapant

conda install pillow
Conor Cosnett
la source
9

Avec la permission de cette page, j'ai trouvé que cela fonctionnait alors que les suggestions ci-dessus ne le faisaient pas:

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()))
Afflatus
la source
7

Vous pouvez utiliser du code html dans la section markdown: exemple:

 <img src="https://www.tensorflow.org/images/colab_logo_32px.png" />
Moumen Lahmidi
la source
6

Si vous souhaitez afficher efficacement un grand nombre d'images, je recommande d'utiliser le package IPyPlot

import ipyplot

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

entrez la description de l'image ici

Il existe d'autres fonctions utiles dans ce package où vous pouvez afficher des images dans des onglets interactifs (onglet séparé pour chaque étiquette / classe), ce qui est très utile pour toutes les tâches de classification ML.

entrez la description de l'image ici

Karol Żak
la source
3

Une version plus propre de Python3 qui utilise numpy, matplotlib et PIL standard. Fusion de la réponse pour l'ouverture à partir de l'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
la source
2
from IPython.display import Image

Image(filename =r'C:\user\path')

J'ai vu des solutions et certaines ne fonctionneront pas à cause du répertoire brut, lorsque vous ajoutez des codes comme celui ci-dessus, n'oubliez pas d'ajouter «r» avant le répertoire. cela devrait éviter ce genre d'erreur: (erreur unicode) le codec 'unicodeescape' ne peut pas décoder les octets en position 2-3: échappement \ UXXXXXXXX tronqué

Magno Naoli
la source
0

Lors de l'utilisation GenomeDiagramavec Jupyter (iPython), le moyen le plus simple d'afficher des images consiste à convertir le GenomeDiagram en une image PNG. Cela peut être encapsulé à l'aide d'un objet IPython.display.Image pour l'afficher dans le bloc-notes.

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

[Voir le carnet]

Quantum7
la source
0

Une autre option pour tracer en ligne à partir d'un tableau d'images pourrait être:

import IPython
def showimg(a):
    IPython.display.display(PIL.Image.fromarray(a))

où a est un tableau

a.shape
(720, 1280, 3)
Francisco Catrileo
la source