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

3 投票
4 回答
2408 浏览
提问于 2025-04-17 03:31

我想写一个程序,能够读取一张图片中每个像素的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

撰写回答