Ich habe ein einfaches Problem, aber ich kann keine gute Lösung dafür finden.
Ich möchte ein NumPy 2D-Array, das ein Graustufenbild darstellt, in ein RGB-PIL-Bild konvertieren, während ich einige der Matplotlib-Farbkarten anwende.
Ich kann eine vernünftige PNG-Ausgabe erhalten, indem ich den folgenden pyplot.figure.figimage
Befehl verwende:
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 bekomme ich mit StringIO das PIL-Bild), 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)
python
numpy
matplotlib
python-imaging-library
color-mapping
Heltonbiker
quelle
quelle
Antworten:
Ein ziemlich beschäftigter Einzeiler, aber hier ist es:
myarray
mit dem Maximalwert bei normalisiert ist1.0
.myarray
.0-255
Bereich skalieren .np.uint8()
.Image.fromarray()
.Und du bist fertig:
mit
plt.savefig()
:mit
im.save()
:quelle
myarray
" schneidet direkt ins Herz! Ich wusste nicht, dass es möglich ist, danke!im = Image.fromarray(cm.gist_earth(myarray, bytes=True))
NameError: name 'cm' is not defined
from matplotlib import cm
Image.fromarray -> gibt ein Bildobjekt zurück
quelle
Die in der akzeptierten Antwort beschriebene Methode hat bei mir auch nach Anwendung der in den Kommentaren genannten Änderungen nicht funktioniert. Aber der folgende einfache Code hat funktioniert:
np_array kann entweder ein 2D-Array mit Werten von 0..1 Floats o2 0..255 uint8 sein, und in diesem Fall benötigt es cmap. Bei 3D-Arrays wird cmap ignoriert.
quelle