gpt4 book ai didi

Python Image.fromarray() 不接受我从列表构建的 ndarray 输入

转载 作者:太空宇宙 更新时间:2023-11-04 00:57:32 32 4
gpt4 key购买 nike

我正在尝试可视化一个包含 2048280 个整数的列表,这些整数要么是 1,要么是 0。有一个函数可以从 (width=1515 height=1352) 图像文件中输出这个列表。功能

test_results = [(numpy.argmax(SomeFunctionReturningAnArrayForEachGivenPixel))
for y in xrange(1352) for x in range(1532)]

返回一个大小为 2058280 (=1515x1352) 的数组 = 正如预期的那样。对于每个 y,返回 1/0 的 1532 个值并存储在数组中。

现在,当返回这个“test_results”数组时,我想将它保存为图像。所以我 np.reshape() 数组大小为 (1352,1515,1)。一切皆好。从逻辑上讲,我应该将此列表保存为灰度图像。我将 ndarray 数据类型更改为“unit8”并将像素值乘以 127 或 255。

但无论我做什么,Image.fromarray() 函数总是提示“它无法处理此数据类型”或“维度太多”,或者只是给出错误。当我将其调试到图像函数中时,图像库似乎无法检索数组的“步幅”!

网上所有的例子都是简单地将列表 reshape 为数组,然后将它们保存为图像!我的 list 有什么问题吗?

我已经尝试过各种模式('RGB'、'L'、'1')。我还将数组的数据类型更改为 uint8、int8、np.uint8()、uint32..

            result=self.evaluate(test_data,box) #returns the array
re_array= np.asarray(result,dtype='uint8')
res2 = np.reshape(reray,(1352,1515,1))
res3 =(res2*255)

i = Image.fromarray(res3,'1') ## Raises the exception
i.save('me.png')

最佳答案

对于灰度图像,不要将微不足道的三维添加到数组中。将其保留为二维数组:res2 = np.reshape(reray, (1352, 1515))(假设 reray 是一维数组)。

这是一个对我有用的简单示例。 data 是一个二维数组,类型为 np.uint8,包含 0 和 1:

In [29]: data
Out[29]:
array([[0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1],
[0, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0],
[1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0],
[0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1],
[1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 0, 0],
[0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0],
[1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1],
[1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0],
[0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0],
[1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0],
[1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1],
[0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 0]], dtype=uint8)

使用 'L' 模式从 255*data 创建图像,并将其保存为 PNG 文件:

In [30]: img = Image.fromarray(255*data, mode='L')

In [31]: img.save('foo.png')

当我尝试使用 mode='1' 创建图像时,我无法获得正确的 PNG 文件。 Pillow 在 numpy 数组和位深度为 1 的图像之间移动时存在一些已知问题。

另一种选择是使用 numpngw . (我是作者 numpngw。)它允许您将数据保存到位深度为 1 的 PNG 文件:

In [40]: import numpngw

In [41]: numpngw.write_png('foo.png', data, bitdepth=1)

关于Python Image.fromarray() 不接受我从列表构建的 ndarray 输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34421336/

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