6 votes

Algorithme pour déterminer la couleur dominante d'une photographie

Lorsque nous regardons une photo d'un groupe d'arbres, nous sommes capables d'identifier que la photo est principalement verte et brune, ou pour une photo de la mer, nous sommes capables d'identifier qu'elle est principalement bleue.

Quelqu'un connaît-il un algorithme permettant de détecter la ou les couleurs dominantes d'une photo ?

Je peux envisager un algorithme de regroupement en 3D dans l'espace RVB ou quelque chose de similaire. Je me demandais si quelqu'un connaissait une technique existante.

4voto

Matt Ball Points 165937

Il semble que vous souhaitiez commencer par calculer une histogramme de l'image o histogramme des couleurs de l'image. La ou les couleurs prédominantes sont liées aux pics de l'histogramme.

4voto

Anders Forsgren Points 5513

Convertir l'image de RVB à un espace de couleur avec la luminosité et la saturation séparées (HSL/HSV) http://en.wikipedia.org/wiki/HSL_and_HSV

Trouvez ensuite les valeurs dominantes pour la composante de teinte de chaque pixel. Créez un histogramme pour les valeurs de teinte de chaque pixel et analysez dans quelle région angulaire se situent les pics. Un pic important dans le quadrant situé entre 180 et 270 degrés signifie qu'il y a une grande part de bleu dans l'image, par exemple.

Il peut être difficile de déterminer un couleur dominante. Exemple pathologique : une image dont la moitié gauche est bleue et la moitié droite rouge. En outre, la teinte ne s'applique pas très bien aux échelles de gris. Ainsi, une image d'échiquier avec 50 % de blanc et 50 % de noir souffrira de deux problèmes : la teinte est arbitraire pour une image noir/blanc, et il y a deux couleurs qui représentent exactement 50 % de l'image.

0voto

rafa Points 39

Vous pourriez vouloir changer l'image de RVB à indexée, puis vous pourriez utiliser un histogramme normal et détecter les images (Matlab fait cela avec rgb2ind(), comme vous le savez probablement déjà), et alors le problème serait réduit à votre habituelle "recherche de pics dans un tableau".

Dans ce cas n = hist(Y,nbins) répartit les éléments du vecteur Y en 10 conteneurs également espacés et renvoie le nombre d'éléments dans chaque conteneur sous la forme d'un vecteur de lignes.

Ces valeurs en n vous donneront le nombre d'éléments dans chaque case. Il suffit ensuite de jouer avec le nombre de cases pour qu'elles soient suffisamment larges et avec le nombre d'éléments dans chacune d'elles pour que cette case soit considérée comme une couleur prédominante, puis de prendre les cases qui contiennent ces nombreux éléments, de calculer l'indice qui correspond à leur milieu et de le convertir à nouveau en RVB.

L'outil de traitement que vous utilisez a probablement des fonctions similaires à celles qui sont décrites ci-dessous.

0voto

porneL Points 42805
  1. Moyenne de tous les pixels de l'image.
  2. Supprimer tous les pixels qui sont plus éloignés de la couleur moyenne que de l'écart-type.
  3. GOTO 1 avec les pixels restants jusqu'à ce qu'il en reste arbitrairement peu (1 ou peut-être 1 %).

Vous pouvez également prétraiter l'image, par exemple en appliquant un filtre passe-haut (qui ne supprime que les très basses fréquences) afin d'uniformiser l'éclairage de la photo. http://en.wikipedia.org/wiki/Checker_shadow_illusion

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X