2017-02-22 2 views
-1

私はpythonでnumpyの配列から単一チャンネルのpng画像を書きたいですか?Python:numpy配列から単一のチャンネルpngファイルを書くには?

A = randi(100,100,255) 
imwrite(uint8(A),'myFilename.png','png'); 

私はfrom PIL import ImageImage.fromarray()を使用してexampelsを見たが、彼らは、JPEGと3チャンネルのPNGファイルのみが表示されたためのものであるだろうMATLABで ...

私はすでに、私は意志、OpenCVのを使用して解決策を見つけましたここに投稿してください。うまくいけば、それは短くなります他の誰かの検索...ここ

+1

https://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.misc.imsave.html – MaxNoe

+0

その解決策はrgb用ですが、私はシングルチャンネルが必要です – mcExchange

+0

あなたはそれに1つのチャンネルを渡すと、1つのチャンネルを書き込みます。最初の例を参照してください。これはbwグラデーションです。 – MaxNoe

答えて

0

あなたは、単純なイメージ操作のためのOpenCVを利用しない場合がありますOpenCVの/ CV2

import cv2 
myImg = np.random.randint(255, size=(200, 400)) # create a random image 
cv2.imwrite('myImage.png',myImg) 
0

を使用したソリューションです。提案通り、PILを使用してください:

im = Image.fromarray(arr) 
im.save("output.png", "PNG") 

これを試しましたか?ここで何が失敗して、これがJPEGのみであると結論づけましたか?

+0

これは3チャンネルのpndを保存しますが、1チャンネルのpngファイル – mcExchange

+0

が必要です。次に、uint8タイプの配列が必要です。 im = Image.fromarray(arr.astype(numpy.uint8)) – Pearley

1

PILのImage.fromarray()は自動的にあなたが使用できる8ビットグレースケール画像のために、たとえば、渡されたnumpyの配列のfrom the datatypeを使用するmodeを決定します。

あなたの配列は、互換性のあるデータ型を使用している場合しかしこれはのみ動作
from PIL import Image 
import numpy as np 

data = np.random.randint(256, size=(100, 100), dtype=np.uint8) 
img = Image.fromarray(data) # uses mode='L' 

単に、data = np.random.randint(256, size=(100, 100))を使用して、PILが処理できないint64配列(typestr <i8)を使用することができます。

また、別のモードを指定することもできます。 RGB画像として32ビットアレイを解釈する:

data = np.random.randint(2**32, size=(100, 100), dtype=np.uint32) 
img = Image.fromarray(data, mode='RGB') 

を内部Image.fromarray()は、単に正しいモードとサイズを推測しようとした後、Image.frombuffer()を呼び出します。

画像は、その後、任意の形式として保存することができPILcan handle例:img.save('filename.png')

関連する問題