Python PIL类型错误:无法处理此数据类型

Python PIL类型错误:无法处理此数据类型,python,python-imaging-library,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) tl

我有一个存储在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)
tl;博士
x
是否在[0255]中包含
uint
值?如果不是,特别是如果
x
的范围在0到1之间,这就是错误的原因


解释 大多数图像库(例如matplotlib、opencv、scikit image)有两种表示图像的方式:

  • 作为
    uint
    ,值范围为0到255
  • 作为
    浮点
    ,值范围为0到1
后者在图像之间执行操作时更方便,因此在计算机视觉领域更受欢迎。 然而,PIL似乎不支持RGB图像

如果你看看 似乎当您尝试从数组中读取图像时,如果数组的形状为
(高度、宽度,3)
,它会自动假定它是RGB图像,希望它的
数据类型为
uint8
! 但是,在您的情况下,您的RBG图像的
float
值介于0到1之间


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

im = Image.fromarray((x * 255).astype(np.uint8))

我用不同的方法解决了它

问题情况: 使用灰度图像二值图像时,如果numpy数组形状为
(高度、宽度1)
,则也会出现此错误。
例如,32 x 32像素的灰色图像(值0到255)

np\u img=np.random.randint(低=0,高=255,大小=(32,32,1),数据类型=np.uint8)
#np_img.shape==(32,32,1)
pil\u img=Image.fromarray(np\u img)
将引发
TypeError:无法处理此数据类型:(1,1,1),|u1

解决方案: 如果图像形状类似于
(32,32,1)
将尺寸缩小为
(32,32)

np_img=np。挤压(np_img,轴=2)#轴=2是通道尺寸
pil\u img=Image.fromarray(np\u img)
这次成功了


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

我在我的案例中发现了相同错误的不同问题。我使用的图像是RGBA格式的,所以在使用fromarray()函数之前,只需使用convert()函数将其转换为RGB,它就会工作得非常好

image_file = Image.open(image_file)
image_file = image_file.convert('RGB')

注意:在将图像转换为np之前,将此解决方案作为初始步骤发布。

问题与
机器学习
深度学习
无关-请不要垃圾邮件发送不相关的标签(已删除)。请举例说明您的数据外观,否则就不可能说问题出在哪里。@desertnaut我认为,因为我使用图像对CNN进行分类,标签可能是相关的。不,标签应该只与问题内容有关,而不是与上下文有关;没问题,只是为了将来记住这一点。它实际上是有帮助的!令人失望的是,PIL不支持在[0,1]中具有值的RBG图像。我收到以下警告消息:从float64到uint8的有损转换。范围[0,1]。保存前将图像转换为uint8以抑制此警告。
范围[0,1]是什么意思?我的x范围是[0,2]@BlackJack21我想这意味着你应该先将你的范围转换为[0,1],然后再尝试转换它。不,我也尝试过,但错误仍然存在。这是在Jupyter实验室,可能与ipynb有关吗?将类型转换为
np。uint8
做到了!谢谢