2015-08-06 2 views
1

J'ai le problème, que j'ai besoin de comprendre la couleur principale d'une icône, et ai choisi la couleur "la plus proche" d'une liste dans C#.Obtenir la couleur principale d'icône et sélectionner la couleur prédéfinie de la liste

Dans un premier temps i ai une liste avec des couleurs, par exemple:

  1. R: 176, G: 30, B: 0
  2. R: 114, G: 0, B: 172
  3. R: 25, G: 153, B: 0
  4. R: 255, G: 183, B: 0
  5. ...

que moi une liste d'icônes:

  1. Nouveau document
  2. Enregistrer
  3. Dossier/Répertoire
  4. ...

Maintenant, je veux obtenir la couleur principale dans chaque icône et que obtenir la couleur, qui est aussi similaire possible à l'une des listes prédéfinies. Ma première solution était, pour obtenir la valeur RVB de chaque pixel d'icône, puis diviser à travers l'amout des pixels, mais alors je reçois seulement des couleurs brunes et grises.

Est-ce que quelqu'un a une solution à ce problème?

Merci beaucoup!

+1

Comment définissez-vous «couleur principale»? – Eser

+0

Je suppose que vous obtenez des couleurs étranges parce que vous prenez des moyennes de chaque composant de couleur séparément. Ça sonne bien en théorie, mais ça peut faire sauter votre réponse si vous avez beaucoup de couleurs différentes dans votre image. Supposons que votre icône représente 33% de chaque 255 R, 255 G et 255 B ... Votre "couleur" serait d'environ 85% de chacun (aka gris foncé). En ce qui concerne la moyenne, ce n'est pas * faux * nécessairement. –

Répondre

1

J'ai une idée pour vous (en supposant que je comprends votre problème correctement, corrigez-moi si je ne le fais pas). Permettez-moi de commencer par ré-énoncer mon commentaire sur votre message:

Je suppose que vous obtenez des couleurs étranges parce que vous prenez des moyennes de chaque composant de couleur séparément. Ça sonne bien en théorie, mais ça peut faire sauter votre réponse si vous avez beaucoup de couleurs différentes dans votre image. Supposons que votre icône représente 33% de chaque 255 R, 255 G et 255 B ... Votre "couleur" serait d'environ 85% de chacun (aka gris foncé). En ce qui concerne la moyenne, ce n'est pas nécessairement une erreur.

Alors, voici ma technique proposée (encore une fois, en supposant que je comprends que vous êtes après la couleur la plus commune, et non moyenne):
Qu'est-ce que vous pourriez faire, est un magasin (quelle qu'en soit la structure que vous jugez appropriée) quelle couleur sur votre liste est "plus proche" de chaque pixel en utilisant une certaine marge d'erreur (en comparant les valeurs RBG). Ensuite, une fois que tous les pixels ont été pris en compte et que leurs "votes" ont été appliqués à votre structure de données, voyez quelle couleur de la liste a le plus de pixels associés à cette couleur. Alors cette couleur est le "gagnant".

+0

Comme le suggère la réponse de Nicholas Ellingson, un dictionnaire serait un moyen simple et facile de le faire. Mais tant que cela dépend du nombre de couleurs que vous vérifiez, toute structure devrait être bien. –

+0

Parce qu'il s'agit d'un processus ponctuel, le temps dont il a besoin n'est pas très important. Merci pour votre idée, je vais essayer et poster des résultats demain. Merci à vous deux! – BendEg

+0

@BendEg, bonne chance! J'espère que cela marchera pour toi! –

1

Ce que vous obtenez est la couleur moyenne - ce qui serait une couleur gris brun pour la plupart des images. Ce que vous voulez, c'est la couleur la plus "commune" - Essayez de faire un Dictionary<color, int> et comme vous faites défiler chaque pixel de l'image, vérifiez si la couleur est dans le dictionnaire avec une marge d'erreur (10% peut-être?) Et si c'est, alors vous incrémentez cette valeur dans le dictionnaire, sinon vous l'ajoutez au dictionnaire.