2017-01-27 1 views
1

Ich habe eine Reihe von einzigartigen RGB-Farben in einem Wörterbuch in einer key: 'Color' und eine list von jeder RGB-Farbe in einem Zielbild.Python - Häufigkeit der einzigartigen Elemente berechnen

Ich möchte:

  • Iterate über die Ziel RGB-Farbliste
  • prüfen, ob dieses Element entspricht eine der Farben in der key: 'Color'
  • Wenn es passt ich die key: frequency zu erhöhen ändern möchten es von einem (+ = 1)

am Ende I frequency['Frequency'] so am Ende der Prozess dict: Frequency Wil zu erreichen hoffen zu aktualisieren, Ich habe eine Reihe von Paaren von (Color,Frequency). Ich möchte dann von niedriger zu höherer Frequenz sortieren und jedes Paar RGB-Farbe + Anzahl der Erscheinungen drucken.

Hier ist mein Code so weit:

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))]} 

ich viele Probleme mit meinem Mangel an Fähigkeit, mit Blick auf Wörterbücher zu manipulieren, ist es wirklich angemessen Wörterbücher zu verwenden diese Daten in diesem Fall zu speichern?

Antwort

0

Ich denke, dass Ihre Wörterbucherstellung falsch ist. Sie können eine dict (Farbe, Frequenz) Struktur haben, wenn Sie Ihre dict wie folgt erstellen:

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

Die zip Funktion die beiden Listen zusammen als die Schlüssel-Wert-Paare setzt. Wenn unique_colors={'red','green','blue'}, wird dies ein Wörterbuch erstellen wie:

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

Danach Sie das Wörterbuch aktualisieren, wie:

frequency['red']+=1 

Und die dict wird {'red': 1, 'green': 0, 'blue': 0}

+0

Dank, war es sehr hilfreich. Danach hatte ich nur zu tun: 'für e in all_colors: für i in unique_colors: wenn e == i: Frequenz [e] + = 1 ' Und als jede (R, G, B) Tupel würde seinen Zähler aktualisiert haben. – EduGord

+0

Froh, helfen zu können! – ilke444

0

Mit Wörterbücher ist eine großartige Idee und es stellt sich out the standard lib hat etwas von der Arbeit für dich getan mit collections.Counter, die zählt Dinge, die Sie hineinlegen. In itertools.product durch alle Pixelstellen zu laufen und werfen, dass in einem benutzerdefinierten Pixel Iterator und Sie erhalten

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]]) 

Auf einem Testbild, das

zurück
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

Danke für Ihre Antwort, sehr kurzes Skript und es funktioniert. Das einzige Problem ist, dass ich mir nicht sicher bin, wie ich bestimmte RGB-Farben und ihre Werte aus dieser Datenstruktur abrufen kann. – EduGord

+0

Sie funktionieren ähnlich wie Dicts (siehe Dokumentation unter https://docs.python.org/3.3/library/collections.html#collections.Counter). Ich habe ein paar Beispiele hinzugefügt. – tdelaney

Verwandte Themen