50

Mam prosty problem, ale nie mogę znaleźć dobrego rozwiązania.Jak przekonwertować tablicę Numpy do obrazu PIL stosując matplotlib colormap

Chcę wziąć numpy 2D tablicy, która reprezentuje obraz w skali szarości, i przekonwertować go do obrazu RIL PIL podczas stosowania niektórych colormaps matplotlib.

mogę uzyskać rozsądne wyjście PNG za pomocą polecenia pyplot.figure.figimage:

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

Chociaż mogę dostosować to, aby dostać to, co chcę (prawdopodobnie za pomocą StringIO rozumiem obrazu PIL), zastanawiam się, czy istnieje nie jest to prostszy sposób, ponieważ wydaje się to bardzo naturalnym problemem wizualizacji obrazu. Załóżmy, że coś takiego:

colored_PIL_image = magic_function(array, cmap) 

Dzięki za przeczytanie!

+0

Dla w pełni działającego kodu, możesz odpowiedzieć: [Czy istnieje dobra mapa kolorów do konwersji obrazu w skali szarości na kolorowe za pomocą PIL Pythona?] (Http://stackoverflow.com/questions/43457308/is-there-any- dobry kolor-mapa-konwersja-szara-obraz-kolorowy-do-używania-p) – Adam

Odpowiedz

99

Dość zajęty jeden liner, ale tutaj jest:

  1. pierwsze zapewnić swoją numpy tablicy, myarray, normalizuje o wartości max przy 1.0.
  2. Zastosuj colormap bezpośrednio do myarray.
  3. Przeskaluj do zakresu 0-255.
  4. Konwertuj na liczby całkowite, używając np.uint8().
  5. Użyj Image.fromarray().

I gotowe:

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

z plt.savefig():

enter image description here

z im.save():

enter image description here

+4

"Zastosuj colormap bezpośrednio do' myarray' "wyciąć prosto do serca! Nie wiedziałem, że to możliwe, dziękuję! – heltonbiker

+0

@heltonbiker - tak, jest całkiem fajny;) – fraxel

+27

Studiując dokumenty o LinearSegmentedColormap (z którego cm.gist_earth jest instancją), odkryłem, że można go nazwać argumentem "bytes", który już konwertuje go na uint8. Następnie jednolinijka staje się znacznie ciszej: 'im = Image.fromarray (cm.gist_earth (myarray, bytes = True))' – heltonbiker