web-dev-qa-db-fra.com

Y a-t-il un algorithme de mélange de couleurs qui fonctionne comme mélanger de vraies couleurs?

Le mélange commun de couleurs RGB est très différent des couleurs de mélange pour les peintures, il mélange de lumière à la place de pigments.

Par exemple:

Blue (0,0,255) + Yellow (255,255,0) = Grey (128,128,128)

(Il devrait être bleu + jaune = vert)

Y a-t-il un algorithme connu pour le mélange de couleurs qui fonctionne comme mélanger de vraies couleurs ?


Mon approche

J'ai déjà essayé de suivre:

Conversion des deux couleurs en HSV et la teinte de mélange (multipliée par coefficient calculée de saturation) et une moyenne simple pour les canaux de saturation et de valeur. Ensuite, j'ai calculé la luminance moyenne des deux couleurs et ajusté la couleur résultante pour correspondre à cette luminance. Cela a bien fonctionné, mais le mélange de teinte était parfois faux, e. g.:

Red (Hue 0°) + Blue (Hue 240°) = Green (Hue 120°)

J'ai compris que parfois, j'ai besoin de déplacer la valeur de la teinte de 360 ​​° (lorsque la différence entre les teintes est supérieure à 180 °).

Red (Hue 360°) + Blue (Hue 240°) = Magenta/Fuchsia (Hue 300°)

Mais ce changement n'était pas très bon aussi, par exemple:

Cyan (Hue 179°) + Red (Hue 0°) = Hue 89.5°
Cyan (Hue 181°) + Red (Hue 0°) --> shifting is performed (the difference is greater than 180°)
Cyan (Hue 181°) + Red (Hue 360°) = Hue 270.5°

(Hue 179 + rouge) et (Hue 181 + rouge) entraîne deux couleurs complètement différentes.


Ensuite J'ai essayé l'espace couleur Cie Lab (comme dans Photoshop), qui est conçu pour être plus proche de la façon dont les humains perçoivent les couleurs.

J'ai utilisé une moyenne simple pour chaque deux canaux correspondants, mais les résultats n'étaient pas satisfaisants, par exemple, je suis devenu rose (64, 26, -9.5) en bleu (98, -16, 93) et jaune (30, 68, -112). Ces coefficients ont été pris de Photoshop.

Peut-être que si j'avais utilisée une opération différente de la moyenne, cela pourrait fonctionner, mais je ne sais pas quoi.


cmyk n'a pas fonctionné aussi, les résultats sont comme dans RVB ou dans le laboratoire.


Il semble que Ni l'additif trivial ni soustractif Couleur Le mélange de couleur dans l'une de ces espaces de couleur donne des résultats naturels.


Implémentation de travail

Krita - Mélangeur peintre

Raster Graphics Editor Krita a eu une mise en œuvre de la couleur plus réaliste à un moment donné: http://commit-digest.org/issues/2007-08-12/ (plug-in peintre mélangeur)

Ils disent que c'est la première application publique qui implémente une technologie spéciale utilisant des équations Kubelka et Munk décrivant le comportement des pigments.

Voici une vidéo de Krita Color Mixing: https://www.youtube.com/watch?v=lyLpzdvDQIQ

Papier par cinqueux

Il y a aussi article sur le mélange de couleurs dans l'application papier pour iOS Développé par FIFTYTHIRE . Ils décrivent comment ils innovent et expérimentent dans la région et offrent également des échantillons de mélange de bleu et de jaune qui entraînent un vert. Cependant, le processus ou l'algorithme réel n'est pas vraiment décrit là-bas.

Citant:

"En recherchant un bon algorithme de mélange, nous avons initialement essayé d'interpoler divers espaces de couleur: RVB, HSV et HSL, puis Cielab et Cieluv. Les résultats étaient décevants", déclare Chen. "Nous savons que le rouge et le jaune devraient céder à l'orange, ou que le rouge et le bleu devraient faire violet-mais il n'y a pas de moyen d'arriver à ces couleurs, quel que soit l'espace de couleur que vous utilisez. Il y a un axiom ingénierie: faites la chose la plus simple pourrait éventuellement fonctionner. Eh bien, nous avions maintenant essayé les approches les plus faciles éventuelles et elles ne se sentaient même pas à distance. "

Il semble que Kriita, papier implémente le modèle Kubelka-Munk:

[...] Le modèle Kubelka-Munk avait au moins six valeurs pour chaque couleur, y compris des valeurs de réflexion et d'absorption pour chacune des couleurs RVB. "Bien que l'apparition d'une couleur sur un écran puisse être décrite en trois dimensions, le mélange de couleurs se produit réellement dans un espace à six dimensions", explique Georg Petschnigg, cofondateur et chef de la direction de Cinquythree. Le papier Kubelka-Munk avait autorisé l'équipe à traduire un problème esthétique en un cadre mathématique. [...]

De toutes ces informations, il semble que la mise en œuvre basée sur le modèle Kubelka-munk Pourrait être la voie à suivre et offrir des résultats beaucoup plus proches de la réalité.

Même si cela ressemble à un processus compliqué, je n'ai pas encore trouvé de bonnes informations sur la manière de mettre en œuvre quelque chose comme celui-ci.


Questions connexes

Ces questions ont été postées après celui-ci relatif à la même chose.

Aucun d'entre eux n'a vraiment la réponse.


Autres liens et ressources connexes

57
Tom Pažourek

La réponse correct n'est pas non, car il n'y a pas correcttravail Modèle de la façon dont "la couleur de la couleur dans le monde réel" fonctionne vraiment. Il est beaucoup trop complexe et conditionnel et pas vraiment comme la simple chose de rouge-bleu rouge que nous avons apprise à l'école (elle nécessite en fait toute la chimie et beaucoup de physique et de biologie à résoudre).

Cependant, la réponse simpliste est la suivante: oui, utiliser soustractive mélange plutôt que additif mélange.

Le mélange de couleurs que nous avons appris en classe est basé sur des combinaisons de pigment qui constituent une forme de mélange de couleurs soustractif (très simpliste). C'est la plus grand nombre de couleurs que nous ajoutons, plus il devient sombre, car chaque pigment soustrait un peu plus de lumière.

D'autre part, presque tous les schémas de couleur informatique sont additif en ce sens qu'ils sont basés sur la combinaison des ondes lumineuses (très simples), elles sont donc plus brillantes, car chaque couleur ajoute un peu plus de lumière.

Le schéma RVB + est quelque peu, le complément additif au schéma soustractif que nous avons appris dans la plupart des écoles primaires américaines (qui est RBY-). Cependant, ils ne correspondent pas exactement et il peut être difficile de convertir entre eux (recherche maintenant ...)


OK, si vous souhaitez simplement passer des combinaisons additifs dans RVB aux soustractes, vous pouvez utiliser la formule de type inversée suivante pour combiner deux couleurs:

NewColor.R = (Color1.R * Color2.R)/255
NewColor.G = (Color1.G * Color2.G)/255
NewColor.B = (Color1.B * Color2.B)/255

Réglage de la différence dans les pôles chromatiques (g à Y, puis de retour à g) est beaucoup plus difficile ...


Il a été souligné que cela produit du noir pour l'exemple problème et que, techniquement, cela est correct pour un vrai système soustractif, cependant, si vous souhaitez davantage de système de dilution/soustractive, vous pouvez essayer cela à la place:

NewColor.R = 255 - SQRT(((255-Color1.R)^2 + (255-Color2.R)^2)/2)
NewColor.G = 255 - SQRT(((255-Color1.G)^2 + (255-Color2.G)^2)/2)
NewColor.B = 255 - SQRT(((255-Color1.B)^2 + (255-Color2.B)^2)/2)

Cela produit un gris foncé au lieu de noir. Mais pour devenir jaune ou quelque chose de fermeture, vous devez toujours réparer le problème d'alignement des poles de la couleur.

24
RBarryYoung

il y a deux possibilités différentes combinant des couleurs:

  1. Mélange additif (comme RVB)

  2. Mélange soustractif (comme CMYK)

Donc, dans le mélange de couleur soustractive, le résultat est ce que vous attendez, mais il n'y a pas de bleu, mais il y a cyan:

Jaune + cyan = vert

En général, le mélange de couleurs soustractif est simplement "enlever" (filtrage) de blanc tandis que le mélange de couleurs additif ajoute du noir. (Les couleurs de base des soustractifs sont inverse de l'additif: rouge -> cyan; vert-> magenta; bleu-> jaune)

Donc, si vous commencez par l'écran blanc appliquant des filtres:

min (blanc (255 255 255), jaune (255,255,0), cyan (0,255,255)) = vert (0,255,0)

5
Peter Parker

Je pense que votre problème de combinaison de teintes est que vous le faites en ajoutant les deux angles et en divisant par deux. Comme vous l'avez remarqué, le résultat n'a pas de sens. Je pense que vous feriez mieux de convertir les angles à des coordonnées cartésiennes sur le cercle de l'unité, de la moyenne et de la recherche de l'angle du point résultant (ignorant la magnitude).

1
Stefan Vorkoetter

Une façon de faire du mélange soustractif de couleurs RGB est de convertir d'abord les couleurs RVB en courbes de réflectance spectrale. La conversion est assez simple et une fois que vous l'avez fait, vous pouvez effectuer un véritable mélange soustractif des courbes de réflectance, puis convertir le résultat en RVB. Il existe une autre question similaire: Stackoverflow.com/questions/10254022/ , où ce processus est discuté plus en détail.

1
Scott Burns

Se demandant si le calcul de l'inversion du travail de la valeur RVB. Comme il s'agit de la soustraction des lumières, techniquement, la partie de soustraction peut être calculée par des mathématiques simples.

Par exemple cyan + jaune

cyan = 0x00ffff jaune = 0xFFFF00

Leurs inversions sont 0xFF0000 et 0x0000FF, ce qui signifie qu'ils absorbaient complètement les lumières rouges et bleues. Leur mélange 1: 1 doit absorber la moitié des lumières rouges et bleues (car l'autre moitié du mélange peut toujours refléter une lumière rouge et bleue), ce qui est cohérent avec (0xFF0000 + 0x00FFFF)/2 = 0x7f007F. Maintenant, nous soustrayons la valeur de 0xFFFFFF que nous avons 0x80FF80 qui est vert!

1
frankli