答案 0 :(得分:10)
如果你想做这样的事情,你应该考虑使用scikit-image
代替原始PIL或枕头。
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))
答案 1 :(得分: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 += im_grey.getpixel((i,j))[0]
mean = total / (width * height)
print(mean)
答案 2 :(得分:1)
解决方案比评论和答案中提供的解决方案简单得多 - 即,不对元组进行计算,也不需要嵌套循环来迭代单元格值。
具体来说,如果你有一个灰度图像,那么你就有了一个二维数组,其中数组单元格的标量值从0到1填充。
相反,彩色图像是2D NumPy数组,其中 rgb元组位于每个单元格中。换句话说:灰度图像的NumPy数组表示是一个二维数组,其单元格的浮点值介于0(黑色)和1(白色)之间
鉴于此,您可以通过计算图像阵列两个轴的平均值来计算平均像素值,如下所示:
>>> 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]])
这一行代码将按您的意愿执行 - 计算平均值两次,对阵列中的每个轴计算一次(无需为第二次调用意味着指定一个轴,因为返回第一次调用的值只是一维数组
>>> img.mean(axis=0).mean()
0.50000646872609511
0.5的值似乎是正确的,因为数组值是通过调用NP.random.rand生成的,该值返回在半开区间[0,1]上从均匀分布中采样的值
>>> import matplotlib.pyplot as MPL
>>> MPL.imshow(img, cmap=MPL.cm.gray, interpolation='nearest')
>>> MPL.show()
答案 3 :(得分:1)
也许是最短的答案:
EnableCors