【问题标题】:How to Get an Average Pixel Value of a Gray Scale Image in Python Using PIL\Numpy?如何使用 PIL\Numpy 在 Python 中获取灰度图像的平均像素值?
【发布时间】:2016-06-05 19:14:18
【问题描述】:

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

【问题讨论】:

  • 你得到图像的大小,遍历每个像素,将它们的值相加,然后除以......但我不知道你为什么需要为了“代表每个使用单个值的单个图像”,如果两个图像碰巧具有相同的平均值,那么您就注定要失败。你能提供更多关于你的问题的背景吗?可能有更好的方法。
  • 是的,gill 这么说。假设你有 256 个可能的平均值,你会遇到超过 256 个图像的麻烦,因为至少有两个具有相同的平均值。而且您已经可以预料到更少图像的碰撞......

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


【解决方案1】:

这可以使用 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】:

    也许是最短的答案:

    from PIL import Image
    
    im = Image.open(...)
    im.thumbnail((1, 1))
    avg_color = im.getpixel(0, 0)
    

    【讨论】:

    • 哇!这可能是最好的答案。谢谢你:)
    • 注意:如果您要获取计划稍后使用的图像的统计信息,则需要在使用 thumbnail 方法之前创建原始图像的深层副本。否则,您将无法使用 1 x 1 像素版本。
    【解决方案3】:

    如果你想做这样的事情,你应该考虑使用scikit-image 而不是 raw 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))
    

    【讨论】:

    • Waaaay 比下面的 PIL 解决方案快
    【解决方案4】:

    该解决方案比 cmets 和 answers 中提供的解决方案要简单得多——即,无需对元组进行计算,也无需使用嵌套循环来迭代单元格值。

    具体来说,如果您有一个灰度图像,那么您有一个二维数组,其中数组单元填充了从 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]])
    

    这一行代码会做你想做的——计算平均值两次,数组中的每个轴一次(不需要为第二次调用 mean 指定一个轴,因为返回第一次调用的值只是一个一维数组

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

    【讨论】:

      猜你喜欢
      • 2023-03-07
      • 2014-11-29
      • 2015-06-08
      • 1970-01-01
      • 2021-03-04
      • 1970-01-01
      • 2023-03-12
      • 2017-07-21
      • 2015-07-11
      相关资源
      最近更新 更多