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

3

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

4个回答

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

3
版本1.1.5中的PIL新功能是方法getcolors(),该方法能够准确地完成您要求的操作。以下是来自PIL网站文档的说明:

getcolors

im.getcolors() => 包含(计数,颜色)元组或None的列表

im.getcolors(maxcolors) => 包含(计数,颜色)元组或None的列表

(从1.1.5版本开始)返回未排序的(计数,颜色)元组列表,其中计数是对应颜色在图像中出现的次数。

如果超过maxcolors值,则该方法停止计数并返回None。默认的maxcolors值为256。为确保获取图像中的所有颜色,可以传递size [0] * size [1](但在处理大型图像之前,请确保有足够的内存)。


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

1
image.size 是一个属性,而不是一个方法。不需要使用括号。 - Petr Viktorin
@PetrViktorin:好的,我没有测试过这个。 - Oleh Prypin

1
我认为.getpixel()正是你需要的东西——如果你将要做很多查找并且需要速度,那么遍历每个图像一次,创建一个字典,记录每种颜色被发现的坐标。让它看起来像这样:
{
    (128,128,4): [(1,1), (1,2)],
    (128,130,6): [(1,3)],
    ...
}

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接