web-dev-qa-db-ja.com

Image.fromarrayは黒い画像を生成するだけです

Image.fromarrayを使用して、numpy行列をグレースケール画像として保存しようとしています。ランダム行列で動作するようですが、特定の行列では動作しません(円が表示されるはずです)。誰かが私が間違っていることを説明できますか?

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')
18
flawr

Image.fromarrayは、浮動小数点入力では不十分に定義されています。十分に文書化されていませんが、関数は入力が符号なし8ビット整数としてレイアウトされていると想定しています。

取得しようとしている出力を生成するには、255を掛けてuint8に変換します。

z = (z * 255).astype(np.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

問題はどこにも報告されていないようなので、githubで報告しました: https://github.com/python-pillow/Pillow/issues/2856

25
jakevdp