2016-05-23 1 views
5

enter image description here均等配列ではなく、同じ視覚

Iは32x32x3画像を持っているが、例えばkerasでcifar10画像の一つと言います。 今、いくつかの操作をしたいとします。まず、私が正しいことをしていることを確認するために、私はイメージをコピーしようとしていました(それはやりたいことではありませんので、私は3ループを行わずにイメージをコピーする方法を教えてください。いくつかの値を操作する)。

from keras.datasets import cifar10 
import matplotlib.pyplot as plt 

(X_train, Y_train), (X_test, Y_test) = cifar10.load_data() 
im = numpy.reshape(X_train[0], (3, 32, 32)) 
im = im.transpose(1,2,0) 
imC = numpy.zeros((32,32,3)) 

for k in range(3): 
    for row in range(0,32): 
    for col in range(0,32): 
     imC[row][col][k] = im[row][col][k] 

今、私は、彼らが同じであれば、彼らはテストしている場合、実際に私が

if (im==imC).all(): 
    print "cool" 

をプリントアウトし、「クール」を参照してください。しかし、私はそれらを視覚化しようとすると、彼らは異なっている:

plt.imshow(imC) 
plt.show() 

plt.imshow(im) 
plt.show() 

何が起こっているのですか?

+3

どう違うのですか?たぶんこの質問にプロットを追加することができます –

+4

2つの配列の要素タイプは何ですか? (im.dtype、imC.dtype) –

+0

@ガレス、あなたは正しい方向に考えていると思う、(im.dtype、imC.dtype)=(uint8、float64) – user

答えて

4

Python CIFAR10データセットの画像には、タイプがnumpy.uint8のピクセル値があります。おそらくそれらはPNGファイルなどから読み込まれます。したがってX_train.dtype == numpy.uint8、したがってim.dtype == numpy.uint8です。

作成する配列のデフォルト要素タイプはnumpy.float64です。つまり、imC.dtype == numpy.uint8です。

matplotlib.pyplot.imshowは、要素タイプによって入力を別々に扱うことがあります。特に、要素タイプuint8m -by-n -by-3の配列を与えると、3色のチャネルのそれぞれについて、最も暗く平均255が得られます。 ;あなたがそれを与えるなら、すべての値が0(最も暗い)から1(最も明るい)の範囲にあることを望みます。そして、ドキュメントには、m -by-n -by-3の要素タイプfloat64の配列があります。その範囲外の値に何が起こるかについては何もしていません。

その範囲外の値がどうなるかを推測することになります。私はこのコードがおそらく何かをしていると思います:整数を255に掛けて、uint8として扱います。これは、0が0になり、1が255になることを意味します。

最後のステップでは、下位8ビット以外のすべてをスローすることを意味し、2が254、3が253、... 255が1になります。言い換えれば、imshowにピクセル値が0..255の範囲で浮動するイメージを与えることは間違いなく間違っていれば、それらの値は効果的に無効になり、0 - > 0,1 - > 255,2 - > 254、...、255-> 1である。

imCの各要素は数値的にimの要素と同じですが、これはあなたに起こります。 imCは、符号なし小整数配列ではなく浮動小数点型配列で、上で説明した処理を受け取り、期待した画像のほぼネガティブな写真が得られます。

+0

これまでのベストアンサー質問がありました! – user

+0

ありがとうございます。サービス喜んで! –

関連する問題