2017-11-14 10 views
2

Image.fromarrayを使用してnumpyマトリックスをグレースケール画像として保存しようとしています。それはランダムな行列上で動作するように見えますが、特定のもの(円が現れるべき場所)では動作しません。誰も私が間違っていることを説明することはできますか?Image.fromarrayは単に黒い画像を生成します

from PIL import Image 
import numpy as np 
radius = 0.5 
size = 10 
x,y = np.meshgrid(np.linspace(-1,1,size),np.linspace(-1,1,size)) 
f = np.vectorize(lambda x,y: (1.0 if x*x + y*y < radius*radius else 0.0)) 
z = f(x,y) 
print(z) 
zz = np.random.random((size,size)) 
img = Image.fromarray(zz,mode='L') #replace z with zz and it will just produce a black image 
img.save('my_pic.png') 
+0

これを255にスケーリングし、 'uint8/16' dtypesを使用する必要があります。 – Divakar

+0

しかし、 'zz'は0と1の間の値を持つ単なる行列ですが、うまくいくようですか? – flawr

+0

'zz'は動作していますが、' z'は動作していませんか? – Divakar

答えて

2

Image.fromarrayは不十分浮動小数点入力と定義されます。それは十分に文書化されていませんが、関数は入力が符号なし8ビット整数としてレイアウトされていることを前提としています。解釈するとき、ランダムな配列で動作するように思える理由は、というこの配列内のバイトです

z = (z * 255).astype(np.uint8) 

:あなたは、取得255を掛けるとuint8に変換しようとしている出力を生成するために

符号なし8ビット整数としても、ランダムに見えます。問題以来

np.random.seed(0) 
zz = np.random.rand(size, size) 
Image.fromarray(zz, mode='L').save('pic1.png') 

pic1.png

Image.fromarray((zz * 255).astype('uint8'), mode='L').save('pic2.png') 

pic2.png

:しかし、出力を使用すると、ランダムな入力に上記の変換を行うことによって確認することができます入力、同じランダムな配列ではありません

+0

あなたの説明と解決に感謝します! – flawr

関連する問題