numpy和pil重塑数组
把图片从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 个回答
嗯,答案是有效的,我可以输入它们……好吧。
其实我并不是在用 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]
a.T
能满足你的需求吗?
我假设你是用numpy的asarray
函数创建了你的数组。
import Image, numpy
im = Image.open('test.png')
a = numpy.asarray(im)
R,G,B,A = a.T
这样做会给你4个独立的二维数组,每个数组对应一个波段。