web-dev-qa-db-fra.com

les images en ligne sont de faible qualité

Je charge un fichier TIF avec scikit-image et l'affiche en ligne dans un cahier ipython (version 2.2.0). Cela fonctionne, cependant, l'image est assez petite lors de son premier affichage, et lorsque je la redimensionne à l'aide de la poignée déplaçable en bas à droite de l'image, elle redimensionne simplement l'image tout en conservant la résolution de l'original, elle est donc très floue lorsqu'elle est agrandie . C'est comme si ipython convertissait mon image en miniature à la volée.

J'ai également essayé d'utiliser la fonction plt.imshow() de matplotlib, qui a exactement le même résultat. Je démarre le cahier avec ipython notebook --pylab inline.

from skimage import io
import matplotlib.pyplot as plt
image_stack = io.MultiImage("my_image.tif")
image = image_stack[0]  # it's a multi-page TIF, this gets the first image in the stack

io.imshow(image)  # or plt.imshow(image)
io.show()  # or plt.show()
29
jimbotron

Pour modifier la résolution de la figure "% matplotlib inline" sur le portable, procédez comme suit:

import matplotlib as mpl
mpl.rcParams['figure.dpi']= dpi

Je recommande de régler le dpi quelque part entre 150 et 300 si vous allez télécharger/imprimer le portable. Veiller à ce que %matplotlib inline s'exécute avant le mpl.rcParams['figure.dpi']= dpi sinon la commande magique réinitialise le dpi à sa valeur par défaut (crédit à @fabioedoardoluigialberto pour l'avoir remarqué).

L'extrait ci-dessous modifie uniquement le dpi des chiffres enregistrés via la méthode savefig, pas des chiffres générés en ligne.

import matplotlib as mpl
mpl.rc("savefig", dpi=dpi)
28
Francio Rodrigues

Selon https://www.reddit.com/r/IPython/comments/1kg9e2/ipython_tip_for_getting_better_quality_inline/

Vous pouvez également exécuter cette magie dans votre cellule:

%config InlineBackend.figure_format = 'svg'

La qualité d'impression sera nettement meilleure. Vous pouvez également changer svg en retina, pour utiliser des PNG de plus haute résolution (pas comme Nice). Néanmoins, notez que si votre image devient trop compliquée, l'image svg aura une taille beaucoup plus grande que celle de l'image retina

16
Costa Huang

La résolution des figures matplotlib en ligne est légèrement réduite par rapport à ce que vous verriez dans une fenêtre GUI ou une image enregistrée, probablement pour économiser de l'espace dans le fichier de bloc-notes. Pour le changer, vous pouvez faire:

import matplotlib as mpl
mpl.rc("savefig", dpi=dpi)

dpi est un nombre qui contrôlera la taille/résolution des tracés en ligne. Je crois que la valeur par défaut en ligne est 80, et la valeur par défaut ailleurs avec matplotlib est 100.

La raison pour laquelle la mise à l'échelle du tracé résultant en faisant glisser la poignée ne fonctionne pas est que le tracé est rendu au format png, donc sa mise à l'échelle zoome mais ne modifie pas la résolution intrinsèque.

7
mwaskom

En supposant que c'est la même chose qui se produit avec le bloc-notes iPython (avec% matplotlib en ligne) lorsque vous allez faire glisser et redimensionner l'image, la correction est assez simple.

Si vous venez de créer une figure avec une taille par défaut différente, la résolution augmente également avec la taille de la valeur par défaut ( Changer la résolution d'imshow dans ipython ). Par exemple:

fig = plt.figure(figsize = (10,10))
ax = fig.add_subplot(111)
ax.imshow(array)

Quelque chose comme ça devrait augmenter la résolution de la chose que vous essayez de tracer. Cela a semblé fonctionner pour moi avec votre code:

from skimage import io
import matplotlib.pyplot as plt
%matplotlib inline

image_stack = io.MultiImage("my_image.tif")
image = image_stack[0] 

fig = plt.figure(figsize= (20,20)) #create an empty figure to plot into with 20x20 size
io.imshow(image)
io.show()
2
nanoman