TypeError:无法处理此数据类型-PIL.Image.fromarray的模式错误?

时间:2019-05-30 00:13:59

标签: python arrays image numpy python-imaging-library

我正在尝试使用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()

我希望看到红色,绿色和蓝色三个像素。

但是,如果我如文档示例中所示省略了mode关键字参数,则会得到:

  

TypeError:无法处理此数据类型

如果我设置了mode="RGB",则保存的图像文件test.pngmatplotlib窗口都看起来像这样:

figure

2 个答案:

答案 0 :(得分:1)

堆叠三个数组,然后根据thisthis的答案将它们转换为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

答案 1 :(得分:0)

根据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