2017-01-27 6 views
1

У меня есть набор уникальных цветов RGB в словаре в key: 'Color' и list каждого цвета RGB в целевом изображении.Python - вычислить частоту уникальных элементов

Я хочу:

  • итерации в списке цветов Target RGB
  • Проверьте, что элемент соответствует любому из цветов в key: 'Color'
  • Если он совпадает, я хочу, чтобы изменить key: frequency увеличить это один (+ = 1)

в конце концов я надеюсь добиться, чтобы обновить frequency['Frequency'] так что в конце процесса dict: Frequency Виль l содержит кучу пар (Color,Frequency). Затем я хочу сортировать от более низкой до более высокой частоты и печатать каждую пару RGB Color + количество появлений.

Вот мой код до сих пор:

from PIL import Image 

im = Image.open('test.png').convert('RGB') 
im2 = Image.open('test2.png').convert('RGB') 

unique_colors = set() 

def get_unique_colors(img): 
    for i in range(0,img.size[0]): 
     for j in range(0,img.size[1]): 
      r,g,b = img.getpixel((i,j)) 
      unique_colors.add((r,g,b)) 
    return(unique_colors) 

unique_colors = get_unique_colors(im) 

all_colors = [] 

def get_all_colors(img): 
    for i in range(0,img.size[0]): 
     for j in range(0,img.size[1]): 
      r,g,b = rgb_im.getpixel((i,j)) 
      all_colors.append((r,g,b)) 
    return(all_colors) 

all_colors = get_all_colors(im2) 

frequency = {'Color': list(unique_colors), 'Frequency': [0 for x in range(0,len(unique_colors))]} 

Я столкнулся много проблем с моим отсутствием способности манипулировать словари, это действительно целесообразно использовать словари для хранения таких данных в этом случае?

ответ

0

Я думаю, что ваше создание слова неверно. Вы можете иметь Dict (цвет, частоту) структуру, если вы создаете свой dict как следующее:

frequency = dict(zip(list(unique_colors), [0 for x in range(0,len(unique_colors))])) 

zip функция помещает два списка вместе, как ключ и значение пар. Если unique_colors={'red','green','blue'}, это будет создавать словарь, как:

frequency = {'red': 0, 'green': 0, 'blue': 0} 

После этого вы можете обновить словарь как:

frequency['red']+=1 

И ДИКТ становится {'red': 1, 'green': 0, 'blue': 0}

+0

Спасибо, это помогло. После этого я только должен был сделать: 'для е в all_colors: для г в unique_colors: если е == я: частота [е] + = 1 ' И чем каждый (R, G, В) Кортеж обновил счетчик. – EduGord

+0

Рад быть в состоянии помочь! – ilke444

0

Использование словарей это отличная идея, и получается стандартная lib сделала часть работы для вас с collections.Counter, которая учитывает то, что вы вкладываете в нее. Добавить itertools.product пробежать все местоположения пикселов и перемешайте, что в пользовательских пикселях итератор и вы получите

from PIL import Image 
import collections 
import itertools 

def iter_colors(img): 
    coordinates = itertools.product(range(img.size[0]), range(img.size[1])) 
    return map(img.getpixel, coordinates) 

im = Image.open('test.png').convert('RGB') 
im2 = Image.open('test2.png').convert('RGB') 

unique_colors = set(iter_colors(im)) 
print("unique", unique_colors) 

frequencies = collections.Counter((rgb for rgb in iter_colors(im2) 
    if rgb in unique_colors)) 
print("frequencies", frequencies) 

# counter keys are rgb tuples and velue is number of times seen 
rgbs_sorted = list(sorted(frequencies)) 
print("im2 rgb values sorted by value:", ", ".join(
    str(rgb) for rgb in rgbs_sorted)) 
print("im2 rgb values sorted by most common:", ", ".join(
    str(rgb) for rgb in frequencies.most_common())) 
print("one rgb value", frequencies[rgbs_sorted[0]]) 

На тестовом изображении, это возвращается

unique {(0, 0, 255), (191, 191, 191), (0, 255, 0)} 
frequencies Counter({(191, 191, 191): 45, (0, 0, 255): 44, (0, 255, 0): 32}) 
im2 rgb values sorted by value: (0, 0, 255), (0, 255, 0), (191, 191, 191) 
im2 rgb values sorted by most common: ((191, 191, 191), 45), ((0, 0, 255), 44), ((0, 255, 0), 32) 
one rgb value 44 
+0

Спасибо за ваш ответ, очень короткий скрипт, и он работает. Единственная проблема заключается в том, что я не уверен, как я могу получить определенные RGB-цвета и их значения из этой структуры данных. – EduGord

+0

Они работают так же, как dicts (см. Документы на странице https://docs.python.org/3.3/library/collections.html#collections.Counter). Я добавил несколько образцов. – tdelaney