Я пытаюсь использовать 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: Cannot handle this data type
И если я установлю mode = "RGB"
, сохраненный файл изображения test.png
и окно matplotlib
будут выглядеть так:
Сложите свои три массива и преобразуйте их в тип 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")
Согласно режиму https://pillow.readthedocs.io/en/latest/handbook/concepts.html#concept-modesRGB
должно быть 3x8-битных пикселей. Однако по умолчанию numpy.ndarray
имеет тип int64
:
>>> a = np.array([[[255, 0, 0], [0, 255, 0], [0, 0, 255]]])
>>> a.dtype
dtype('int64')
Это где
TypeError: Cannot handle this data type
пришли из. Если я задаю правильное 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()
@finefoot: Хорошо, тогда вам просто нужно преобразовать в тип
(np.uint8)