【问题标题】:Pixel Loading and Evaluating with PIL使用 PIL 进行像素加载和评估
【发布时间】:2011-10-02 11:07:26
【问题描述】:

我想创建一个程序来加载图像中每个像素的 RGB 值并将它们保存在某种列表/字典/元组中,然后当我输入一个值时,它会告诉我图像中有多少像素那个值。到目前为止,我已经通读了整个 PIL 文档,试图找到一种可以满足我需求的方法,并且我尝试了其他几种方法,例如 .getpixel() 或 .load() 函数,但是很难保存并评估每个像素的信息。

【问题讨论】:

    标签: python python-imaging-library pixel


    【解决方案1】:

    首先,您需要将图像转换为“RGB”模式,以便始终获得像素的 (R, G, B) 元组,即使对于灰度/单色图像也是如此。

    image = image.convert("RGB")
    

    然后,遍历 getdata() 以构建您的直方图。

    colors = {}
    
    for color in image.getdata():
        colors[color] = colors.get(color, 0) + 1
    

    然后,您可以使用get() 来检索给定颜色的像素数

    print colors.get((255, 255, 255), 0)  # No. of white pixels
    

    【讨论】:

      【解决方案2】:

      PIL 1.1.5 版中的新功能是 getcolors() 方法,它应该完全符合您的要求。 PIL web 文档中的文档如下:

      获取颜色

      im.getcolors() => (计数,颜色)元组列表或无

      im.getcolors(maxcolors) => (计数,颜色)元组列表或无

      (1.1.5 中的新功能)返回(计数,颜色)元组的未排序列表, 其中计数是相应颜色出现的次数 在图片中。

      如果超过 maxcolors 值,该方法将停止计数并 返回无。默认的 maxcolors 值是 256。为了确保你得到 图像中的所有颜色,您可以传入 size[0]*size[1] (但请确保 在对大图像执行此操作之前,您有很多内存。

      【讨论】:

        【解决方案3】:

        .load() 是要走的路。它的工作效率非常高,并且可以快速获得许多像素。

        width,height=image.size
        px=image.load()
        
        col={}
        
        for y in range(height):
            for x in range(width):
                c=px[x,y]
                col[c]=col.get(c,0)+1
        
        # `col` will look like this: {(r,g,b):n,...}
        

        【讨论】:

        • image.size 是一个属性,而不是一个方法。不需要括号。
        • @PetrViktorin:好的。我没有对此进行测试。
        【解决方案4】:

        我认为.getpixel() 正是您所需要的——如果您要进行大量查找并且需要速度,那么对每个图像循环一次,创建一个坐标字典,在其中找到每种颜色。让它看起来像这样:

        {
            (128,128,4): [(1,1), (1,2)],
            (128,130,6): [(1,3)],
            ...
        }
        

        当然,如果它真的只是您需要的计数(那么您正在构建直方图?),那么只需在每个字典条目中存储一个整数,而不是整个点列表。

        如果只有 .histogram() 方法按特定颜色分解其结果 - 但看起来它单独返回每个通道,而不考虑各种颜色分量一起出现的组合。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-05-19
          • 2017-05-13
          • 1970-01-01
          • 1970-01-01
          • 2012-08-31
          • 1970-01-01
          相关资源
          最近更新 更多