How to convert a NumPy array to PIL image applying matplotlib colormap
Quite a busy one-liner, but here it is:
- First ensure your NumPy array,
myarray
, is normalised with the max value at1.0
. - Apply the colormap directly to
myarray
. - Rescale to the
0-255
range. - Convert to integers, using
np.uint8()
. - Use
Image.fromarray()
.
And you're done:
from PIL import Image
from matplotlib import cm
im = Image.fromarray(np.uint8(cm.gist_earth(myarray)*255))
with plt.savefig()
:
with im.save()
:
- input = numpy_image
- np.unit8 -> converts to integers
- convert('RGB') -> converts to RGB
-
Image.fromarray -> returns an image object
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')
The method described in the accepted answer didn't work for me even after applying changes mentioned in its comments. But the below simple code worked:
import matplotlib.pyplot as plt
plt.imsave(filename, np_array, cmap='Greys')
np_array could be either a 2D array with values from 0..1 floats o2 0..255 uint8, and in that case it needs cmap. For 3D arrays, cmap will be ignored.