使用PIL进行像素加载和评估

时间:2011-10-02 11:07:26

标签: python python-imaging-library pixel

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

4 个答案:

答案 0 :(得分:5)

首先,您需要将图像转换为“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

答案 1 :(得分:3)

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

  

getcolors

     

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

     

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

     

(1.1.5中的新增内容)返回(计数,颜色)元组的未排序列表,   其中count是相应颜色出现的次数   在图像中。

     

如果超出maxcolors值,该方法将停止计数和   返回无。默认的maxcolors值为256.确保获得   在图像中的所有颜色,你可以传递大小[0] *大小[1](但请确保   在你拍摄巨幅照片之前,你有很多记忆。)

答案 2 :(得分:2)

.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,...}

答案 3 :(得分:1)

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

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

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

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