Calcul d'un mélange de couleur de RVB
Je veux être capable de prendre deux RVB-256 vecteurs et de calculer le résultat de leur mélange. Aussi je veux être en mesure de donner à chaque vecteur de poids différents. J'ai expérimenté avec l'aide de la Parole de couleur de la plaque, et j'ai vu que certaines couleurs ne mélange selon une moyenne pondérée:
0.5*red(255,0,0) + 0.5*yellow(255,255,0) = orange(255,127,0)
d'autres n'ont pas:
0.5*yellow(255,255,0) + 0.5*blue(0,0,255) = gray (127,127,127)
et pas green (0,255,0)
Est-il un algorithme pour le calcul précis de toutes les couleurs ou suis-je obligée de le faire à l'aide d'une table?
Vous devez vous connecter pour publier un commentaire.
La meilleure explication est que la Modèle de couleur RVB est un peu peu intuitive pour nous les humains.
Il est parfaitement logique pour un affichage vidéo de l'appareil (tel qu'un moniteur ou télévision), qui ne sait comment faire pour afficher les couleurs en mélangeant des quantités variables de 3 pré-définis couleurs: rouge, vert et bleu. Mais ce n'est pas la façon dont vous et j'ai appris à mélanger les couleurs à l'école primaire.
En RVB, les couleurs, le blanc est représenté comme (255, 255, 255), ce qui équivaut à "tout de suite." La totalité de la valeur pour chacun des rouge, vert et bleu de la couleur des composants s'affiche, ce qui crée une forte intensité de la lumière que nous percevons la couleur que le blanc. À l'inverse, la couleur noire (0, 0, 0) est l'état "par défaut" de l'écran de l'appareil—en l'absence de la lumière de couleur est affichée ("0"), le résultat est noir, ou l'absence de couleur.
Lorsque vous pleinement mélange jaune (255, 255, 0) et bleu (0, 0, 255), vous obtenez la couleur représentée par (255, 255, 255), ou blanc. Quand vous multipliez blanc par 0,5, vous obtenez une couleur grise, parce que 255 * 0.5 = 127.
C'est probablement plus d'une anomalie que tout ce que vous obtenir le résultat escompté lors mélange de rouge et de jaune. Rouge + jaune (510, 255, 0), de sorte que lorsque vous le multipliez par 0,5, vous obtenez orange (255, 127, 0).
Il s'avère que ce que vous et j'ai appris à l'école primaire est vraiment plus précisément connue comme une soustractive modèle de couleur, par rapport à la additif modèle de couleur utilisé par RVB. En regardant les deux diagrammes en bas, vous verrez le modèle de couleur RVB (additif) sur la gauche, contre le modèle de couleur CMYK (soustractive) sur la droite. Vous devriez être en mesure de voir immédiatement le problème. À l'aide d'un modèle de couleurs soustractives au lieu de cela va produire les résultats que vous voulez.
EDIT: bien sûr, c'est plus facile à dire qu'à faire. C'est, même si vous adoptez le modèle de couleur CMYK, au lieu de RVB (ce qui est déjà difficile, parce que les conversions de RVB vers CMJN sont fortement dépendant du périphérique et loin d'être simple), ce sera sans doute encore satisfait pas à l'envie de mélanger le bleu pur (0, 0, 255) avec le jaune pur (255, 255, 0) et vert. CMJN utilise le cyan, le magenta et le jaune, comme les 3 couleurs primaires, au lieu de rouge, de jaune et de bleu. Et vous avez un beaucoup de travail qui vous attend si vous voulez aller sur la mise en œuvre de la RYB modèle de couleur dans la langue de votre choix.
Je ne sais pas du tout un tel algorithme pour combiner les couleurs RVB de façon réaliste. J'ai été de tenter dans ma réponse à expliquer pourquoi il serait impossible, ou très difficile, à tout le moins. Vous pouvez laisser cette question ouverte quelques jours de plus et voir si quelqu'un d'autre a des idées, mais je préfère aller de l'avant et commencer à le look-up table) si vous avez besoin de coller avec le modèle RVB. 😉
Sur cette base documenté réponse et ce alghoritm au courant de la réponse, j'ai essayé une interface simple pour mélanger les couleurs à l'aide additive et soustractive l'approche.
Vous devez confirmer que les couleurs primaires RVB et CMJN vous donne les couleurs secondaires dans la première réponse diagrammes:
Fondamentalement, Ce sont comme de la logique ET de et de la logique OU. (Pas exactement)
Basé sur cette vous pouvez obtenir des couleurs tertiaires à partir de mélange de primaire et secondaire des couleurs, je fais donc une petite application qui fonctionne plutôt bien:
Il y a également un diluant/soustractive alghoritm mentionné sur la deuxième cité de réponse, mais je ne peux pas dire ce que C'est basé sur, juste ajouté de test.
La solution est de changer de couleur RVB espace vectoriel dans l'un que de l'additif, puis le reconvertir en RVB. Dans ce nouveau vecteur de l'espace, lorsque vous ajoutez deux vecteurs elle prend en compte l'additif propriétés de la lumière et notre perception de la couleur pour produire un additif de couleur.
Il s'avère que la CIE XYZ espace vectoriel fonctionne bien à cet effet.
XYZ vecteurs sont des additifs dans cet espace, et de mélanger les sources de lumière ne.
Voir ce document sur le mélange des couleurs par les Cris:
Vous pouvez alors modifier la base arrière de RVB. Il y a beaucoup de bibliothèques disponibles pour changer de couleur entre les espaces vectoriels et CIEXYZ est standardisé et largement soutenu.
Cette méthode produit des résultats réalistes qui répondent à la plupart de mes besoins.
Plus d'informations sur Espace colorimétrique CIE 1931.
Regarder Cody Gris de la réponse, je pense que je peux suggérer comment combiner les couleurs. La conversion de roue de couleur de RVB:
Sans complications, les couleurs peuvent être combinées: inverser les couleurs, ajoutez-les ensemble et à inverser le résultat (ActionScript):
De sortie:
Voir si l'ajustement pour vous.
Edit: je ne suis pas feignant c'est physiquement correct, c'est juste une tentative de rapprocher. L'idée de la table de recherche des sons de fou pour moi pour deux raisons: elle dépend de deux arguments, donc sa sera de grande taille; et les lois de la nature sont généralement en continu sans ou rares cas de coin. Si vous pouvez remplir une table de recherche, vous devez connaître l'algorithme - donc, il suffit d'écrire une fonction pour cela.
(0, 0, 255)
+ jaune(255, 255, 0)
. Inverser les couleurs:(255, 255, 0)
+(0, 0, 255)
. Ajoutez-les ensemble:(255, 255, 255)
. Inverser le résultat:(0, 0, 0
). Je me retrouve avec des noir, au lieu de le résultat attendu de vert.Je ne pense pas que les réponses ci-dessus de donner des résultats de mélange.
J'ai travaillé sur ce problème avec les deux RVB et RYB (après la conversion de RVB). La conversion de RVB à RYB est bonne ici: http://www.insanit.net/tag/rgb-to-ryb/ (je vais partager mon code sur demande).
Si le mélange que la lumière, c'est pas trop mal (voir ci-dessous). Si vous voulez mélanger physique des matériaux tels que de la peinture c'est un peu plus compliqué - je travaille sur une application pour l'explorer.
Revenir à la question initiale - voici mon code pour le mélange de RVB. Les directives rgbcolor est une classe personnalisée, mais je pense que cela a du sens sur son propre:
127,255,0
et0,255,0
j'ai eu127,510,0
- ce qui est faux?c1 = c1Total/sqrt((sqrt(count)));
travail, quand je vais le mélange de 4 couleurs ou rouge (tous les 4 mêmes 255,0,0), alors votre résultat sera1020/sqrt((sqrt(4)))
qui est721.2489168102785
, bien au-dessus de 255..!?Ici est une implémentation Java de Kubelka-Munk Théorie de la Réflectance pour mixage des couleurs RVB. Cette implémentation utilise une version simplifiée de la Kubelka-Munk modèle qui suppose que toutes les couleurs ont la même concentration lors de la fusion et que toutes les couleurs sont opaques.
https://github.com/benjholla/ColorMixer
Je voulais juste faire remarquer pourquoi vous obtenez gris lorsque vous ajoutez Bleu. C'est parce que vous ajoutez Bleu, et pas Cyan:
Ou, plus mathématiquement:
Vous ajoutez Bleu, quand vous pensez à l'ajout de Cyan.
De mélange (jaune= rouge+vert) et bleu ne donner de la couleur blanche comme pour la physique, voir http://en.wikipedia.org/wiki/Additive_color .
Le "Jaune" dans le modèle RVB est pas le même que le Jaune dans la RYB modèle qui, lorsqu'il est mélangé avec du Bleu est censé donner Verte.
À titre d'exemple: (255, 255, 0) est environ deux fois plus "intense" que (0, 0, 255) dans le modèle RVB, tandis que dans RYB modèle, des quantités ÉGALES de Jaune et de Bleu est censé donner Vert.
De la même façon, le Rouge et le Bleu dans les deux modèles sont différents.
Penser à eux comme vecteur espaces RVB et R Y B'.
Si une sorte de relation comme:
détient, vous pouvez faire votre algèbre en convertissant d'abord les couleurs individuelles (opérandes) à partir de RVB pour R Y B' espace.
Il y a 9 inconnues (i,j,k variables), de sorte que vous besoin de 9 équations (3 couleurs égalités dans ces 2 espaces).
Malheureusement, je pense que que les modèles ne sont pas à l'échelle linéaire, et donc pour la précision que vous pourriez avoir à utiliser les tables de recherche.
Une autre bonne idée peut-être pour convertir VHS ou YCbCr de l'espace, parce que la couleur de l'information est plus clairement prélevée dans ceux de l'espace. (Si un RVB à RYB conversion n'existe pas, RVB->Format->RYB route peut être plus facile à trouver).
Avoir le même problème avec le mélange de couleurs sombre ou clair à thème dans mon application, je cherchais une solution rapide et facile.
Thème foncé, j'ai simplement ou souhaitez les couleurs RVB et le résultat a été assez ok, cependant, à la lumière du thème ce qui a entraîné de très les couleurs de lumière en devient invisible.
J'ai simplement essayé et avait des couleurs et cela a fonctionné assez bien. bleu + jaune m'a donné le vert, le magenta et le cyan m'a donné du bleu au moins.
Donc dans le thème sombre (retour en arrière-plan) je n':
À la lumière du thème:
Il est peu probable que tout réalisme dans le mélange, mais pour mon besoin (loin de logiciels de photographie) qui a été très satisfaisante.
Beaucoup a déjà été dit sur la question, mais je voulais juste partager une façon de mélanger les couleurs (en tenant compte d'un travail avec la lumière: plus scheme).
J'ai essayé le code d'exemple de Damien Del Russo qui semblait une approche agréable à mon goût à l'aide de blanc moyenne pour calculer rvb mélanger. J'ai voulu comparer les résultats par rapport à mon propre (unités de base & linéaire) du code.
Ancien code, malheureusement, peut renvoyer des valeurs qui dépasse 255 dans certains cas... Mais dans ces cas, le résultat est le même pour moi, si le ratio est appliqué pour revenir à la plage de 0 à 255.
Pour les autres cas (surtout avec un blanc composant), je peux voir quelques différences dans les résultats. La différence est plus sur la luminosité de chromaticité.
Si j'essaie de l'échelle des valeurs-je obtenir, je me sens très proche de l'ancien code...
Je ne suis pas encore sûr, le mode de calcul donne des résultats plus proches en termes de luminosité, mais si j'obtiens une réponse, je vais mettre à jour ce post pour partager les résultats.
Sachant que, voici mon inachevé code (en python, comme c'est mes principes banc d'essai) de mélange de n, n-uplets de couleurs rvb:
mixage couleurs ajouter lumière rgb python