La "couleur dominante" est délicate. Il s'agit de comparer la distance entre chaque pixel et tous les autres pixels dans l'espace couleur (distance euclidienne), puis de trouver le pixel dont la couleur est la plus proche de toutes les autres couleurs. Ce pixel est la couleur dominante. La couleur moyenne sera généralement la boue.
J'aimerais avoir du MathML ici pour vous montrer la distance euclidienne. Cherche sur Google.
J'ai réalisé l'exécution ci-dessus dans l'espace couleur RGB en utilisant PHP/GD ici : https://gist.github.com/cf23f8bddb307ad4abd8
Cette méthode est toutefois très coûteuse en termes de calcul. Elle fera planter votre système sur les grandes images, et fera planter votre navigateur si vous l'essayez dans le client. J'ai travaillé sur la refactorisation de mon exécution pour : - stocker les résultats dans une table de consultation pour une utilisation future dans l'itération sur chaque pixel. - diviser les grandes images en grilles de 20px 20px pour une dominance localisée. - utiliser la distance euclidienne entre x1y1 et x1y2 pour déterminer la distance entre x1y1 et x1y3.
Faites-moi savoir si vous progressez sur ce front. Je serais heureux de les voir. Je ferai de même.
Le canevas est certainement le meilleur moyen de le faire dans le client. SVG ne l'est pas, car il est basé sur les vecteurs. Une fois que j'aurai mis au point l'exécution, la prochaine chose que je veux faire est de la faire fonctionner dans le canevas (peut-être avec un webworker pour le calcul de la distance globale de chaque pixel).
Une autre chose à laquelle il faut penser est que l'espace RVB n'est pas un bon espace couleur pour faire cela, parce que la distance euclidienne entre les couleurs dans l'espace RVB n'est pas très proche de la distance visuelle. Un meilleur espace couleur pour cela pourrait être LUV, mais je n'ai pas trouvé de bonne bibliothèque pour cela, ni d'algorythme pour convertir RGB en LUV.
Une approche totalement différente consisterait à trier vos couleurs dans un arc-en-ciel, et à construire un histogramme avec une tolérance pour tenir compte des différentes nuances d'une couleur. Je n'ai pas encore essayé, car le tri des couleurs dans un arc-en-ciel est difficile, tout comme les histogrammes de couleurs. Je pourrais essayer cela la prochaine fois. Encore une fois, faites-moi savoir si vous faites des progrès ici.
24 votes
Mon ami Boaz a déjà emprunté cette voie (j'espère qu'il nous dira ce qu'il en pense) mais la moyenne vous laisse généralement avec une couleur semblable au vomi. Ce que vous voulez vraiment, c'est une "couleur dominante". Il y a plusieurs façons de l'obtenir (histogramme de la teinte avec répartition dynamique, etc.) mais je pense que c'est probablement plus précis pour le résultat que tu veux obtenir.