Python PIL类型错误:无法处理此数据类型
我有一个存储在numpy数组中的图像,我想将其转换为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
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)有两种表示图像的方式:
- 作为
,值范围为0到255uint
- 作为
,值范围为0到1浮点
(高度、宽度,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
做到了!谢谢