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

时间:2017-10-28 16:41:36

标签: python arrays numpy ppm

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

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

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

欢迎任何想法

1 个答案:

答案 0 :(得分:1)

纯PPM格式非常简单,只需几分钟即可编写代码来创建一个。如果您更愿意使用现有库,则可以使用imageio,如果您还安装了freeimage后端。然后你可以做类似以下的事情。

假设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)

创建一个三维数组,并将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