このようなことをしたい場合は、生の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))
すべての画像をフロートに変換して、0
と1
の間の値を取得することができます。
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))
これは、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 += im_grey.getpixel((i,j))[0]
mean = total / (width * height)
print(mean)
ソリューションはコメントと回答で提供されるものよりもはるかに単純です。つまり、タプルに対する計算がなく、セル値を反復するためのネストされたループの必要もありません。
具体的には、グレースケールイメージがある場合、配列セルが0から1までのスカラー値で満たされた2D配列があります。
対照的に、カラー画像は2D NumPy配列で、各セルにrgb Tupleが配置されます。
別の言い方をすると:グレースケール画像のNumPy配列表現は、セルが0(黒)と1(白)の間の浮動小数点値を持つ2D配列です
この場合、次のように画像配列の両方の軸に沿って平均を計算することにより、平均ピクセル値を計算できます。
>>> 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]])
この1行のコードで必要な処理を実行できます。平均を2回計算します。1回は配列の各軸に対して1回です(meanへの2回目の呼び出しで軸を指定する必要はありません。最初の呼び出しからの戻り値は1D配列です
>>> img.mean(axis=0).mean()
0.50000646872609511
配列値はNP.random.Randを呼び出して生成されたため、値0.5は正しいように見えます。NP.random.Randは、ハーフオープン間隔[0、1)にわたって均一分布からサンプリングされた値を返します。
>>> import matplotlib.pyplot as MPL
>>> MPL.imshow(img, cmap=MPL.cm.gray, interpolation='nearest')
>>> MPL.show()
おそらく最も短い答え:
from PIL import Image
im = Image.open(...)
im.thumbnail((1, 1))
avg_color = im.getpixel(0, 0)