PIL 未形成图像

PIL Not Forming An Image

我是 PIL 的新手,所以我在玩这些函数:

from PIL import Image
import numpy as np
image_array = np.array([   
    [[0, 0, 0],
    [255, 255, 255],
    [0, 0, 0]],
    [[255, 255, 255],
    [0, 0, 0],
    [255, 255, 255]],
    [[0, 0, 0],
    [255, 255, 255],
    [0, 0, 0]]])
image = Image.fromarray(image_array)
image.show()

然而,当我想使用它时,它在第 13 行给我以下错误: 类型错误 无法处理此数据类型:(1, 1, 3), 但令人惊讶的是,当我使用 image_array = np.array(Image.open('Image.png')) 这是完全相同的图像和完全相同的数组时,它没有给我一个错误: Image.png (图片很小,3×3像素)

似乎没有其他人遇到同样的问题,或者我只是遗漏了什么

尝试使用 datatype conversion 或使用 dtype=np.unit8 参数定义数组作为开头。

也可以找到相关答案(不同的问题)。 -

img = Image.fromarray(image_array.astype(np.uint8)) #<---
img.width, img.height
(3,3)

或者,如果内存有问题,只需使用 np.array([[],[],[]], dtype=np.uint8) 开始。

此外,如果你想构建一个数组作为int64,只需使用copy=False到return原始数组而不是副本,然后再将其交给PIL。

image_array.astype(np.unit8, copy=False)

当您创建图像数组时:

image_array = np.array([   
[[0, 0, 0],
[255, 255, 255],
[0, 0, 0]],
[[255, 255, 255],
[0, 0, 0],
[255, 255, 255]],
[[0, 0, 0],
[255, 255, 255],
[0, 0, 0]]])

它将是 int64,而不是 np.uint8。您可以通过以下方式检查:

print(image_array.dtype)

所以它需要比必要多 8 倍的 RAM。我建议您首先使用正确的类型创建它,而不是创建不必要的大东西然后通过创建现在需要 9 倍 RAM 的另一个版本来更正它。所以,使用:

image_array = np.array([   
[[0, 0, 0],
[255, 255, 255],
[0, 0, 0]],
[[255, 255, 255],
[0, 0, 0],
[255, 255, 255]],
[[0, 0, 0],
[255, 255, 255],
[0, 0, 0]]], dtype=np.uint8)