Ошибка типа: Не удается обработать этот тип данных - Неправильный режим для `PIL.Image.fromarray`? - PullRequest
1 голос
/ 30 мая 2019

Я пытаюсь использовать PIL.Image.fromarray:

import matplotlib.pyplot as plt
import numpy as np
from PIL import Image

a = np.array([[[255, 0, 0], [0, 255, 0], [0, 0, 255]]])
im = Image.fromarray(a, mode="RGB")
im.save("test.png")
plt.imshow(im)
plt.show()

Я ожидал увидеть 3 пикселя: красный, зеленый и синий.

Однако, если я опущу параметр ключевого слова mode, как показано в примере с документами, я получу:

TypeError: Невозможно обработать этот тип данных

И если я установлю mode="RGB", файл сохраненного изображения test.png и окно matplotlib будут выглядеть так:

figure

Ответы [ 2 ]

1 голос
/ 30 мая 2019

Сложите ваши три массива и конвертируйте их в тип uint8 на основе этого и этого ответа.

import matplotlib.pyplot as plt
import numpy as np
from PIL import Image

a = (np.dstack(([255, 0, 0],[0, 255, 0],[0, 0, 255]))).astype(np.uint8) 

im = Image.fromarray(a, mode="RGB")
im.save("test.png")
plt.imshow(im)
plt.show()

Альтернативная опция для добавления дополнительного измерения к вашему входному массиву с приданием ему формы (1, 3, 3)

a = np.array([[[255, 0, 0], [0, 255, 0], [0, 0, 255]]], dtype=np.uint8)
im = Image.fromarray(a, mode="RGB")

enter image description here

0 голосов
/ 30 мая 2019

В соответствии с https://pillow.readthedocs.io/en/latest/handbook/concepts.html#concept-modes режимом RGB должно быть 3x8-битных пикселей. Однако numpy.ndarray имеет тип int64 по умолчанию:

>>> a = np.array([[[255, 0, 0], [0, 255, 0], [0, 0, 255]]])
>>> a.dtype
dtype('int64')

Вот где

TypeError: Невозможно обработать этот тип данных

пришел. Если для массива установить правильное 8-битное ключевое слово dtype, все будет работать нормально, даже без указания ключевого слова mode:

import matplotlib.pyplot as plt
import numpy as np
from PIL import Image

a = np.array([[[255, 0, 0], [0, 255, 0], [0, 0, 255]]])
im = Image.fromarray(a, mode="RGB")
im.save("test.png")
plt.imshow(im)
plt.show()

figure

...