Extracteur de Palette de Couleurs d'Image

Téléversez une photo et cet outil en extrait automatiquement les couleurs dominantes grâce à une quantification des couleurs basée sur un histogramme — une palette prête à l'emploi avec codes hexadécimaux, calculée entièrement dans votre navigateur, sans jamais rien téléverser vers un serveur.

251 vues

Téléchargez une photo pour en extraire les couleurs dominantes — tout s'exécute dans votre navigateur.

Pourquoi on ne peut pas simplement compter les pixels

La façon évidente de trouver les couleurs dominantes d'une photo semble simple : compter combien de pixels ont exactement chaque couleur, et garder celles qui apparaissent le plus souvent. En pratique, cela échoue presque immédiatement. Une photo numérique d'un ciel bleu, par exemple, n'est pas un bleu uniforme — ce sont des milliers de bleus subtilement différents, changeant pixel par pixel à cause du bruit du capteur, des dégradés de lumière naturelle et des artefacts de compression JPEG. Deux pixels de ciel adjacents pourraient être rgb(91, 148, 214) et rgb(92, 149, 213) : visuellement identiques, numériquement distincts. Comptés comme des valeurs exactes, aucun des deux n'est « la couleur la plus fréquente » — chacun pourrait n'apparaître qu'une ou deux fois, noyé parmi des milliers d'autres bleus presque identiques mais techniquement différents. L'approche naïve renvoie du bruit, pas une palette.

La solution consiste à arrêter de compter les valeurs exactes de pixels et à commencer à compter des compartiments (buckets) de couleurs similaires. Cet outil divise chacun des canaux rouge, vert et bleu — normalement compris entre 0 et 255 — en 8 bandes égales de 32 valeurs, en appliquant Math.floor(valeur / 32) * 32 à chaque canal. Cela transforme 16,7 millions de combinaisons RVB possibles en une grille gérable de 8 × 8 × 8 = 512 compartiments. Chaque pixel de l'image redimensionnée tombe exactement dans un compartiment selon la bande dans laquelle se situent ses valeurs de rouge, vert et bleu, et un décompte continu est tenu — à l'aide d'un simple objet servant de table de hachage — du nombre de pixels tombant dans chacun, ainsi qu'une somme continue de leurs valeurs réelles de rouge, vert et bleu.

Des compartiments à la palette

Une fois tous les pixels comptés, les compartiments sont triés par population et les 6 à 8 plus peuplés sont conservés. Mais la couleur affichée pour chaque compartiment n'est pas simplement sa limite numérique (disons « 224-255 rouge, 128-159 vert, 0-31 bleu ») — ce ne serait qu'un coin plutôt arbitraire d'un cube de 32×32×32. Cet outil calcule plutôt la moyenne réelle de rouge, vert et bleu de chaque pixel réellement tombé dans ce compartiment, ce qui se rapproche beaucoup plus de ce que l'œil perçoit comme la couleur représentative de cette région de l'image.

Cette approche par regroupement en histogramme est une forme délibérément simple de quantification des couleurs — réduire un grand ensemble de couleurs à un petit ensemble représentatif. Une alternative classique plus sophistiquée est le median-cut, défini par Paul Heckbert dans son mémoire de master de 1980 au MIT, qui divise récursivement l'espace colorimétrique le long de sa dimension la plus large plutôt que d'utiliser des boîtes de taille fixe ; c'est toujours la technique derrière la réduction des images GIF à une palette de 256 couleurs. Le median-cut produit généralement des palettes perceptuellement plus précises pour les images complexes, au prix d'une plus grande complexité d'implémentation. Le regroupement par histogramme à grille fixe, utilisé ici, est plus simple à raisonner et assez rapide pour s'exécuter instantanément dans le navigateur — c'est le compromis que fait cet outil.

Avant que tout comptage ne commence, l'image téléversée est d'abord réduite pour que sa largeur ne dépasse pas 200 pixels, à l'aide de l'API canvas de HTML5. Cela réduit considérablement le nombre de pixels à lire et à répartir, et affecte à peine la palette résultante, puisque les compartiments de couleur suivent de larges régions de teinte, pas des détails fins. L'ensemble du processus — dessiner l'image, la redimensionner, lire les données de pixels avec getImageData(), et calculer les moyennes des compartiments — se déroule localement dans la mémoire du navigateur. La photo n'est jamais téléversée vers un serveur.

Questions fréquentes

Pourquoi cet outil ne trouve-t-il pas simplement la couleur la plus fréquente ?

Parce que dans les photographies réelles, presque aucun pixel ne partage exactement la même valeur RVB qu'un autre — la lumière naturelle, le bruit du capteur et la compression font que des couleurs qui paraissent identiques à l'œil sont numériquement légèrement différentes, si bien qu'aucune valeur exacte ne se répète assez souvent pour être significative. Regrouper d'abord les couleurs voisines en compartiments est ce qui rend le comptage utile.

Combien de couleurs la palette affiche-t-elle ?

Jusqu'à 8 — l'outil regroupe tous les pixels en 512 compartiments de couleur possibles (8 niveaux chacun pour le rouge, le vert et le bleu), puis affiche les 6 à 8 compartiments contenant le plus de pixels. Une image très simple et majoritairement unie peut en renvoyer moins si seule une poignée de compartiments sont réellement peuplés.

S'agit-il de la même technique utilisée pour créer des images GIF ?

Pas exactement, mais c'est une technique apparentée. Les GIF sont généralement réduits à 256 couleurs à l'aide du median-cut, un algorithme de quantification plus avancé datant de 1980 qui divise récursivement l'espace colorimétrique plutôt que d'utiliser une grille fixe. Cet outil utilise un regroupement par histogramme à taille fixe plus simple, plus rapide à calculer et plus facile à raisonner, au prix d'une certaine perte de précision perceptuelle sur les images complexes.

Téléverser une photo ici l'envoie-t-il à un serveur ?

Non — l'image est décodée et dessinée sur un élément canvas entièrement à l'intérieur de votre navigateur, et chaque pixel est lu et analysé localement avec l'API getImageData() du canvas. Rien concernant la photo n'est jamais transmis où que ce soit.

Pourquoi l'image est-elle redimensionnée avant d'être analysée ?

Purement pour des raisons de vitesse. Lire et répartir chaque pixel d'une photo en pleine résolution pourrait signifier traiter des dizaines de millions de valeurs ; réduire d'abord l'image à une largeur maximale de 200px réduit cela considérablement tout en modifiant à peine le résultat, puisque les couleurs dominantes correspondent à de larges régions, pas à des détails fins.

Commentaires

Pas encore de commentaires — soyez le premier à en écrire un !

Outils similaires