2017-01-27 2 views
1

J'ai un tas de couleurs RVB uniques dans un dictionnaire dans un key: 'Color' et un list de chaque couleur RVB dans une image cible.Python - Calculer la fréquence des éléments uniques

Je veux:

  • itérer sur la liste des couleurs RVB cible
  • Vérifiez si cet élément correspond à l'une des couleurs du key: 'Color'
  • Si elle correspond, je veux changer le key: frequency d'augmenter par une (+ = 1)

A la fin je souhaite réaliser la mise à jour frequency['Frequency'] donc à la fin du processus dict: Frequency wil Je contiens un groupe de paires de (Color,Frequency). Je veux ensuite trier de la plus basse à la plus haute fréquence et imprimer chaque paire de couleur RVB + nombre d'apparences.

Voici mon code à ce jour:

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

Je suis face à de nombreux problèmes avec mon manque de capacité à manipuler les dictionnaires, est-il vraiment approprié d'utiliser des dictionnaires pour stocker ces données dans ce cas?

Répondre

0

Je pense que la création de votre dictionnaire est incorrecte. Vous pouvez avoir une structure dict (couleur, fréquence) si vous créez votre dict comme ce qui suit:

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

La fonction zip met ensemble les deux listes que les paires de clés et de valeur. Si unique_colors={'red','green','blue'}, cela va créer un dictionnaire comme:

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

Ensuite, vous pouvez mettre à jour le dictionnaire comme:

frequency['red']+=1 

Et le dict devient {'red': 1, 'green': 0, 'blue': 0}

+0

Merci, ça m'a beaucoup aidé. Après que je ne devais faire: 'E dans all_colors: for i in unique_colors: si e == i: fréquence [e] + = 1' Et que chacun (R, G, B) tuple aurait son compteur mis à jour. – EduGord

+0

Heureux de pouvoir vous aider! – ilke444

0

Utilisation des dictionnaires est une excellente idée et il se sur le standard lib a fait une partie du travail pour vous avec collections.Counter qui compte les choses que vous y mettez. Ajouter itertools.product à courir à travers tous les emplacements de pixels et lancer que dans un iterator pixel personnalisé et vous obtenez

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

Sur une image test, ce retour

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

Merci pour votre réponse, script très court et cela fonctionne. Le seul problème est que je ne suis pas sûr comment puis-je récupérer des couleurs RVB spécifiques et ses valeurs à partir de cette structure de données. – EduGord

+0

Ils fonctionnent un peu comme des dicts (voir docs à https://docs.python.org/3.3/library/collections.html#collections.Counter). J'ai ajouté quelques échantillons. – tdelaney