2017-01-27 4 views
1

私はkey: 'Color'とターゲットイメージ内のすべてのRGBカラーのlistの辞書に一意のRGB色の束を持っています。Python - ユニークな要素の頻度を計算する

私がしたい:それは私が増加するkey: frequencyを変更したいと一致した場合、その要素はkey: 'Color'

  • に色のいずれかに一致した場合

    • 反復
    • ターゲットRGBカラーリストの上にチェックプロセス dict: Frequency WILの終わりに私は frequency['Frequency']を更新するために達成したいと考えて終了一(+ = 1)

    によってそれ私は(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関数は、キーと値のペアとして一緒に二つのリストを置きます。その後、あなたのように辞書を更新することができます

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

    frequency['red']+=1 
    

    そして辞書は{'red': 1, 'green': 0, 'blue': 0}

    +0

    感謝を返され、それは多くのことを助けました。 は、その後私はしなければならなかった: 'EについてのAll_Colorsで:unique_colorsにおけるiについて を: E == I場合: 周波数[E] + = 1 ' および(R、G、B)それぞれよりタプルのカウンタが更新されます。 – EduGord

    +0

    喜んで助けることができる! – ilke444

    0

    辞書を使用すると、素晴らしいアイデアであり、それが変わるとなりunique_colors={'red','green','blue'}場合、これは次のように辞書を作成します標準ライブラリからあなたのためにいくつかの作業を行っています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

    関連する問題