2017-02-07 10 views
1

破損した画像を保存するために引き起こしている画像のピクセルを操作することにより、私は問題を抱えていて破損した画像は、私はPILを使って画像を開き、numpyのに変換し、だから... ... PIL

を保存されています配列:

image = Image.open("myimage.png") 
np_image = np.asarray(image) 

その後、私は[channel][x][y][x][y][channel]から、それを変換するために、イメージをトランスポーズ:

pixels = np.transpose(np_image, (2, 0, 1)) 

私は当時0にこのイメージを転置した場合、この配列からPIL画像を作成し、画像を保存します。

image1 = np.transpose(pixels, (1, 2, 0)) 
image2 = Image.fromarray(image1, 'RGB') 
image2.save('image2.png') 

そして、保存された画像は、「myimage.png」と同じです。もし代わりに上記のコードの

しかし、私は、最初の画像の配列内の要素にpixelsを割り当てる:

images = np.zeros([10, 3, 50, 50]) # The images are 50x50 with 3 channels 
images[0] = pixels 
image3 = np.transpose(images[0], (1, 2, 0)) 
image4 = Image.fromarray(image3, 'RGB') 
image4.save('image4.png') 

そして「image4.png」が破損しています。

enter image description here

「myimage.png」のに対し、実際にある:次のようにそれが表示されます

enter image description here

私は、画像を保存した場合、なぜそれは私が直接pixelsを転置されたときに、画像保存された値は期待どおりですが、配列imagesの最初の要素にpixelsを設定してこのイメージを転置すると、保存されたイメージは破損していますか?

ありがとうございます!

+0

ああ、小さなミスがあった:私は今np.array 'からそれを変更しました([10、3、50、50])を 'np.zeros([10、3、50、50])'に変更します。しかし、私が抱えていた問題はまだ同じです... – Karnivaurus

答えて

2

numpy.zerosによって作成されたデフォルトのデータ・タイプはそう

images = np.zeros([10, 3, 50, 50]) 

が浮動小数点配列を作成し、浮動小数点です。次いで、割り当てにpixels

images[0] = pixels 

値がそうimage3が浮動小数点配列であり、imagesに格納するために、浮動小数点にキャストされます。これは、対応するイメージが保存されるときにPNGファイルに格納される値に影響します。浮動小数点配列を与えられたときにPIL/Pillowが従う規則はわかりませんが、ここでは望ましい動作ではないようです。この問題を解決するには

np_imageと同じデータ型を使用してimagesを作成します(ほとんどの場合、これはnumpy.uint8です):

images = np.zeros([10, 3, 50, 50], dtype=np_image.dtype) 
+0

これはスポットライトであり、受け入れられる回答でなければなりません。 –

関連する問題