我想创建一个程序,加载图像中每个像素的RGB值,并将它们保存在某种列表/字典/元组中。当我输入一个值时,它会告诉我图像中有多少像素具有该值。到目前为止,我已经阅读了整个PIL文档,试图找到一个适合我的需求的方法,并尝试了几种其他方法,例如.getpixel()或.load()函数,但很难保存和评估每个像素的信息。
我想创建一个程序,加载图像中每个像素的RGB值,并将它们保存在某种列表/字典/元组中。当我输入一个值时,它会告诉我图像中有多少像素具有该值。到目前为止,我已经阅读了整个PIL文档,试图找到一个适合我的需求的方法,并尝试了几种其他方法,例如.getpixel()或.load()函数,但很难保存和评估每个像素的信息。
首先,您需要将图像转换为“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
getcolors()
,该方法能够准确地完成您要求的操作。以下是来自PIL网站文档的说明:
getcolors
im.getcolors() => 包含(计数,颜色)元组或None的列表
im.getcolors(maxcolors) => 包含(计数,颜色)元组或None的列表
(从1.1.5版本开始)返回未排序的(计数,颜色)元组列表,其中计数是对应颜色在图像中出现的次数。
如果超过maxcolors值,则该方法停止计数并返回None。默认的maxcolors值为256。为确保获取图像中的所有颜色,可以传递size [0] * size [1](但在处理大型图像之前,请确保有足够的内存)。
.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,...}
.getpixel()
正是你需要的东西——如果你将要做很多查找并且需要速度,那么遍历每个图像一次,创建一个字典,记录每种颜色被发现的坐标。让它看起来像这样:{
(128,128,4): [(1,1), (1,2)],
(128,130,6): [(1,3)],
...
}
当然,如果你只需要计数(比如说你在构建直方图),那么就可以在每个字典条目中存储一个整数而不是整个点列表。
如果只有.histogram()
方法能够将其结果按特定颜色分解 - 但看起来它会单独返回每个通道,而不考虑各种颜色组件共同出现的组合。
image.size
是一个属性,而不是一个方法。不需要使用括号。 - Petr Viktorin