如何使用PIL \ Numpy在Python中获取灰度图像的平均像素值?

时间:2016-02-23 19:16:19

标签: python python-2.7 numpy python-imaging-library

我的灰度图像很少,我想到计算总图像的平均像素值,这样我就可以使用单个值表示每个单独的图像。

enter image description here

4 个答案:

答案 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))

您可能希望将所有图片转换为浮动,以获得01之间的值:

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()

enter image description here

答案 3 :(得分:1)

也许是最短的答案:

EnableCors