2016-12-20 12 views
1

イメージをピクセルデータとしてnumpy配列(subjectImage)にロードしました。コードの次の行が正常に戻って画像にnumpyのアレイを復元し、それを表示する:numpy配列で保持されたスケーリングイメージは元に戻すことができません

subjectImagePath = 'pathToFile/cat.0.jpg'   
subjectImage = misc.imresize(misc.imread(subjectImagePath), (224,224,3)) 
img = Image.fromarray(subjectImage, 'RGB') 
img.show() 

iは0と1の間の画像の画素値をスケーリングする場合は、その後、私は戻って画像を復元することができません元の形に戻します。 (それは雑音の束を表示する)

subjectImage = subjectImage/255 
subjectImage = subjectImage*255 
img = Image.fromarray(subjectImage, 'RGB') 
img.show() 

Numpyは配列が同じであることを私に伝えます。

orig = subjectImage 
subjectImage = subjectImage/255 
print(np.array_equal(orig, subjectImage*255)) # => Prints True 

これはおそらく原因が考えられますか?どんな助けも素晴らしいだろう!使用

図書館:浮動小数点表現とDTYPEの

import numpy as np 
from PIL import Image 
from scipy import misc 
+1

計算のさまざまな段階で 'dtype'をチェックしてください。 – hpaulj

答えて

1

問題は、255の乗算や除算後の配列は、浮動小数点配列になっていることである:

>>> a = misc.imread(path) 
>>> a.dtype 
dtype('uint8') 
>>> b = a/255 
>>> b = b * 255 
>>> b.dtype 
dtype('float64') 

私の推測img.show()関数は、浮動小数点を表示する方法を知らないということです数字。浮動小数点数をuint8などと解釈して何らかの形で表示しようとしている可能性があります。残念ながら、のimg.show()については、どのように動作するかはわかりません。

scipyのダウンロードのmiscモジュールが正常に動作している、しかし、imshow独自のを持っています関連ノートで

>>> misc.imshow(b) 

をあなたは同時にscipy.miscPIL/pillowの両方を使用して考えている場合、いくつかのがあるようです彼らが配列を扱う方法の違い。たとえば、this質問を参照してください。

+0

上位ビットがオフになっているようです。 numpy配列をunsigned intにキャストすると、問題が修正されます。ありがとう! –

1

興味深い例...次の例を調べます。不等式がどこにあるかを見るために配列を印刷することができます。以下は、結果と比較を単純化する。

>>> a = np.arange(5*5*3, dtype=np.int64) 
>>> b = a/(5*5) 
>>> c = b*(5*5) 
>>> d = np.around(b*(5*5)) 
>>> a[a!=c] 
array([ 7, 14, 28, 29, 55, 56, 57, 58]) 
>>> a[a!=d] 
array([], dtype=int64) 
+0

私はこれが問題ではないと思います。 OPの配列が等しいかどうかをチェックします... 'show()'に問題がある可能性が高くなります。 – Praveen

+0

@Praveenこれはテストが示しているように、曖昧さを説明する不等式があることを示しています。おそらくshow()は適切な変換を保証します。 – NaN

関連する問題