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

bvpmtnay  于 2023-02-11  发布在  Python
关注(0)|答案(6)|浏览(286)

我有一个存储在numpy数组中的图像,我想将其转换为PIL.Image,以便执行仅适用于PIL的插值。
尝试通过Image.fromarray()转换时,会引发以下错误:
TypeError:无法处理此数据类型
我已经阅读了herehere的答案,但它们似乎对我的情况没有帮助。
我想做的是:

from PIL import Image

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

Image.fromarray(x)
44u64gxh

44u64gxh1#

时间;日期

x是否包含[0,255]中的uint值?如果不包含,特别是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))
gcuhipw9

gcuhipw92#

解决它不同的方式。

  • 问题情况:* 处理***灰度图像***或***二值图像***时,如果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)

将使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)

这次成功了!!
此外,请确保dtypeuint8(对于灰色)或bool(对于二进制)。

i34xakig

i34xakig3#

在我的例子中,这只是因为我忘记在“fromarray”函数中添加“RGB”参数。

pil_img = Image.fromarray(np_img, 'RGB')
bnl4lu3b

bnl4lu3b4#

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

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

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

vaqhlq81

vaqhlq815#

在我的情况下,图像的文件格式被改为pngjpg。当我纠正错误图像的图像格式时,它工作得很好。

apeeds0o

apeeds0o6#

根据scikit-imagedocumentation,您可以使用img_as_ubyte将图像转换为无符号字节格式,其值位于**[0,255]**中:

from skimage import img_as_ubyte
from PIL import Image

new_image = Image.fromarray(img_as_ubyte(image))

相关问题