wake-up-neo.net

So konvertieren Sie ein Numpy-Array in ein PIL-Bild mit matplotlib colormap

Ich habe ein einfaches Problem, kann aber keine gute Lösung finden.

Ich möchte ein numpy 2D-Array nehmen, das ein Graustufenbild darstellt, und es in ein RGB-PIL-Bild konvertieren, während einige der matplotlib-Farbkarten angewendet werden.

Ich kann eine vernünftige PNG-Ausgabe erhalten, indem ich pyplot.figure.figimage Befehl:

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

Obwohl ich dies anpassen könnte, um das zu bekommen, was ich will (wahrscheinlich mit StringIO, um das PIL-Bild zu bekommen), frage ich mich, ob es keinen einfacheren Weg gibt, dies zu tun, da es ein sehr natürliches Problem der Bildvisualisierung zu sein scheint. Sagen wir so etwas:

colored_PIL_image = magic_function(array, cmap)

Danke fürs Lesen!

88
heltonbiker

Ziemlich viel los, aber hier ist es:

  1. Stellen Sie zunächst sicher, dass Ihr Numpy-Array myarray mit dem Maximalwert von 1.0 Normalisiert ist.
  2. Wenden Sie die Farbkarte direkt auf myarray an.
  3. Skalieren Sie erneut in den Bereich 0-255.
  4. Mit np.uint8() in ganze Zahlen konvertieren.
  5. Verwenden Sie Image.fromarray().

Und du bist fertig:

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

mit plt.savefig():

enter image description here

mit im.save():

enter image description here

168
fraxel

Die in der akzeptierten Antwort beschriebene Methode hat bei mir auch nach Anwendung der in den Kommentaren genannten Änderungen nicht funktioniert. Aber unten hat einfacher Code funktioniert

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

np_array kann entweder ein 2D-Array mit Werten von 0..1 floats o2 0..255 uint8 sein und benötigt in diesem Fall cmap. Bei 3D-Arrays wird cmap ignoriert.

2
Shital Shah