Est-il un algorithme pour le mélange des couleurs qui fonctionne comme le mélange des couleurs réelles?

le mélange courant des couleurs RVB est très différent du mélange des couleurs pour les peintures, c'est un mélange de lumière au lieu d'un mélange de pigments.

par exemple:

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

(il doit être Bleu + Jaune = Vert)

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


mon approche

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

conversion des deux couleurs en HSV et teintes de mélange (multipliées par le coefficient calculé à partir de la saturation), et une moyenne simple pour les canaux de saturation et de valeur. Puis j'ai calculé la luminance moyenne des deux couleurs et réglé la couleur résultante pour correspondre à cette luminance. Cela fonctionnait assez bien, mais le mélange de teinte était parfois erroné, E. G.:

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

j'ai compris que parfois j'ai besoin de décaler la valeur de la teinte de 360 ° (quand la différence entre teintes supérieures à 180°).

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

mais ce déplacement n'était pas très bon non plus, 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°

(teinte 179 + Rouge) et (teinte 181 + rouge) donne deux couleurs complètement différentes.


puis j'ai essayé CIE Lab color space (comme dans Photoshop), qui est conçu pour être plus proche de la façon dont les humains percevoir les couleurs.

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

peut-être que si j'utilisais une opération différente de la moyenne, ça pourrait marcher, mais Je ne sais pas quoi.


le CMJN n'a pas fonctionné non plus. , les résultats sont exactement comme dans RGB ou LAB.


il semble que ni l'additif trivial ni soustractive le mélange des couleurs dans l'un de ces espaces de couleur donne des résultats naturels.


implémentations de Travail

Krita – Peinture mixer

Raster graphics editor Krita avait une mise en œuvre de plus réaliste mélange des couleurs à un moment donné: http://commit-digest.org/issues/2007-08-12/ (painterly mixer plugin)

ils disent qu'il est la première application publique qui met en œuvre la technologie spéciale en utilisant Kubelka et Munk équations qui décrivent le comportement des pigments.

Voici une vidéo de Krita color mixing: https://www.youtube.com/watch?v=lyLPZDVdQiQ

papier de FiftyThree

il y a aussi article sur le mélange des couleurs dans l'Application Papier pour iOS développé par FiftyThree . Ils décrivent comment ils innovent et expérimentent dans la région et offrent également des échantillons de mélange bleu et jaune qui se traduit en vert. Cependant, le processus ou l'algorithme réel n'y est pas vraiment décrit.

citant:

"Dans la recherche d'un bon mélange algorithme, nous avons d'abord essayé l'interpolation à travers différents espaces de couleurs: RGB, HSV, et HSL, puis CieLAB et CieLUV. Les résultats ont été décevants", déclare M. Chen. "Nous savons que le rouge et le jaune devraient donner l'orange, ou que le rouge et le bleu devraient faire le pourpre-mais il n'y a aucun moyen d'arriver à ces couleurs, quelle que soit la couleur-espace que vous utilisez. Il y a un axiome de l'ingénierie: faire la chose la plus simple qui pourrait fonctionner. Eh bien, nous avions maintenant essayé les approches les plus faciles possibles et ils ne se sentaient même pas à distance de droite."

il semble que même comme Krita, le papier met en œuvre le modèle Kubelka-Munk:

[...] le modèle Kubelka-Munk avait au moins six valeurs pour chaque couleur, y compris les valeurs de réflexion et d'absorption pour chacune des couleurs RVB. "Alors que L'apparition d'une couleur sur un écran peut être décrite en trois dimensions, le mélange de couleurs se produit en fait dans un espace de six dimensions", explique Georg Petschnigg, Co-fondateur et PDG de FiftyThree. Le Kubelka-Munk papier avait permis à l'équipe de traduire un problème esthétique dans un cadre mathématique. [...]

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

bien que cela ressemble à un processus compliqué, je n'ai pas encore vu beaucoup de bonnes informations sur la façon de mettre en œuvre quelque chose comme ça.


questions connexes

ces questions ont été postées après celle-ci Toutes relatives à la même chose.

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

  • calcul d'une couleur mixte en RGB
  • Algorithme pour trouver la couleur entre deux autres - dans l'espace couleur des couleurs peintes
  • mise en œuvre Kubelka-Munk comme Krita pour mélanger des couleurs comme la peinture

autres liens et Ressources connexes

  • Kubelka-Munk recherche sur Twitter
  • mélange de peintures (!!Con 2016) par Diana Liao
    • slides
    • vidéo
  • peinture inspirée mélange de couleurs et de Compositing pour la visualisation (N. Gossett, B. Chen)
54
demandé sur Tom Pažourek 2009-08-29 17:26:33

7 réponses

Le correct la réponse est NON, car il n'y a pas de correct travail modèle de la façon dont "le mélange des couleurs dans le monde réel" fonctionne vraiment. Il est beaucoup trop complexe et conditionnel et pas vraiment du tout comme la simple chose Rouge-Bleu-Jaune que nous avons appris à l'école (il nécessite en fait toute la chimie et beaucoup de Physique et de biologie à résoudre).

cependant, la réponse simpliste est: Oui, utiliser soustractive mélange plutôt que de Additif le mélange.

le mélange des couleurs que nous avons appris à l'école primaire est basé sur des combinaisons de pigments qui sont une forme de mélange des couleurs soustractive (très simpliste). C'est le plus de couleurs que nous ajoutons ensemble, le plus sombre il devient parce que chaque pigment soustrait un peu plus de lumière.

d'un autre côté, presque tous les schémas de couleurs d'ordinateur sont additif en ce qu'ils sont basés sur la combinaison des ondes lumineuses (très simpliste), de sorte qu'ils deviennent plus lumineux, parce que chaque couleur ajoute un peu plus de lumière.

le schéma RGB+ est en quelque sorte le complément additionnel au schéma soustractif que nous avons appris dans la plupart des écoles élémentaires américaines (qui est RBY-). Cependant, ils ne correspondent pas exactement et il peut être difficile pour convertir entre eux (des recherches actuellement ...)


OK, si vous voulez simplement passer de combinaisons additives en RVB à des combinaisons soustractives, vous pouvez utiliser la formule de type bayesan inverse 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

ajuster pour la différence dans les pôles chromatiques (G à Y, puis retour à G) est beaucoup plus difficile ...


Il a été souligné que cela génère Noir pour l'exemple, et techniquement c'est correct pour un vrai système soustractif, cependant, si vous voulez un système plus diluant / soustractif, vous pouvez essayer ceci à 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 du noir. Mais pour obtenir le jaune ou quoi que ce soit de proche, vous devez encore corriger le problème d'alignement des pôles de la palette de couleurs.

23
répondu RBarryYoung 2009-09-11 15:59:53

il existe deux possibilités différentes combinant les couleurs:

  1. mélange additif (comme RGB)

  2. mélange soustractif (comme CMYK)

donc dans le mélange de couleurs soustractive le résultat est ce que vous attendiez, mais il n'y a pas de bleu, à la place il y a cyan:

Jaune + cyan = Vert

en général, le mélange soustractif des couleurs est simplement" enlever " (filtrage) du blanc alors que le mélange additif des couleurs s'additionne à partir du noir. (les couleurs de base de soustractive sont inverses de l'additif: Rouge ->cyan; Vert->magenta; Bleu->Jaune)

donc si vous commencez avec écran blanc appliquant des filtres:

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

5
répondu Peter Parker 2009-08-29 13:46:48

il y a un code pour mélanger les couleurs de manière réaliste à krita: https://projects.kde.org/projects/calligra/repository/revisions/master/show/krita/plugins/extensions/painterlyframework .

noter que le code incluant le fichier illuminants est GPLv2+. Il peut convertir de RVB en longueurs d'onde, faire la composition et convertir en arrière.

2
répondu Boudewijn Rempt 2012-04-21 06:22:18

je pense que votre problème avec la combinaison des teintes est que vous le faites en additionnant les deux angles et en divisant par deux. Comme vous l'avez remarqué, le résultat n'a souvent aucun sens. Je pense que vous feriez mieux de convertir les angles en coordonnées cartésiennes sur le cercle de l'Unité, de faire la moyenne de ceux-ci, et de trouver l'angle du point résultant (en ignorant la magnitude).

1
répondu Stefan Vorkoetter 2011-12-21 18:40:37

une façon de faire un mélange soustractif de couleurs RVB est d'abord de convertir les couleurs RVB en courbes de réflectance spectrale. La conversion est assez simple, et une fois que vous l'avez fait, vous pouvez faire un mélange soustractive vrai des courbes de réflectance, puis convertir le résultat en RVB. Il y a une autre question semblable: stackoverflow.com/questions/10254022 / , où ce processus est examiné plus en détail.

1
répondu Scott Burns 2017-05-23 11:54:59

se demandant si le calcul de l'inversion de la valeur RVB travail. Puisqu'il s'agit de la soustraction des lumières, techniquement la partie soustraction peut être calculée par simple mathématique.

par exemple cyan + yellow

cyan = 0x00ffff jaune = 0xffff00

leurs inversions sont 0xff0000 et 0x0000ff, ce qui signifie qu'ils ont complètement absorbé les lumières rouges et bleues. Leur mélange 1:1 devrait absorber la moitié des lumières rouges et bleues (puisque l'autre la moitié du mélange peut encore refléter un peu de lumière rouge et bleue), ce qui est compatible avec (0xff0000 + 0x00ffff) / 2 = 0x7f007f. Maintenant nous soustrayons la valeur de 0xFFFF nous avons 0x80ff80 qui est vert!

1
répondu frankli 2016-10-13 03:16:25

Cochez cette mise en œuvre additive, soustractive et autre mélange alghoritms.

est entièrement fonctionnel (écrit en java), donc vous pouvez tester toutes les couleurs que vous avez besoin de mélanger, et voir si cela correspond à vos besoins.

Que d'autres réponses pointues, Bleu + Jaune (exactement Cyan + Jaune ) est Vert sur substrat CMJN alghoritm. Voir par vous-même

-1
répondu albfan 2017-05-23 12:02:46