2017-12-19 6 views
1
import numpy as np 
import matplotlib.pyplot as plt 

files = ### 100 portrait photos 
imgs = [ plt.imread(f_i) for f_i in files ] # We read all file compositions into imgs 
data = np.array(imgs) # Turn everything into np.array format 
mean_imgs = np.mean(data, axis= 0) # Takes the mean of the entire data set 

plt.imshow(mean_imgs) # imgs_mean = array of floats 

結果:enter image description hereimshow()で浮動小数点配列を使用すると、なぜカラーノイズマップが得られますか?しかし、uint8を使用すると、私は必要な画像を取得できますか?

plt.imshow(mean_imgs.astype(np.uint8)) # Cast mean_imgs into type uint 

結果:enter image description here

これはとにかく私が)(すべての浮動小数点数を持つ配列を関数imshowの違いを理解しようとしています、コンピュータビジョンの質問の、おそらくもっとあるとuint8型の配列これら2つの操作の間にバックエンドで何が起こったのかを親切に説明することができますか?

写真の変数ミックスを無視してください。それらを異なるタイプの同じ変数と考えるだけです。

答えて

2

imshow documentation(強調鉱山):MxNx3とMxNx4 フロートアレイの各成分について

値が1.0に範囲0.0であるべきです。

タイプはuint8に変換するので、それは値が255

の範囲0であることを期待uint8であれば、あなたの値が1.0に0.0で明らかにされないあなたに正しい結果が得られます。

これは動作するはずです:

plt.imshow(mean_imgs/255) 
3

Matplotlibのimshowメソッドでは、浮動小数点配列の値が0.0から1.0の間であることが必要です。さもなければ、いくつかの切り捨てが起こります(overflowのように、1を超える場合を除きます)。実際には小数部分のみが使用され、ノイズが発生します。

あなたの山車がスケール0 ... 255上にある場合は、あなたがそれらをスケーリングすることで問題を回避することができますplt.imshow(X/255)

例:

X = np.add.outer(np.add.outer(np.arange(0, 50, 0.3), np.arange(0, 50, 0.1)), np.arange(0, 60, 20)) 
plt.imshow(X) 

noise

plt.imshow(X/255) # same as imshow(X.astype(np.uint8)) 

rgb

関連する問題