Как создать изображение из массива numpy float32?


У меня есть массив numpy.ndarray, который содержит значения float32. Изображения должны иметь размеры 226×226. Я попытался использовать PIL.Image для создания образа, но получил ошибку. Я читал, что PIL.Image.fromarray требуют объекта и режима, и для float мне нужно вызвать fromarray с 'F', Как я пытался.

Вот что я пытался сделать:

from PIL import Image
img = Image.fromarray(slice56, mode='F')
#type(slice56) = <type 'numpy.ndarray'>
#slice56 = array([ 0.,  0.,  0., ...,  0.,  0.,  0.], dtype=float32)

И я получаю эту ошибку:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib64/python2.6/site-packages/PIL/Image.py", line 1860, in fromarray
    return frombuffer(mode, size, obj, "raw", mode, 0, 1)
  File "/usr/lib64/python2.6/site-packages/PIL/Image.py", line 1805, in frombuffer
    return apply(fromstring, (mode, size, data, decoder_name, args))
  File "/usr/lib64/python2.6/site-packages/PIL/Image.py", line 1743, in fromstring
    im = new(mode, size)
  File "/usr/lib64/python2.6/site-packages/PIL/Image.py", line 1710, in new
    return Image()._new(core.fill(mode, size, color))
TypeError: argument 2 must be sequence of length 2, not 1
Может ли кто-нибудь предложить идею, как это сделать? Или как решить эту ошибку?
2 3

2 ответа:

Я бы согласился с ответом DavidG это быстрое решение для построения изображения из массива numpy. Однако, если у вас есть очень веская причина придерживаться PIL.Image, наиболее близким подходом к тому, что вы уже сделали, будет что-то вроде этого:

from PIL import Image
import numpy as np

slice56 = np.random.random((226, 226))

# convert values to 0 - 255 int8 format
formatted = (slice56 * 255 / np.max(slice56)).astype('uint8')
img = Image.fromarray(formatted)
img.show()

Тогда он будет производить что-то вроде приведенных ниже случайных чисел:

Пиль изображения

Благодаря John Titus Jungao проблема решена. Массив был 1D, поэтому я сделал следующее:

from PIL import Image
import numpy as np

slice56 = slice56.reshape((226,226))
formatted = (slice56 * 255 / np.max(slice56)).astype('uint8')
img = Image.fromarray(formatted)
img.save('slice56.png')

И это все.