2010-06-29 24 views
2

Disons que j'ai la couleur 'FOO', et il est stocké au format RVB. J'ai besoin de recolorer 'FOO' pour qu'il corresponde à la couleur la plus proche dans une liste de couleurs. En faisant cela à la volée, je ne pouvais pas voir les valeurs RVB de chaque couleur comme des points sur une grille 3D (r = x, g = y, b = z) et calculer la distance entre le point 'FOO' vs les points de chaque couleur dans la liste?Remappage des couleurs - Palette cible assortie utilisant une grille 3D?

Le point le plus proche de 'FOO' serait la couleur de remplacement?

+0

C'est une idée intéressante (distance euclidienne comme couleur "distance"), mais la seule façon de dire si l'interprétation des couleurs en géométrie est de l'essayer. Je n'ai jamais entendu parler de cela auparavant, mais j'aimerais savoir comment ça se passe. Que faites-vous si vous avez deux points équidistants de votre point source? Les deux couleurs équidistantes pourraient être très différentes les unes des autres. Comment choisissez-vous à qui remapper? – FrustratedWithFormsDesigner

+0

J'aimerais pouvoir l'essayer, je suis au travail et mon ordinateur est un bloc-notes et du papier, mon téléphone portable, une calculatrice et une caisse enregistreuse. Je note les théories et essaye de les mettre en application à la maison. –

+0

@Jeffrey Kern: Heh j'ai été là. Je suppose que vous surfez SO sur le téléphone portable? Eh bien, le problème principal que je vois avec cette théorie est le problème du point équidistant. Si j'en savais plus sur la théorie des couleurs, j'aurais probablement plus à dire, mais je regarderai plutôt ...;) – FrustratedWithFormsDesigner

Répondre

1

En théorie, oui. En réalité, calculer la couleur la plus proche n'est pas trivial si vous voulez le faire correctement. Juste par exemple, les yeux des gens sont beaucoup plus sensibles aux changements de luminosité que les changements de couleur, en particulier vers les extrémités de la gamme de couleurs (c'est-à-dire vers des rouges ou des bleus extrêmes).

Au moins si cela ne vous dérange pas un peu de travail supplémentaire dans le calcul, vous devrez utiliser l'un des calculs standard "delta E" (dans votre cas, vous voulez minimiser le delta E). Notez que ces tous (tout ce que j'ai travaillé avec de toute façon) fonctionnent dans l'espace couleur CIE L a b *. Dans un cas typique, vous commencerez par RGB, que vous devrez d'abord convert to Lab*.

+0

Cela fonctionnerait-il si je visais une palette personnalisée? Par exemple, l'image originale contient 8 couleurs différentes (rouge, vert, jaune, pêche, etc.) alors que la palette cible contient du noir, du blanc et 4 nuances de bleu? –

+0

@Jeffrey: Oui, à condition qu'il soit douteux que quelque chose fonctionnera très bien dans ce genre de situation - au point que cela pourrait être une perte de temps. OTOH, avec une palette de seulement 8 couleurs, vous pouvez pré-calculer la sortie pour chacune des 8 entrées possibles, et convertir chaque pixel comme une recherche de table triviale. –

+0

@Jeffrey: aussi, au lieu de simplement choisir la * première * égale correspondance que vous avez mentionnée dans votre commentaire, vous pouvez garder une trace d'une erreur accumulée, et choisir celle qui minimise l'erreur globale (cf, Floyd-Steinberg dithering : http://en.wikipedia.org/wiki/Floyd%E2%80%93Steinberg_dithering). –