numpy和pil重塑数组

4 投票
2 回答
1953 浏览
提问于 2025-04-16 12:02

把图片从PIL格式转换成numpy数组后,得到的数组看起来像这样:

a = array([ [[r,g,b],[r,g,b].....[r,g,b],[r,g,b]]  ,  [[r,g,b],[r,g,b.....]] , int8)

这些数组是RGB值的三元组,排列在行里,比如:

a[0] = [[r,g,b],[r,g,b].....[r,g,b],[r,g,b]] = first row

有没有什么简单的方法可以把这样的三元组numpy数组快速转换回去,尤其是从numpy转换回PIL格式?

a = [[rrrr],[rrrrr],[rrrrr],.... [bbbbb],[bbbbbb],[bbbbbb]...,[ggggg],[ggg],[ggg]]

或者

像这样:

a=[[rrr],[rrrrr],[....    ...]] **or** aa = [rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr..]

b=[[bbb],[bbbbb],[....    ...]]**or** bb = [bbbbbbbbbbbbbbbbbbbbbbbbbb..]

c=[[ggg],[ggggg],[....      .]] **or** cc = [ggggggggggggggggggggggggg..]

我遇到的问题是,我有一种格式像aa bb cc,并且知道图片的大小是640x480,怎么能快速把它转换成下面这样的PIL格式呢?

a = array([ [[r,g,b],[r,g,b].....[r,g,b],[r,g,b]]  ,  [[r,g,b],[r,g,b.....]] , int8)

2 个回答

0

嗯,答案是有效的,我可以输入它们……好吧。

其实我并不是在用 asarray,因为我在做相反的事情(asarray 是用来创建三元组的),我手上的数据是以通道的形式存在的。也就是说,有红色、绿色和蓝色;我的数据看起来像这样:

a = [ r,r,r,r,r,r,r,r,r ...]

这里的 r 是一维数组中的所有红色值,实际上这个通道图像是红色的。

b 是所有蓝色,c 是所有绿色。

所以我现在的数据格式并不是三元组。我想知道有没有什么快速的方法可以把这些数据组合成三元组。实际上,PIL(Python Imaging Library)使用的是数组中的数组,我在看 PIL,但如果 pygame 或其他什么工具能让我从通道中提取数据,那也可以,PIL 不是必须的;不过似乎所有的格式都使用三元组,而我的数据并不包含这种格式。因为我知道 Numpy 是最重要的数组库,我想知道它能否进行这样的数组操作。

真遗憾,我不能在这里画图来解释我想要的东西,我有 a、b 和 c。

a = [123123123132]

b = [989898389398]

c = [343434343434]

d[a,b,c] = a[] + b[] + c[] >>> 这不是 Python 代码,这是我脑中的想法。

所以 d 变成了 d[[a,b,c],[a,b,c],[a,b,c], ...]

而 d[0] = [1,9,3]

4

a.T能满足你的需求吗?

我假设你是用numpy的asarray函数创建了你的数组。

import Image, numpy
im = Image.open('test.png')
a = numpy.asarray(im)
R,G,B,A = a.T

这样做会给你4个独立的二维数组,每个数组对应一个波段。

撰写回答