使用PIL进行像素加载和评估
我想写一个程序,能够读取一张图片中每个像素的RGB值,然后把这些值存到一个列表、字典或者元组里。接着,当我输入一个值的时候,它能告诉我这张图片中有多少个像素是这个值。目前为止,我已经看过了整个PIL的文档,想找一个合适的方法来实现这个功能。我还尝试了其他一些方法,比如使用.getpixel()或者.load()函数,但要保存和评估每个像素的信息真的很困难。
4 个回答
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
PIL在1.1.5版本中新增了一个方法叫做getcolors()
,这个方法正好可以满足你的需求。以下是PIL官网的相关说明:
getcolors
im.getcolors() => 返回一个包含(数量,颜色)元组的列表,或者返回None
im.getcolors(maxcolors) => 返回一个包含(数量,颜色)元组的列表,或者返回None
(在1.1.5版本中新增)这个方法会返回一个未排序的(数量,颜色)元组列表, 其中数量表示对应颜色在图像中出现的次数。
如果超过了maxcolors的值,方法就会停止计数,并返回None。默认的maxcolors值是256。如果你想确保获取到图像中的所有颜色,可以传入size[0]*size[1](但在处理大图像时,确保你有足够的内存再这么做)。
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