我想创建一个程序,加载图像中每个像素的RGB值,并将它们保存在某种列表/字典/元组中,然后当我输入一个值时,它会告诉我图像中有多少像素那个价值。到目前为止,我已经阅读了整个PIL文档,试图找到一个可以满足我需求的方法,并且我已经尝试了几种其他方法,例如.getpixel()或.load()函数,但是很难保存并评估每个像素的信息。
答案 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()
方法按特定颜色打破了结果 - 但看起来它会单独返回每个通道,而不考虑各种颜色组件一起出现的组合。