PIL TypeError:无法处理此数据类型

Jer*_*ome 5 python python-imaging-library

我有一个图像存储在numpy数组中,我想将其转换PIL.Image为执行仅适用于PIL的插值。

当尝试通过Image.fromarray()它进行转换时,会引发以下错误:

TypeError:无法处理此数据类型

我已经在这里这里阅读了答案,但对于我的情况似乎没有帮助。

我要运行的是:

from PIL import Image

x  # a numpy array representing an image, shape: (256, 256, 3)

Image.fromarray(x)
Run Code Online (Sandbox Code Playgroud)

Uzz*_*der 27

解决了它。

问题情况: 当处理灰度图像二值图像时,如果 numpy 数组形状为(height, width, 1),也会引发此错误。
例如,32 x 32 像素的灰度图像(值 0 到 255)

np_img = np.random.randint(low=0, high=255, size=(32, 32, 1), dtype=np.uint8)
# np_img.shape == (32, 32, 1)
pil_img = Image.fromarray(np_img)
Run Code Online (Sandbox Code Playgroud)

将提高TypeError: Cannot handle this data type: (1, 1, 1), |u1

解决方案:

如果图像形状为(32, 32, 1)则将尺寸减少(32, 32)

np_img = np.squeeze(np_img, axis=2)  # axis=2 is channel dimension 
pil_img = Image.fromarray(np_img)
Run Code Online (Sandbox Code Playgroud)

这次成功了!!

此外,请确保是dtypeuint8对于灰色)或bool(对于二进制)。


Dji*_*011 10

tl; dr

是否x包含uint[0,255]中的值?如果不是,特别是如果x范围从0到1,这就是错误的原因。


说明

大多数图像库(例如matplotlib,opencv,scikit-image)都有两种表示图像的方式:

  • 以及uint介于0到255之间的值。
  • 作为float值的范围从0到1。

当在图像之间执行操作时,后者更方便,因此在计算机视觉领域更受欢迎。但是,PIL似乎不支持RGB图像

如果你看一看这里 看来,当您尝试从一个阵列读取的图像,如果阵列具有的形状(height, width, 3),它会自动假定它是RGB图像,并希望它有一个dtypeuint8!但是,根据您的情况,您有一个RBG图像,其float值从0到1。


您可以通过将图像转换为PIL期望的格式来修复它:

im = Image.fromarray((x * 255).astype(np.uint8))
Run Code Online (Sandbox Code Playgroud)

  • 这实际上有帮助!令人失望的是,PIL 不支持值为 [0, 1] 的 RBG 图像。 (3认同)
  • 将类型转换为“np.uint8”就可以了!谢谢。 (3认同)
  • 我收到以下警告消息“从 float64 到 uint8 的有损转换”。范围 [0, 1]。在保存之前将图像转换为 uint8 以抑制此警告。` Range [0,1] 是什么意思?我的 x 范围是 [0,2] (2认同)

小智 9

就我而言,这只是因为我忘记在“fromarray”函数中添加“RGB”参数。

pil_img = Image.fromarray(np_img, 'RGB')
Run Code Online (Sandbox Code Playgroud)