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

Is there any way to save two 2D numpy arrays as one plain ppm image?

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

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

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

欢迎提出任何想法

纯 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 维数组,并将 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