2016-02-23 82 views
5

私はグレースケールの画像がほとんどなく、画像全体の平均ピクセル値を計算することを考えました。その結果、個々の画像を単一の値で表すことができます。PIL Numpyを使ってPythonでグレースケール画像の平均ピクセル値を取得するには?

enter image description here

+3

あなたは画像の大きさ、すべてのピクセルを超えるループは、それらの値を合計取得し、分割...しかし、私はなぜ知りませんあなたはそのような問題に直面する必要がありますe値 "となり、2つの画像が同じ平均値をとった場合、あなたはただの運命にあります。あなたはあなたの問題のいくつかの文脈を与えることができますか?おそらくもっと良い方法があります。 – gil

+0

ええ、gillはそれを言う。平均値に256の値があると仮定すると、少なくとも2つの平均値が同じであるため、256以上の画像で問題が発生します。そして、あなたはすでにずっと少ない画像のために衝突を期待することができます.... –

答えて

8

あなたはこのようなものをしたい場合は、代わりに生PILや枕のscikit-imageを使用して検討すべきです。 SciKit Imageはnumpy配列を画像に使用するため、すべてのnumpyメソッドが機能します。

from skimage import io 
import numpy as np 

image = io.imread('http://i.stack.imgur.com/Y8UeF.jpg') 

print(np.mean(image)) 

あなたが01 betwenn値を取得するためにフロートするすべての画像を変換することがあります:

from skimage import io, img_as_float 
import numpy as np 

image = io.imread('http://i.stack.imgur.com/Y8UeF.jpg') 
image = img_as_float(image) 
print(np.mean(image)) 
2

これは、ピクセルをループ全ての画素値を蓄積して分割することによりPILを使用して行うことができますピクセル数(つまり幅*高さ)で表します。

from PIL import Image 

im = Image.open('theimagefile.jpg') 
im_grey = im.convert('LA') # convert to grayscale 
width,height = im.size 

total=0 
for i in range(0,width): 
    for j in range(0,height): 
     total += img.getpixel((i,j))[0] 

mean = total/(width * height) 
1

解決策はコメントと回答で提供されているものよりはるかに簡単です。タプル上での計算と、セル値を反復するネストされたループの必要はありません。

具体的には、あなたは、グレースケール画像を持っている場合、あなたはアレイセルは対照的に0から1

にスカラー値で充填された2次元配列を有する、カラー画像における2次元numpyのアレイであります各セルにはrgbタプルが置かれています。

は、別の言い方を:グレースケール画像のnumpyの配列表現は、その細胞が浮動小数点値を有する0(黒)から1(白)

の間にこれを与えられた2次元配列であり、あなたが計算することができ(配列の各軸のために1回、2回の平均を計算する - コードのこの一行は、あなたがやりたいだろう

>>> import numpy as NP 
>>> img = NP.random.rand(100, 100) 
>>> img[:5, :5] 
    array([[ 0.824, 0.864, 0.731, 0.57 , 0.127], 
      [ 0.307, 0.524, 0.637, 0.134, 0.877], 
      [ 0.343, 0.789, 0.758, 0.059, 0.374], 
      [ 0.693, 0.991, 0.458, 0.374, 0.738], 
      [ 0.237, 0.226, 0.869, 0.952, 0.948]]) 

:そうのように、画像アレイの両方の軸に沿って平均値を算出することで、画素値の平均2番目の呼び出しの軸を指定する必要はありません平均最初の呼び出しからの戻り値は、配列値が一様分布からサンプリングされた値を返すNP.random.randを呼び出すことによって生成されたので、0.5の値が正しいと思われるだけの1Dアレイ

>>> img.mean(axis=0).mean() 

    0.50000646872609511 

あるため半開区間[0、1)

>>> import matplotlib.pyplot as MPL 
>>> MPL.imshow(img, cmap=MPL.cm.gray, interpolation='nearest') 
>>> MPL.show() 

enter image description here

関連する問題