【问题标题】:PIL Not Forming An ImagePIL 不形成图像
【发布时间】:2022-01-01 17:18:36
【问题描述】:

我是 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 x 3 像素)

似乎没有其他人有同样的问题,或者我只是错过了一些东西

【问题讨论】:

标签: python numpy python-imaging-library


【解决方案1】:

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

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

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

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

此外,如果您想将数组构建为 int64,只需使用 copy=False 返回原始数组而不是副本,然后再将其交给 PIL。

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

【讨论】:

  • 为什么不从一开始就使用 dtype 创建数组,而不是错误地创建它然后更改它?
  • 这不是我回答的重点。它指出需要进行数据类型转换。由 OP 决定他们是否要执行在数组定义期间指定的 dtype。此外,他们可能希望在将定义的数组推送到 PIL 之前使用它。
【解决方案2】:

当您创建图像数组时:

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)

所以它需要的 RAM 是必要的 8 倍。我建议您首先使用正确的类型创建它,而不是创建不必要的大东西,然后通过创建另一个现在需要 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)

【讨论】:

    猜你喜欢
    • 2015-08-16
    • 2021-01-25
    • 2022-01-23
    • 2010-11-26
    • 1970-01-01
    • 1970-01-01
    • 2018-10-22
    • 2016-07-10
    相关资源
    最近更新 更多