我有一个存储在numpy数组中的图像,我想将其转换为PIL.Image
,以便执行仅适用于PIL的插值。
尝试通过Image.fromarray()
转换时,会引发以下错误:
TypeError:无法处理此数据类型
我已经阅读了here和here的答案,但它们似乎对我的情况没有帮助。
我想做的是:
from PIL import Image
x # a numpy array representing an image, shape: (256, 256, 3)
Image.fromarray(x)
6条答案
按热度按时间44u64gxh1#
时间;日期
x
是否包含[0,255]中的uint
值?如果不包含,特别是x
的范围从0到1,这就是错误的原因。解释
大多数图像库(例如matplotlib、opencv、scikit-image)都有两种表示图像的方式:
uint
,其值范围为0至255。float
,其值的范围从0到1。后者在图像之间进行操作时更方便,因此在计算机视觉领域更受欢迎。但是PIL似乎不支持RGB图像。
如果你看一下这里,当你试图从一个数组中读取一个图像时,如果数组的形状是
(height, width, 3)
,它会自动假设它是一个RGB图像,希望它的dtype
是uint8
!但是,在你的例子中,你有一个RBG图像,float
的值从0到1。溶液
您可以通过将图像转换为PIL预期的格式来修复此问题:
gcuhipw92#
我解决它不同的方式。
(height, width, 1)
,也会引发此错误。例如,32 x 32像素的灰度图像(值0到255)
将使
TypeError: Cannot handle this data type: (1, 1, 1), |u1
溶液:
如果图像形状类似
(32, 32, 1)
,将尺寸减少为(32, 32)
这次成功了!!
此外,请确保
dtype
是uint8
(对于灰色)或bool
(对于二进制)。i34xakig3#
在我的例子中,这只是因为我忘记在“fromarray”函数中添加“RGB”参数。
bnl4lu3b4#
我发现在我的例子中同样的错误有一个不同的问题。我使用的图像是RGBA格式的,所以在使用Fromarray()函数之前只需使用Convert()函数将其转换为RGB,它就会工作得非常好。
P.S.:在将图像转换为np之前,将此解决方案作为初始步骤发布。
vaqhlq815#
在我的情况下,图像的文件格式被改为
png
到jpg
。当我纠正错误图像的图像格式时,它工作得很好。apeeds0o6#
根据scikit-image的documentation,您可以使用
img_as_ubyte
将图像转换为无符号字节格式,其值位于**[0,255]**中: