12

我正在尝试使用 PIL 从 numpy 数组中读取图像,方法是执行以下操作:

from PIL import Image
import numpy as np
#img is a np array with shape (3,256,256)
Image.fromarray(img)

并收到以下错误:

File "...Image.py", line 2155, in fromarray
    raise TypeError("Cannot handle this data type")

我认为这是因为fromarray期望形状是(height, width, num_channels)但是我拥有的数组是形状(num_channels, height, width),因为它存储在lmdb数据库中。

如何重塑图像以使其兼容Image.fromarray

4

3 回答 3

14

你不需要重塑。这就是 rollaxis 的用途

Image.fromarray(np.rollaxis(img, 0,3))
于 2015-05-20T10:21:29.627 回答
2

尝试

img = np.reshape(256, 256, 3)
Image.fromarray(img)
于 2015-05-20T10:19:46.890 回答
0

定义 numpy 数组的数据类型来np.uint8为我修复它。

>>> img = np.full((256, 256), 3)
>>> Image.fromarray(img)
...
line 2753, in fromarray
raise TypeError("Cannot handle this data type: %s, %s" % typekey) from e
TypeError: Cannot handle this data type: (1, 1), <i8

所以用正确的数据类型定义数组:

>>> img = np.full((256, 256), 3, dtype=np.uint8)
>>> Image.fromarray(img)
<PIL.Image.Image image mode=L size=256x256 at 0x7F346EA31130>

成功创建 Image 对象

或者您可以简单地修改现有的 numpy 数组:

img = img.astype(np.uint8)
于 2020-12-24T00:44:59.703 回答