IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Calcul scientifique Python Discussion :

Trouver la couleur principale d'une image (PIL)


Sujet :

Calcul scientifique Python

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 43
    Points : 60
    Points
    60
    Par défaut Trouver la couleur principale d'une image (PIL)
    Bonjour! =)

    j'aurai une petite question, j'ai déjà recherché la réponse sur le site, j'ai trouvé quelques informations mais je bloque encore un peu... alors voilà:

    J'aimerai trouver les couleurs principalement présentent dans une image. J'ai pensé prendre les maximas locaux d'un histogramme sur les pixels.

    J'utilise donc PIL avec la fonction .histogram() ce qui me donne un histogramme des trois vecteurs (RGB) à la suite. Bon, si je prend le max de chaque vecteur (RGB) je vais bien obtenir la "couleur principale", mais si deux couleurs sont également présentes, comment puis-je retrouver le code RGB de cette couleurs alors que j'ai deux maximums pour chaque vecteur?

    Je n'arrive pas à trouver de réponse simple du coup je me demande s'il n'y a pas une méthode plus pratique...comme un histogramme globale sur les couleurs mais là je ne sais pas comment faire... Auriez-vous une petite idée? Ce serait plus facile avec numpy? (désolé je début je ne connais pas toutes les possibilités )

    Merci et bonne soirée!

  2. #2
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonsoir,

    Avec im.getdata() ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    >>> im = Image.open("image.GIF")
    >>> for value in im.getdata(): # pas très joli mais compréhensible
    ...     if value in dico.keys():
    ...         dico[value] += 1
    ...     else:
    ...         dico[value] = 1
    ... 
    >>> dico
    {0: 14874, 1: 19270, 2: 7759, 3: 6181, 4: 1755, 6: 855, 7: 7295, 8: 6097, 9: 971, 10: 2361, 11: 376, 13: 16, 14: 1086, 15: 2452, 16: 992, 17: 1558, 147: 2, 21: 346, 22: 986, 23: 1756, 153: 7, 154: 84, 155: 31, 28: 151, 29: 465, 160: 105, 161: 566, 27: 1, 166: 4, 167: 188, 42: 35, 43: 127, 44: 70, 45: 46, 46: 31, 48: 10, 49: 212, 50: 493, 51: 84, 52: 78, 53: 18, 55: 4, 56: 233, 57: 602, 58: 177, 59: 34, 63: 215, 64: 1025, 65: 145, 195: 1, 196: 5, 69: 11, 70: 1197, 71: 1554, 202: 717, 203: 816, 76: 40, 77: 169, 208: 1092, 209: 1615, 98: 2, 99: 1, 100: 1, 104: 1, 105: 18, 106: 24, 107: 1, 111: 13, 112: 396, 113: 635, 244: 587, 245: 2196, 118: 184, 119: 1148, 250: 1156, 251: 6050, 125: 46}
    >>> import operator
    >>> dico_x = sorted(dico.iteritems(), key=operator.itemgetter(1))
    >>> dico_x
    [(27, 1), (195, 1), (99, 1), (100, 1), (104, 1), (107, 1), (147, 2), (98, 2), (166, 4), (55, 4), (196, 5), (153, 7), (48, 10), (69, 11), (111, 13), (13, 16), (53, 18), (105, 18), (106, 24), (155, 31), (46, 31), (59, 34), (42, 35), (76, 40), (45, 46), (125, 46), (44, 70), (52, 78), (154, 84), (51, 84), (160, 105), (43, 127), (65, 145), (28, 151), (77, 169), (58, 177), (118, 184), (167, 188), (49, 212), (63, 215), (56, 233), (21, 346), (11, 376), (112, 396), (29, 465), (50, 493), (161, 566), (244, 587), (57, 602), (113, 635), (202, 717), (203, 816), (6, 855), (9, 971), (22, 986), (16, 992), (64, 1025), (14, 1086), (208, 1092), (119, 1148), (250, 1156), (70, 1197), (71, 1554), (17, 1558), (209, 1615), (4, 1755), (23, 1756), (245, 2196), (10, 2361), (15, 2452), (251, 6050), (8, 6097), (3, 6181), (7, 7295), (2, 7759), (0, 14874), (1, 19270)]
    >>>
    Ici les couleurs principales sont 0 (14874 valeurs) et 1 (19270 valeurs)

    @+
    Merci d'utiliser le forum pour les questions techniques.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 43
    Points : 60
    Points
    60
    Par défaut
    Merci beaucoup!

    Connaissant peu les dictionnaires je n'avais pas cherché par la mais ça me semble vraiment pas mal pour le coup!

    J'ai essayé et tout ça fonctionne très bien, mon problème restait que sur un image de 1000*1000 cette ligne de code prenait bien 15 minutes. J'ai cherché un moyen d'optimiser tout ça car je voudrais répéter cette opération dans mon algorithme... Je pense avoir trouvé la solution ici : http://wiki.python.org/moin/PythonSpeed/PerformanceTips

    Ce qui donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    >>>import operator
    >>>from collections import defaultdict
    >>>dico=defaultdict(int)
    >>>for value in im.getdata():
    ...    dico[value] +=1
    >>>dico_x = sorted(dico.iteritems(), key=operator.itemgetter(1))
    (si ça peut aider quelqu'un d'autre)

    Merci encore, bonne journée!

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    J'aurais une petite question aussi concernant la manipulation d'image avec Python: comment faire la moyenne de 4 pixels chacun avec une intensité (r,v,b)pour en faire un nouveau pixel (dont sa valeur est la moyenne de ces 4 pixels) ?
    Merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 22/12/2008, 15h42
  2. [GD] modifier les couleurs claires d'une image
    Par calitom dans le forum Bibliothèques et frameworks
    Réponses: 13
    Dernier message: 09/12/2008, 17h01
  3. comment trouver le code hexadécimale d'une image
    Par argon dans le forum Traitement d'images
    Réponses: 4
    Dernier message: 17/01/2008, 11h49
  4. [ImageMagick] Couleur dominante d'une image
    Par matique dans le forum Bibliothèques et frameworks
    Réponses: 11
    Dernier message: 03/07/2006, 15h24
  5. [ImageMagick] Détection des couleurs approximative d'une image ?
    Par SkyDev dans le forum Bibliothèques et frameworks
    Réponses: 4
    Dernier message: 18/01/2006, 14h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo