web-dev-qa-db-fra.com

Comment convertir un tableau Numpy en image PIL en appliquant la palette de couleurs matplotlib

J'ai un problème simple mais je ne peux pas trouver une bonne solution.

Je veux prendre un tableau 2D numpy qui représente une image en niveaux de gris et le convertir en image RVB PIL tout en appliquant certaines des nuances de couleurs de matplotlib.

Je peux obtenir une sortie PNG raisonnable en utilisant le pyplot.figure.figimage commande:

dpi = 100.0
w, h = myarray.shape[1]/dpi, myarray.shape[0]/dpi
fig = plt.figure(figsize=(w,h), dpi=dpi)
fig.figimage(sub, cmap=cm.Gist_earth)
plt.savefig('out.png')

Bien que je puisse adapter cela pour obtenir ce que je veux (probablement en utilisant StringIO pour obtenir l'image PIL), je me demande s'il n'y a pas de moyen plus simple de le faire, car cela semble être un problème très naturel de visualisation d'images. Disons quelque chose comme ça:

colored_PIL_image = magic_function(array, cmap)

Merci d'avoir lu!

88
heltonbiker

Un paquebot très occupé, mais le voici:

  1. Tout d’abord, assurez-vous que votre tableau numpy, myarray, est normalisé avec la valeur maximale de 1.0.
  2. Appliquez la palette de couleurs directement à myarray.
  3. Remettre à l'échelle dans la plage 0-255.
  4. Convertissez-les en nombres entiers en utilisant np.uint8().
  5. Utilisez Image.fromarray().

Et tu as fini:

from PIL import Image
from matplotlib import cm
im = Image.fromarray(np.uint8(cm.Gist_earth(myarray)*255))

avec plt.savefig():

enter image description here

avec im.save():

enter image description here

168
fraxel

La méthode décrite dans la réponse acceptée ne fonctionnait pas pour moi, même après avoir appliqué les modifications mentionnées dans ses commentaires. Mais ci-dessous le code simple a fonctionné

import matplotlib.pyplot as plt
plt.imsave(filename, np_array, cmap='Greys')

np_array peut être soit un tableau 2D avec des valeurs de 0..1 floats o2 0..255 uint8 et dans ce cas, il faut cmap. Pour les matrices 3D, cmap sera ignoré.

2
Shital Shah