2014-12-09 2 views
2

Я делаю некоторый анализ изображений, и у меня есть генератор, который дает мне все пиксели изображения:Частотный анализ значений, полученных с помощью генератора

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 
} 

Я нашел нас eful options в this question, но все они работают со списком, и я не думаю, что создание списка из моего генератора - хорошая идея - оно может содержать миллионов элементов.

Я поэтому ищу способ сделать это, сохраняя при этом преимущества генератора. Я обработаю много изображений и не хочу слишком сильно загружать ресурсы.

+0

в defaultdict и сосчитать, как вы идете? –

+2

collections.counter снова поражает. У этого вопроса определенно есть как минимум дюжина дубликатов. –

+0

@OlehPrypin будет коллекций.Конвертер использует его как генератор? – MightyPork

ответ

0

Использование счетчика из «коллекций». Он работает с любыми итерабельными, а не только списками.

from collections import Counter 

pixels = pixels_g(img) 
c = Counter(pixels) 

print c[4] 

Если вам необходимо повторно использовать содержимое, например генератора "пикселей, после запуска через счетчик, используйте«тройник»от itertools:

from collections import Counter 
from itertools import tee 

(pixels, hist) = tee(pixels_g(img)) 
c = Counter(pixels) 
# can use hist for something else 
+0

, которые будут потреблять генератор –

+0

Работает, за исключением того, что я не получаю нули для отсутствующих значений. 'dict.get (num, 0)' может иметь дело с этим, я думаю ... но это хак – MightyPork

+0

@PadraicCunningham, что вы имеете в виду, потребляете? – MightyPork

Смежные вопросы