2016-07-26 17 views
2

私は、画像ファイルを保存した後、すべての負の値は0です。これは、その結果負の値でPILの画像を保存する方法

from PIL import Image 
import numpy as np 

# generate random image for demo 
img_arr = np.random.random_integers(-1000,1000, size=[10,10]).astype(np.int32) 
print "original min {}, max: {}".format(img_arr.min(),img_arr.max()) 

# create PIL image 
img1 = Image.fromarray(img_arr) 
print "PIL min {}, max: {}".format(np.array(img1.getdata()).min(),np.array(img1.getdata()).max()) 

# save image 
img1.save("test_file.png", "PNG") 

# reload image 
img_file = Image.open("test_file.png") 
print "img_file min {}, max: {}".format(np.array(img_file.getdata()).min(),np.array(img_file.getdata()).max()) 

にクリップしている、しかし、PIL使用して負の値を持つ画像を保存しようとしています出力:

original min -983, max: 965 
PIL min -983, max: 965 
img_file min 0, max: 965 

どうすればこの画像を保存し、負の値を維持できますか?

+4

あなたが負の値で画像を保存することができれば、あなたがそれを開いたらどうなっていますか? (255,255,255)が白で(0,0,0)が黒の場合、(-1000、-1000、-1000)は何ですか?十四ネガホワイト? – Kevin

+0

イメージの色は、1つ以上の8ビット_unsigned_整数で構成されるピクセルで定義されているため、0..255の範囲外の値を持つコンポーネントを持つピクセルで作成する方法はありません。それらを維持するには、結果をこの範囲に拡大する必要があります。 PILは0..4095などのより大きな範囲をサポートしているため、データをより正確に保存できます。私はそれが正の浮動小数点値をサポートしていると思うが、それを試みたことはない。 – martineau

+0

ほとんどのブラウザでは0〜255しか許可されていませんが、一般的に画像にこの制限はありません。 –

答えて

2

PILに準拠した32ビット符号付き整数としてピクセルを保存するようなことがあり、イメージモード 'I'はPILでこれを処理することを意味します。だから、これは技術的な理由で意味がないと言っているのは間違いです。

PNG形式がこのモードをサポートしているとは思わない(モード 'I'でイメージを書き込むとエラーがスローされないにもかかわらず)。動作しているようです

img1.save("test_file.tif") 
それを変更する

(と正しいファイルを取得するか):ただし、「.TIF」の拡張子がいるようだ

original min -993, max: 990 
PIL min -993, max: 990 
img_file min -993, max: 990 
+0

ありがとう、これは動作します。ここでは、データ型とその範囲を説明する良いリンクがあります。 http://scikit-image.org/docs/dev/user_guide/data_types.html –

関連する問題