50

我有一个简单的问题,但找不到一个好的解决方案。如何将Numpy数组转换为应用matplotlib颜色映射的PIL图像

我想要一个代表灰度图像的numpy二维数组,并将其转换为RGB PIL图像,同时应用一些matplotlib色彩映射。

我可以使用pyplot.figure.figimage命令得到合理的PNG输出:

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

虽然我能够适应这个来得到我想要的(可能使用StringIO的办得到PIL图像),我不知道是否有不是一个简单的方法来做到这一点,因为它似乎是一个非常自然的图像可视化问题。比方说,这样的事情:

colored_PIL_image = magic_function(array, cmap) 

感谢您的阅读!

+0

对于完全正常工作的代码,你可以参考:[是否有任何好的颜色映射将灰度图像转换为使用python的PIL的丰富多彩的图像?](http://stackoverflow.com/questions/43457308/is-there-any-好颜色映射到转换灰度图像到彩色的使用p) – Adam

回答

99

相当繁忙的一个套,但在这里它是:

  1. 首先确保您numpy的阵列,myarray,是标准化与1.0最大值。
  2. 将颜色映射直接应用于myarray
  3. 重新缩放至0-255范围。
  4. 转换为整数,使用np.uint8()
  5. 使用Image.fromarray()

大功告成:

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

plt.savefig()

enter image description here

im.save()

enter image description here

+4

“将颜色图直接应用到myarray”部分直接切到心脏!我不知道这是可能的,谢谢! – heltonbiker

+0

@heltonbiker - 是的,它很酷;) – fraxel

+27

研究LinearSegmentedColormap(cm.gist_earth是一个实例)的文档时,我发现可以用一个已经将它转换为uint8的“bytes”参数来调用它。然后,单线程得到很多安静:'im = Image.fromarray(cm.gist_earth(myarray,bytes = True))' – heltonbiker