有没有办法将两个2D numpy数组保存为一个普通的ppm图像?

问题描述:

我正在寻找一种方法来将两个二维numpy阵列保存(有效的话,如果可能的话)成一个普通的ppm图像。 我认为标准(原始)和普通ppm图像之间的唯一区别是后者的限制线长度为70个字符。有没有办法将两个2D numpy数组保存为一个普通的ppm图像?

我能想到的唯一方法是保存每个阵列以分离颜色通道。先将第一个数组表示为红色,将第二个表示为绿色,并将蓝色保留为0?虽然不确定是否有意义...

理想情况下,ppm文件将由'人类可读'(不是数据缓冲区)。 我知道SciPy的可以将它保存为原料PPM(但不是人类可读)

任何想法表示欢迎

+0

你说你有两个二维数组,你想“一个普通的PPM图像”。你的意思是一个包含两个图像的ppm *文件*,还是你真的想要将这两个数组合并成一个图像? –

+0

一个普通ppm文件来表示来自两个数组的数据。是的,我应该更具体。说R通道是第一阵列G通道的第二阵列和B设置为常量?不太确定这是否会起作用这是我问 – ad1v7

+0

的问题还请注意,根据[PPM格式的此描述](http://netpbm.sourceforge.net/doc/ppm.html),一个* plain * PPM文件(带有“幻数P3”而不是P6)只能包含一个图像。 –

平原PPM格式是如此简单,它可能需要你只有几分钟的时间来编写代码创建一个。如果您想使用现有的库,如果您还安装freeimage后端,则可以使用imageio。然后你可以做如下的事情。

假设ab是两个阵列。

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阵列,并复制和ab进去。

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