web-dev-qa-db-fra.com

Enregistrement d'une image de type imshow tout en préservant la résolution

J'ai un tableau (n, m) que j'ai visualisé avec matplotlib.pyplot.imshow. Je voudrais enregistrer ces données dans un certain type de fichier graphique raster (par exemple un png) afin que:

  1. Les couleurs sont celles indiquées par imshow
  2. Chaque élément du tableau sous-jacent représente exactement un pixel dans l'image enregistrée, ce qui signifie que si le tableau sous-jacent est composé de (n, m) éléments, l'image est NxM pixels. (Je ne suis pas intéressé par interpolation='nearest' dans imshow.)
  3. Il n'y a rien dans l'image enregistrée à l'exception des pixels correspondant aux données du tableau. (C'est-à-dire qu'il n'y a pas d'espace blanc autour des bords, des axes, etc.)

Comment puis-je faire ceci?

J'ai vu du code qui peut le faire en utilisant interpolation='nearest' et forcer matplotlib à désactiver (à contrecœur) les axes, les espaces blancs, etc. Cependant, il doit y avoir un moyen de le faire plus directement - peut-être avec PIL? Après tout, j'ai les données sous-jacentes. Si je peux obtenir une valeur RVB pour chaque élément du tableau sous-jacent, je peux l'enregistrer avec PIL. Existe-t-il un moyen d'extraire les données RVB de imshow? Je peux écrire mon propre code pour mapper les valeurs du tableau aux valeurs RVB, mais je ne veux pas réinventer la roue, car cette fonctionnalité existe déjà dans matplotlib.

19
lnmaurer

Comme vous l'avez déjà deviné, il n'est pas nécessaire de créer une figure. Vous avez essentiellement besoin de trois étapes. Normalisez vos données, appliquez la palette de couleurs, enregistrez l'image. matplotlib fournit toutes les fonctionnalités nécessaires:

import numpy as np
import matplotlib.pyplot as plt

# some data (512x512)
import scipy.misc
data = scipy.misc.lena()

# a colormap and a normalization instance
cmap = plt.cm.jet
norm = plt.Normalize(vmin=data.min(), vmax=data.max())

# map the normalized data to colors
# image is now RGBA (512x512x4) 
image = cmap(norm(data))

# save the image
plt.imsave('test.png', image)

Bien que le code ci-dessus explique les étapes simples, vous pouvez également laisser imsave effectuer les trois étapes (similaire à imshow):

plt.imsave('test.png', data, cmap=cmap)

Résultat (test.png):

enter image description here

28
hitzg