265 votes

Comment convertir un tableau NumPy en image PIL en utilisant matplotlib colormap

J'ai un problème simple, mais je ne trouve pas de bonne solution.

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

Je peux obtenir un résultat PNG raisonnable en utilisant la commande pyplot.figure.figimage commandement :

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 un moyen plus simple de le faire, puisque cela semble être un problème très naturel de visualisation d'images. Disons quelque chose comme ceci :

colored_PIL_image = magic_function(array, cmap)

369voto

fraxel Points 13844

C'est une phrase un peu chargée, mais elle est là :

  1. Vérifiez d'abord votre tableau NumPy, myarray est normalisé avec la valeur maximale à 1.0 .
  2. Appliquer la carte des couleurs directement à myarray .
  3. Remise à l'échelle en fonction de la 0-255 gamme.
  4. Convertir en nombres entiers, en utilisant np.uint8() .
  5. Utilisation Image.fromarray() .

Et le tour est joué :

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

80voto

Aravinda_gn Points 493
  • input = numpy_image

  • np.uint8 -> convertit en nombres entiers

  • convert('RGB') -> convertit en RGB

  • Image.fromarray -> renvoie un objet image

      from PIL import Image
      import numpy as np
    
      PIL_image = Image.fromarray(np.uint8(numpy_image)).convert('RGB')
    
      PIL_image = Image.fromarray(numpy_image.astype('uint8'), 'RGB')

12voto

ShitalShah Points 2213

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

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

np_array peut être un tableau 2D avec des valeurs de 0..1 floats ou 2 0..255 uint8, et dans ce cas il a besoin de cmap. Pour les tableaux 3D, cmap sera ignoré.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X