50

Basit bir sorunum var ama buna iyi bir çözüm bulamıyorum.Numpy dizisi, PIL görüntüsüne dönüştürme matplotlib colormap uygulamasına dönüştürülüyor

Gri ​​tonlamalı bir görüntüyü temsil eden ve matplotlib renk haritalarından bazılarını uygularken bir RGB PIL görüntüsüne dönüştüren bir sayısal 2D dizi almak istiyorum.

Ben pyplot.figure.figimage komutunu kullanarak makul PNG çıktı alabilirsiniz : yoktur İstediğimi elde etmek için bu uyum olabilir rağmen

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

(muhtemelen StringIO kullanarak PIL görüntü elde yapmak), ben acaba eğer Bunu yapmak için daha basit bir yol değil, çünkü görüntü görselleştirmesinin çok doğal bir sorunu gibi görünüyor. Diyelim ki şöyle bir şey:

colored_PIL_image = magic_function(array, cmap) 

Okumak için teşekkürler!

+0

Tam çalışma kodu için aşağıdakileri yapabilirsiniz: [Python'un PIL'sini kullanarak gri ölçekli görüntüyü renkli olanlara dönüştürmek için iyi bir renk haritası var mı?] (Http://stackoverflow.com/questions/43457308/is-there-any- iyi-renk-haritası-dönüştür-gri-ölçek-görüntü-renkli-olanlar-kullanarak-p) – Adam

cevap

99

Oldukça yoğun bir liner, ama işte burada:

  1. Önce numpy dizi myarray, 1.0 de maksimum değere sahip normalize olmasını sağlar.
  2. Renk eşlemesini doğrudan myarray'a uygulayın.
  3. 0-255 ürün yelpazesine yeniden boyutlandırın.
  4. Tam sayılara dönüştür, np.uint8()'u kullanarak.
  5. Image.fromarray()'u kullanın.

Ve bitirdiniz:

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

plt.savefig() ile:

enter image description here

im.save() ile:

enter image description here

+4

"Renk mengenesini doğrudan 'myarray' 'bölümüne uygulayın. Mümkün olduğunu bilmiyordum, teşekkürler! – heltonbiker

+0

@heltonbiker - evet, oldukça havalı;) – fraxel

+27

LinearSegmentedColormap ile ilgili dokümanları incelemek (içinden cm.gist_earth bir örnektir), onu uint8'ye dönüştüren bir "bayt" argümanıyla çağırmanın mümkün olduğunu keşfettim. Daha sonra, tek astar çok daha sessiz olur: 'im = Image.fromarray (cm.gist_earth (myarray, bayt = True)) – heltonbiker

İlgili konular