有没有办法将两个2D numpy数组保存为一个普通的ppm图像?
问题描述:
我正在寻找一种方法来将两个二维numpy阵列保存(有效的话,如果可能的话)成一个普通的ppm图像。 我认为标准(原始)和普通ppm图像之间的唯一区别是后者的限制线长度为70个字符。有没有办法将两个2D numpy数组保存为一个普通的ppm图像?
我能想到的唯一方法是保存每个阵列以分离颜色通道。先将第一个数组表示为红色,将第二个表示为绿色,并将蓝色保留为0?虽然不确定是否有意义...
理想情况下,ppm文件将由'人类可读'(不是数据缓冲区)。 我知道SciPy的可以将它保存为原料PPM(但不是人类可读)
任何想法表示欢迎
答
平原PPM格式是如此简单,它可能需要你只有几分钟的时间来编写代码创建一个。如果您想使用现有的库,如果您还安装freeimage
后端,则可以使用imageio
。然后你可以做如下的事情。
假设a
和b
是两个阵列。
In [100]: a
Out[100]:
array([[36, 19, 60, 73],
[ 2, 27, 13, 22],
[19, 50, 38, 18],
[47, 69, 55, 52]], dtype=uint8)
In [101]: b
Out[101]:
array([[221, 252, 236, 225],
[248, 254, 226, 248],
[221, 232, 216, 208],
[207, 243, 249, 231]], dtype=uint8)
创建3-d阵列,并复制和a
b
进去。
In [102]: data = np.zeros(a.shape + (3,), dtype=a.dtype)
In [103]: data[:,:,0] = a
In [104]: data[:,:,1] = b
使用imageio.imwrite
创建PPM文件。使用格式PPM-FI
来使用freeimage
后端,并设置flags=1
来创建一个普通的PPM文件(即ASCII,而不是原始的)。
In [105]: import imageio
In [106]: imageio.imwrite('data.ppm', data, format='PPM-FI', flags=1)
这里的文件:
In [107]: !cat data.ppm
P3
4 4
255
36 221 0 19 252 0 60 236 0 73 225 0 2 248 0
27 254 0 13 226 0 22 248 0 19 221 0 50 232 0
38 216 0 18 208 0 47 207 0 69 243 0 55 249 0
52 231 0
你说你有两个二维数组,你想“一个普通的PPM图像”。你的意思是一个包含两个图像的ppm *文件*,还是你真的想要将这两个数组合并成一个图像? –
一个普通ppm文件来表示来自两个数组的数据。是的,我应该更具体。说R通道是第一阵列G通道的第二阵列和B设置为常量?不太确定这是否会起作用这是我问 – ad1v7
的问题还请注意,根据[PPM格式的此描述](http://netpbm.sourceforge.net/doc/ppm.html),一个* plain * PPM文件(带有“幻数P3”而不是P6)只能包含一个图像。 –