2017-10-28 215 views
0

我正在尋找一種方法來將兩個二維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)只能包含一個圖像。 –

回答

1

平原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 
相關問題