我正在对图像进行一些分析,我有一个生成器可以为我提供图像中的所有像素:
def pixels_g(img):
w, h = img.shape
for y in range(0, h):
for x in range(0, w):
yield img[y][x]
如果转换为列表,则输出为
[0, 1, 2, 5, 240, 5, ... ]
现在我想为它获得“频率表”:
{
0: 0,
1: 5,
2: 10,
3: 0,
4: 0,
#snip
255: 7
}
我在this question中找到了一些有用的选项,但它们都与list一起使用,我认为从我的生成器创建列表不是一个好主意 - 它可以有数百万元素
因此,我正在寻找一种方法来做到这一点,同时保留发电机的好处。我将处理许多图像,并且不想过多地占用资源。
答案 0 :(得分:0)
使用来自"集合"的计数器。它适用于任何可迭代的,而不仅仅是列表。
from collections import Counter
pixels = pixels_g(img)
c = Counter(pixels)
print c[4]
如果您需要重复使用像素'的内容生成器实例在通过Counter运行后,使用&te;'来自itertools:
from collections import Counter
from itertools import tee
(pixels, hist) = tee(pixels_g(img))
c = Counter(pixels)
# can use hist for something else