gpt4 book ai didi

python - 将 PIL 图像保存到 4D Numpy 数组时显示的静态图像

转载 作者:行者123 更新时间:2023-12-01 01:18:02 27 4
gpt4 key购买 nike

我有以下 Python 代码,其中我将一些形状 326x490x3 的图像保存为 numpy 数组,以便在稍后阶段进行预处理。我想将图像保存在 4D numpy 数组中,以便稍后可以批量处理它们。代码工作正常,但我发现当我将 4D 数组的每个 3D 元素转换回 RGB 图像时,我只是得到静态图像。

代码:

data = np.zeros((129, 326, 490, 3))
image_path = '0.jpg'
img = Image.open(image_path)
data[0,:,:,:] = np.asarray(img)
im = Image.fromarray(data[0], 'RGB')
im.show()

输出:

Output when using 4D array

但是当我尝试将 4D 数组中的 3D numpy 数组切片显示为灰度图像时,它工作得很好。

代码:

data = np.zeros((129, 326, 490, 3))
image_path = '0.jpg'
img = Image.open(image_path)
data[0,:,:,:] = np.asarray(img)
im = Image.fromarray(np.dot(data[0], [0.299, 0.587, 0.114]))
im.show()

输出:

enter image description here

给出的解决方案here当我将图像保存到 3D numpy 数组并切换回 PIL 图像时,它按预期工作。

代码:

data = np.zeros((129, 326, 490, 3))
image_path = '0.jpg'
img = Image.open(image_path)
im = Image.fromarray(np.asarray(img), 'RGB')
im.show()

输出:

enter image description here

有人可以解释一下这种行为吗? 我不明白代码如何按照 3D numpy 数组的预期工作,但对于 4D numpy 数组的 3D 数组切片的工作方式有所不同。

最佳答案

numpy.zeros创建的数组的默认数据类型是numpy.float64(即浮点)。所以data是一个 float 组。在 im = Image.fromarray(data[0], 'RGB') 行中,您已明确指定模式为 'RGB',这意味着 8 位整数(请参阅 Modes 文档),因此 fromarray 将参数 data[0] 解释为 8 位整数的数组。显然它不会尝试转换输入数组;它只是假设数组中的基础数据存储为 8 位整数。由于 data[0] 实际上包含浮点值,因此结果不正确。

如果您使用 im = Image.fromarray(np.dot(data[0], [0.299, 0.587, 0.114])),您尚未明确指定模式,因此,fromarray 使用自己的代码来确定模式,在本例中为 'F'(32 位浮点)。因此它可以正确转换您的数据。例如,如果您将模式指定为 'L'(表示 8 位黑白)(即 im = Image.fromarray(np.dot(data[0], [0.299, 0.587, 0.114]), 'L')),调用会成功,但图像数据会再次出现不正确,因为 fromarray 会将包含浮点值的内存解释为包含 8 位整数像素。

可能最简单的解决方法是将 data 创建为 8 位无符号整数数组:

data = np.zeros((129, 326, 490, 3), dtype=np.uint8)

关于python - 将 PIL 图像保存到 4D Numpy 数组时显示的静态图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54121535/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com