我正在使用Python来计算图像中像素颜色的频率。 Python Imaging Library可以将图像转换为RGB值列表,从那里我可以轻松地计算重复项,最后得到像素值字典(如字符串)和频率,如下所示:
{
"255-255-255": 450,
"255-254-254": 345,
"249-250-255": 184,
"124-130-200": 3,
} [etc etc]
(基本上它是直方图。)
对于大图像,我然后将颜色量化为N的倍数,那么我可能会:
[
("255-255-255", 450),
("255-255-255", 345),
("250-250-255", 184),
("125-130-200", 3),
] [etc etc]
这会留下许多重复的“键”(因为我们有重复项而存储为元组)。我现在需要压缩,添加所有重复的值。到目前为止,我有:
c = 0
while c < len(vals) - 1:
if vals[c][0] == vals[c+1][0]:
vals[c][1] += vals[c+1][1]
vals.pop(c+1)
else:
c += 1
return vals
它运行正常,但是列表推导必须有一种方法吗?还是其他一些更有效的方式?我意识到PIL可能会这样做,但我想在学习图像如何工作的同时手工完成。谢谢!
答案 0 :(得分:1)
试试这个:
l = [("255-255-255", 450),
("255-255-255", 345),
("250-250-255", 184),
("125-130-200", 3)]
from collections import defaultdict
D = defaultdict(int)
for k,v in l:
D[k] += v
print D # display the dict.
>>>
defaultdict(<type 'int'>, {'125-130-200': 3, '250-250-255': 184, '255-255-255': 795})