Quelle est la meilleure façon de moyenner deux couleurs qui définissent un dégradé linéaire?

StackOverflow https://stackoverflow.com/questions/649454

  •  19-08-2019
  •  | 
  •  

Question

Si j'ai deux couleurs définies par leurs valeurs RVB, puis-je moyenner les valeurs Rouge, Vert et Bleu et ensuite combiner pour définir une troisième couleur qui ressemble à une moyenne visuelle des deux?

ie NewColor = (R1 + R2) / 2, (G1 + G2) / 2, (B1 + B2) / 2

EDIT1: Merci pour toutes les réponses. Pour mes besoins actuels, je ne traite que des paires de couleurs qui sont des nuances de la même couleur, je pense donc que leur calcul de la moyenne fonctionnera. Cependant, je vais essayer de convertir en espace de laboratoire pour m'assurer que cette hypothèse est vraie et que la technique sera utile à l'avenir.

EDIT2: Voici mes résultats FWIW. Color1 et Color2 sont mes deux couleurs et les deux colonnes du milieu sont les résultats de la moyenne dans l'espace L a et de la moyenne RVB, respectivement. Dans ce cas, il n'y a pas beaucoup de différence entre les deux couleurs et les différences de résultats des techniques de calcul de la moyenne sont donc subtiles.

comparaison visuelle des techniques de moyennage des couleurs

Était-ce utile?

La solution

Consultez les réponses à la question .

En gros, vous voulez convertir les couleurs en un élément appelé Espace de travail et trouver leur moyenne dans cet espace.

L’espace de laboratoire est une manière de représenter des couleurs où les points proches les uns des autres sont semblables à ceux des humains.

Autres conseils

Plusieurs réponses suggèrent de convertir en espace colorimétrique Lab - ce qui constitue probablement une bonne approche pour une manipulation des couleurs plus complexe.

Mais si vous avez simplement besoin d’un moyen rapide de prendre la moyenne de deux couleurs, vous pouvez le faire dans l’espace RVB. Vous devez juste faire attention à une mise en garde: vous devez quadriller les valeurs RVB avant de les calculer en moyenne, puis prendre la racine du résultat. (Si vous prenez simplement la moyenne, le résultat aura tendance à être trop sombre.)

Comme ceci:

NewColor = sqrt((R1^2+R2^2)/2),sqrt((G1^2+G2^2)/2),sqrt((B1^2+B2^2)/2)

Voici une excellente vidéo qui explique l’efficacité de cette méthode: https://www.youtube.com/watch?v = LKnqECcg6Gw

La moyenne de l'espace colorimétrique HSL peut produire de meilleurs résultats.

Je ne sais pas si prendre la moyenne simple des composants est le "meilleur" du point de vue de la perception (cela ressemble à une question pour un psychologue), mais voici quelques exemples utilisant la moyenne de composant simple.

alt text

Le rouge-vert-moutarde est moche mais l'interpolation semble assez raisonnable.

Oui. Vous pouvez en moyenne deux couleurs ensemble comme ça. C’est l’approche utilisée par OpenGL pour mélanger les couleurs (par exemple, lors de la création de mappes mip pour le rendu d’objets distants ou du rendu d’une texture transparente à 50%). C’est rapide, simple et "assez bon". pour de nombreuses situations. Ce n’est cependant pas tout à fait réaliste et ne serait probablement pas utilisé sur des images de qualité photo.

C'est difficile. Tout d'abord, un ensemble de valeurs RVB ne définit pas de couleur. Ils doivent être interprétés à la lumière des couleurs primaires auxquelles ils font référence (espace colorimétrique), tels que sRGB, Rec.709, Rec.2020, Adobe RGB (1998), etc.

De plus, les valeurs RVB telles que nous les rencontrons ne sont pas proportionnelles à la lumière linéaire: elles sont "codées". utilisant une fonction non linéaire (gamma). Et parfois (dans les applications vidéo principalement) la valeur de "noir" n'est pas nul, mais décalé par rapport à zéro, généralement 16 pour les valeurs de 8 bits. Et "blanc" sRGB et Rec.709 partagent les couleurs primaires RVB, mais leurs fonctions gamma sont différentes.

La conversion de l'espace colorimétrique commence par la suppression de tout décalage du noir afin que le noir soit égal à zéro. Si la fonction gamma comporte un point d'arrêt (comme le font sRGB et Rec.709), vous devrez redimensionner soigneusement les valeurs RVB de manière à ce que "blanc" est 1,0.

Ensuite, "décoder" le gamma en faisant l'inverse de la fonction gamma d'origine. (Une réponse a suggéré de hiérarchiser les valeurs, ce qui est une approximation du décodage gamma.) Vous disposez maintenant de valeurs RVB à lumière linéaire dans certains espaces colorimétriques. À ce stade, vous pouvez convertir cet espace couleur en espace Lab. La plupart des conversions de RVB à Lab passent par un espace colorimétrique intermédiaire appelé XYZ.

Les étapes en tant qu'appels de fonction imbriqués:

Lab = XYZ2Lab (RGB2XYZ (gamma_decode (offset_and_scale (RVB), gammaFunction ), Espace colorimétrique RVB )))

(L’espace de laboratoire a été développé en 1976 dans le but de créer une déformation uniforme de l’espace CIE XYZ standard (Luv était une autre tentative.) L’idée est que la distance euclidienne (en ligne droite) entre deux couleurs qui étaient juste sensiblement différentes (1 "1" JND ") aurait la même distance pour deux couleurs quelconques. La distance entre deux couleurs dans Lab est connue sous le nom de" delta-E ". La formule de distance delta euclidienne simple s'appelle maintenant dE76. Voir https://en.wikipedia.org/wiki/Color_difference )

Dans votre cas, vous pouvez calculer la moyenne des deux couleurs de laboratoire pour obtenir une nouvelle couleur de laboratoire, puis inverser toutes les conversions pour revenir en RVB dans l'espace colorimétrique de votre choix.

Cela vous rapprochera, mais ce n’est pas garanti, simplement parce que "couleur". est une perception humaine, pas une quantité physique, et a été notoirement difficile à caractériser de manière fiable. En réalité, le laboratoire ne fonctionnait pas si bien pour être uniformément perceptible. Ainsi, plutôt que de réparer Lab, ils ont proposé une nouvelle fonction delta-E plus complexe avec une autre chaîne intégrée: DE94. C’était mieux, mais pas parfait, une autre proposition a donc vu le jour en 2000: DE2000. Aussi mieux mais pas parfait. Voir cette page Wiki ci-dessus pour plus d'informations.

Si DE2000 n’est pas assez bon (ou trop complexe!), vous pouvez jeter un coup d’œil à une alternative au Lab appelée ICtCp dont on prétend qu'il est plus uniforme sur le plan de la perception que Lab.

Je pense que la réponse de arntjw va dans la bonne direction et reconnaît le support logarithmique, comme l'a mentionné Dan W. Cependant, la moyenne géométrique appropriée n'est pas sqrt ((C1 ^ 2 + C2 ^ 2) / 2) , mais sqrt (C1 * C2). Donc, la couleur moyenne serait:

NewColor = sqrt(R1*R2),sqrt(G1*G2),sqrt(B1*B2)

Les couleurs obtenues sont plus proches de ce que nous attendons. Vous pouvez généraliser à plus de couleurs en utilisant des racines d'ordre supérieur et pondérer chaque couleur en ajoutant un exposant à ses composants.

Il existe en fait un moyen beaucoup plus simple.

  • Réduisez l'image à 1px par 1px.

    La couleur de la 1px est la couleur moyenne de tout ce que vous avez mis à l'échelle

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top