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

相關問題