- La frontière en fer à cheval du diagramme de chromaticité xy CIE 1931 ne vient pas d’une formule arbitraire, mais des fonctions de correspondance colorimétrique qui mesurent la manière dont l’humain perçoit relativement les lumières rouge, verte et bleue
- Les données CIE RGB proviennent d’expériences où l’on ajuste des sources lumineuses de 700 nm, 546 nm et 435 nm pour les faire correspondre à des couleurs spectrales ; certaines valeurs négatives à certaines longueurs d’onde montrent qu’il existe des couleurs impossibles à reproduire avec du RGB pur seul
- L’espace colorimétrique XYZ est un standard obtenu par transformation linéaire du RGB afin de manipuler plus facilement uniquement des valeurs positives, et projette les valeurs 3D en coordonnées de chromaticité 2D avec
x = X/(X+Y+Z), y = Y/(X+Y+Z)
- Les couleurs à l’intérieur du diagramme peuvent être approchées non pas en les calculant directement depuis
x, y, mais en construisant plusieurs formes de lignes spectrales, en les multipliant par les fonctions de correspondance colorimétrique puis en les intégrant avant de les placer en coordonnées xy
- Les écrans réels sont limités à des espaces colorimétriques d’affichage comme sRGB ou display-p3 ; beaucoup de couleurs proches de la frontière ne peuvent donc pas être affichées fidèlement, ce qui provoque du clipping ou la saturation de certains canaux
Point de départ du diagramme en fer à cheval
- Quand on cherche à comprendre l’espace colorimétrique CIE 1931 XYZ, on rencontre sans cesse le diagramme de chromaticité, un graphique qui représente la qualité de la couleur indépendamment de la luminance
- Les bords sont liés à des couleurs spectrales de longueurs d’onde précises, mais la forme globale et les couleurs internes ne s’expliquent pas par une simple formule du type
x = func(y)
- La forme essentielle vient de la façon dont l’être humain perçoit le rouge, le vert et le bleu les uns par rapport aux autres, et les couleurs internes peuvent être rendues en image 2D à l’aide des mathématiques du mélange des couleurs et d’un échantillonnage de points
Fonctions de correspondance colorimétrique et CIE RGB
- Les fonctions de correspondance colorimétrique indiquent dans quelle mesure il faut ajuster l’intensité de sources rouge, verte et bleue pour qu’une couleur cible d’une longueur d’onde donnée paraisse identique à l’œil
- Les fonctions de correspondance colorimétrique RGB de la CIE 1931 s’appuient respectivement sur des sources rouge, verte et bleue de 700 nm, 546 nm et 435 nm
- L’expérience consiste à placer la source lumineuse cible d’un côté, puis à laisser une personne ajuster directement les sources RGB de l’autre côté jusqu’à obtenir la même couleur
- Ces données contiennent des valeurs comme un rouge négatif
- Une source lumineuse négative ne peut pas exister physiquement
- Cela signifie que certaines couleurs spectrales ne peuvent pas être reproduites avec de simples sources RGB pures
- Malgré cela, après transformation, ces données restent utiles pour les calculs dans l’espace colorimétrique
Espace colorimétrique XYZ et coordonnées de chromaticité xy
- L’espace colorimétrique XYZ est une transformation linéaire par matrice de l’espace RGB ; c’est presque une réorganisation de la même information dans un autre repère plus pratique à calculer
- En utilisant la matrice de transformation RGB de Wikipedia, on peut comparer les données des fonctions de correspondance colorimétrique XYZ au graphe RGB
matrix = [
2.364613, -0.89654, -0.468073,
-0.515166, 1.426408, 0.088758,
0.005203, -0.014408, 1.009204
]
[R, G, B] = matrix * [X, Y, Z]
- XYZ peut servir d’espace standard pour décrire toutes les couleurs, y compris celles qu’un dispositif d’affichage ne peut pas produire directement
- Chaque appareil doit interpréter ces valeurs dans l’espace colorimétrique qu’il est physiquement capable d’afficher
- Plus le gamut de l’appareil est large, plus il peut restituer de couleurs à partir de la même information colorée
- Les coordonnées de chromaticité xy se calculent en divisant les valeurs XYZ par leur somme totale
const x = X / (X + Y + Z)
const y = Y / (X + Y + Z)
const z = Z / (X + Y + Z) = 1 - x - y
z peut être déduit de x et y, il est donc généralement omis dans le diagramme de chromaticité xy
- Pour revenir de
xy à XYZ, il faut une valeur Y ; la représentation qui l’inclut est l’espace colorimétrique xyY
Pourquoi cela ressemble à un fer à cheval
- Quand on projette en xy les données des fonctions de correspondance colorimétrique RGB, le contour familier du diagramme de chromaticité commence à apparaître
- Les données RGB comportent une zone négative sur l’axe x à cause de couleurs impossibles, et la transformation vers XYZ donne une forme plus proche du fer à cheval familier
- Si l’on rend directement en xy les données tabulaires des fonctions de correspondance colorimétrique XYZ, on retrouve la même forme
- La forme est directement dérivée des courbes des fonctions de correspondance colorimétrique XYZ
- Pour chaque longueur d’onde, on calcule la proportion de
X, Y et Z dans le total
- En plaçant des points selon ces proportions, on obtient la frontière de chromaticité
- Si l’on applique la même procédure à des fonctions de correspondance colorimétrique inventées arbitrairement, on obtient des formes totalement différentes ; la forme réelle en fer à cheval est donc le résultat de fonctions dérivées d’expériences sur la vision humaine
Une méthode d’approximation pour remplir les couleurs internes
- Avec les seules coordonnées
x, y, on ne peut pas déterminer immédiatement si un point correspond à une couleur valide, ni quelle couleur utiliser pour l’approcher
- On peut au contraire créer des valeurs XYZ arbitraires ou un spectre, les convertir en coordonnées xy, puis les placer sur le diagramme
- L’idée clé consiste à générer des formes de lignes spectrales
- On crée une ligne sur tout l’axe des longueurs d’onde indiquant la contribution de chaque longueur d’onde à la couleur
- On multiplie cette ligne par les fonctions de correspondance colorimétrique XYZ, puis on intègre pour obtenir la valeur XYZ finale
- De la même manière, on la multiplie par les fonctions de correspondance colorimétrique RGB, puis on intègre pour obtenir les valeurs RGB
- On convertit ensuite les valeurs XYZ obtenues en xy pour les placer sur le diagramme de chromaticité
- En faisant varier le décalage et la largeur de deux courbes sinusoïdales, on génère différentes lignes spectrales, qui produisent à leur tour différentes couleurs et positions sur le diagramme
- La démo automatisée fait varier décalage et largeur pour balayer plus largement l’espace, mais elle ne remplit pas complètement tout l’espace colorimétrique
- Une démo CodePen est proposée pour expérimenter directement
Affichage à l’écran et contraintes des espaces colorimétriques
- Pour afficher les valeurs XYZ calculées à l’écran, il faut les convertir vers un espace de rendu réel comme sRGB
- Le
rgb() du navigateur suppose sRGB ; il faut donc tenir compte de la correction gamma lors de la conversion de XYZ vers RGB
- display-p3 est un espace colorimétrique au gamut plus large que sRGB, pris en charge par de nombreux navigateurs et écrans
- En CSS, on peut spécifier une couleur display-p3 avec la forme
color(display-p3 r, g, b)
- L’espace colorimétrique p3 du navigateur utilise la même correction gamma que sRGB, il faut donc aussi l’inclure pour que les couleurs soient rendues correctement
- Sur les navigateurs et écrans wide gamut, on peut voir des couleurs plus intenses, mais cette expérience ne permet pas de conclure avec certitude comment le p3 est transmis dans une capture d’écran ou lors d’un partage d’écran Zoom, ni à quel moment il est converti en sRGB
Pourquoi les couleurs ne sont pas totalement exactes
- Si l’on convertit directement les couleurs internes depuis des valeurs XYZ avec
XYZ_to_sRGB, beaucoup sortent de la plage 0–255 et donnent un résultat excessivement saturé
- Obtenir les couleurs non pas directement depuis XYZ, mais en multipliant une ligne spectrale par les fonctions de correspondance colorimétrique RGB puis en intégrant, ressemble à une meilleure interpolation
- Malgré cela, une part importante des couleurs générées reste constituée de valeurs RGB invalides
- Si l’on n’affiche pas les couleurs hors de la plage 0–255, il ne reste que le triangle sRGB familier
- Les couleurs en dehors du triangle ne peuvent pas être affichées exactement, mais lorsque seulement un ou deux canaux RGB sont saturés, les variations des autres canaux peuvent encore rendre une certaine différence de couleur visible
Ressources associées
1 commentaires
Avis sur Hacker News
La façon la plus courante de tracer la chromaticité sur une grille de coordonnées cartésiennes prête pas mal à confusion. Les diagrammes de chromaticité utilisent des coordonnées barycentriques, et la forme étrangement déformée du diagramme de chromaticité XYZ classique me semble davantage être une distorsion due au mode de représentation qu’une propriété réelle des données.
Il est plus naturel de voir le diagramme de chromaticité comme une section plane 2D passant par les trois vecteurs unitaires standards dans un espace colorimétrique 3D, et une représentation en triangle équilatéral comme [1] l’illustre bien. Cela rend aussi plus clair que l’ensemble du gamut dans l’espace XYZ n’a pas une forme arbitrairement écrasée, mais qu’il a été choisi délibérément pour remplir assez bien l’octant positif dans les limites de la vision humaine.
[1] : https://physics.stackexchange.com/questions/777501/why-is-th...
Les axes X, Y, Z eux-mêmes étant dans une certaine mesure arbitraires, représenter xy dans un triangle équilatéral n’est pas intrinsèquement plus juste que de le représenter dans un triangle rectangle isocèle. Utiliser des coordonnées plus proches des réponses des cônes pourrait être conceptuellement plus clair, mais ce type de représentation 2D peut de toute façon induire en erreur les personnes qui ne comprennent pas en profondeur le fonctionnement de la vision et ce que signifie le graphique.
https://www.w6rz.net/chromacity.mp4
Cette version particulière du diagramme de chromaticité donne l’impression que les couleurs absentes des écrans ressemblent à divers verts de pointeurs laser. En réalité, il manque aussi beaucoup de rouges et de bleus, à cause de primaires rouge et bleue très saturées, trop sombres par unité d’énergie pour être utilisables.
Référence : https://nanosys.com/blog-archive/2012/08/14/color-space-conf...
En fabriquant des images stéréoscopiques rouge-cyan, j’ai appris beaucoup plus que je ne le voulais sur la gestion des couleurs. J’avais demandé du rouge sRGB, mais sur un moniteur à large gamut j’obtenais quelque chose comme (180,16,16), ce qui provoquait beaucoup de diaphonie entre les canaux. En ce moment, je travaille avec une amie couturière sur du tissu imprimé sur mesure, et le jaune d’un motif floral se transforme apparemment en orange pendant le traitement ; j’essaie donc de finir le débogage et les corrections avant de passer commande. Je continue à en apprendre beaucoup trop sur la gestion des couleurs.
Mais la perception visuelle va bien au-delà de ce que les cônes de l’œil peuvent physiquement voir. Derrière, il y a tout le cerveau qui interprète les phénomènes du nerf optique. Pour un exemple amusant de stimulation cérébrale, il faut chercher les couleurs chimériques, que les cônes ne peuvent pas détecter physiquement mais que l’on peut voir. Par exemple : le bleu stygien, le rouge autoluminescent ou l’orange hyperbolique.
† : https://www.perplexity.ai/search/please-provide-chimerical-c...
W : https://en.wikipedia.org/wiki/Impossible_color
Exemple : https://ctnbee.com/en/upload
Une autre exploration intéressante des espaces colorimétriques : https://ericportis.com/posts/2024/okay-color-spaces/
À ceux qui pensent que le violet/magenta n’est pas une « vraie » couleur, j’ai envie de dire qu’aux courtes longueurs d’onde, le rouge X décroît plus lentement que le bleu Z, ce qui permet d’obtenir sous 400 nm une couleur violet/magenta saturée, monochromatique et de forte puissance. Elle n’est pas bien représentée dans les diagrammes de saturation standards, n’est pas efficace pour les moniteurs, et, comme même le bleu, elle est dangereuse à regarder longtemps. Si tu vois un laser violet/magenta monochromatique, détourne la tête ou ferme les yeux.
Excellent. Cela m’a donné une idée sur la couleur, la perception et les gamuts.
En bref, imaginons qu’une certaine combinaison de longueurs d’onde lumineuses te fasse percevoir l’odeur d’un fromage affiné, tandis qu’une autre te fasse penser qu’il y a un ours derrière toi. Alors le diagramme devrait inclure non seulement des pixels de couleur, mais aussi de petites images de fromage et d’ours aux endroits où ces perceptions précises se produisent.
Je pense qu’en réalité, le magenta est quelque chose de cet ordre. C’est une couleur absente du spectre, et plutôt une impression ou une sensation que le cerveau fait simplement percevoir comme une couleur de plus pour ne pas être trop submergé. Cela me semble aussi assez proche d’une description de phénomènes réels chez les personnes ayant différents degrés de synesthésie — si l’on me permet le jeu de mots, les personnes situées sur le spectre de la synesthésie.
Partir de XYZ peut convenir, mais il existe désormais des espaces colorimétriques bien meilleurs, qui correspondent mieux à notre vision. Notamment CIE 1976 L',u',v', et plus récemment l’ICtCp issu des recherches de Dolby
De même, si l’on trace les couleurs correspondant à des longueurs d’onde pures puis que l’on prend leur enveloppe convexe, on obtient l’ensemble de l’espace des couleurs physiquement possible. Cette propriété est difficile à reproduire correctement dans d’autres espaces colorimétriques ; au mieux, on peut obtenir quelque chose comme une transformation linéaire. XYZ est déjà une telle transformation et possède presque toutes les propriétés souhaitables pour un choix de base
https://giannirosato.com/blog/post/jpegli-xyb/
Je me demande s’il existe un espace colorimétrique « pédagogique », optimisé pour l’enseignement et l’apprentissage. Un espace qui privilégie l’exactitude plutôt que des mathématiques simples, et dont les caractéristiques visibles seraient des propriétés réelles de la perception humaine, et non des « artefacts du modèle »
Idéalement, il couvrirait tout le gamut, fonctionnerait bien jusqu’au locus spectral, et les teintes ainsi que les mélanges de couleurs seraient en partie linéaires. Quelque chose d’analogue au rôle qu’occupait Munsell, mais couvrant tout le gamut et adapté au XXIe siècle. Dans le cadre d’un projet parallèle autour de l’idée « pourrait-on mieux enseigner les couleurs en mettant l’accent sur le spectre ? », je n’ai rien trouvé de proche, donc j’ai assemblé une solution provisoire. J’ai utilisé CAM16UCS comme candidat moderne d’espace perceptuel, Jzazbz pour démêler la teinte linéaire, fait un sanity check de luminance absolue, et j’ai assez arbitrairement écrasé une étrange queue bleue près du locus, que je comprenais comme non perceptuelle dans CAM. L’implémentation se fait avec une lookup table. Si quelqu’un connaît des travaux connexes, ça m’intéresse
Hellwig et Fairchild ont récemment simplifié mathématiquement le modèle tout en améliorant la précision de la saturation (http://markfairchild.org/PDFs/PAP45.pdf). Comme modèle plus simple, il y a CIELAB, qui produit les paramètres L, a, b. Ici, L est la clarté, hypot(a,b) la saturation, et arctan2(b,a) la teinte
Un meilleur choix pourrait être l’espace colorimétrique de Munsell. Munsell a divisé l’ensemble du domaine des couleurs en des milliers de petites zones, et la distance entre chacune était une unité de « différence tout juste perceptible », déterminée par des tests utilisateurs minutieux. La région des verts était donc beaucoup plus grande que celle des jaunes. Le processus de développement de cet espace colorimétrique est lui aussi très intéressant ; il était peintre, mais son travail a ouvert la voie à des espaces colorimétriques plus modernes
Une « source lumineuse rouge négative » signifie que le sujet tournait un bouton ajoutant de la lumière rouge à la couleur qu’il essayait d’apparier
En gros, on a une couleur inconnue C et une couleur R+G+B. Parfois, l’appariement est impossible, donc on essaie de faire correspondre C+R = G+B. Dans ce cas, comme on ajoute R de l’autre côté de l’équation, on obtient un R « négatif ». La même chose arrive aussi avec le vert et le bleu, mais dans une moindre mesure
C’est globalement juste, mais dans la dernière section, je ne comprends pas bien la partie où l’auteur génère des spectres à deux pics et les projette sur le diagramme de chromaticité pour remplir l’intérieur du locus. Je ne vois pas pourquoi il fait ça
À mon avis, la méthode à suivre serait la suivante. D’abord, choisir une valeur Y comme luminance du diagramme, puis, pour chaque pixel à l’intérieur de la zone délimitée par le locus spectral et la ligne des pourpres, prendre les coordonnées x, y. Ces trois valeurs définissent une couleur dans l’espace colorimétrique CIE xyY, et la conversion de xyY vers XYZ est simple : X = Y / y * x, Y = Y, Z = Y / y * (1 - x - y). Ensuite, on mappe les valeurs XYZ vers l’espace colorimétrique de l’image de sortie, par exemple sRGB. Si une valeur XYZ donnée sort de la plage [0,1] de sRGB, elle est hors du gamut sRGB, et il suffit donc de la clipper vers la valeur valide de gamut la plus proche
Le problème, c’est « chaque pixel à l’intérieur de la zone ». J’aurais pu faire ça puis découper la sortie selon cette forme, mais cela revient à découper la sortie avec la forme elle-même, et ça n’explique absolument pas pourquoi elle a cette forme. Ça me semblait artificiel. Cela dit, c’est apparemment la méthode la plus courante. J’ai essayé de comprendre une approche plus rigoureuse, et la méthode consistant à générer des spectres pour remplir l’intérieur est décrite ici : https://clarkvision.com/articles/color-cie-chromaticity-and-...
Cette approche me paraît plus rigoureuse, mais le clipping est probablement aussi une méthode « suffisamment correcte »
J’ai une question pour les personnes qui connaissent bien la science des couleurs. Je lis les données brutes de Guild https://royalsocietypublishing.org/doi/pdf/10.1098/rsta.1932..., et j’ai du mal à comprendre ce que signifient les nombres du tableau 4
Je me demande si quelqu’un comprend toutes les colonnes qui s’y trouvent. En particulier, je cherche les coefficients non normalisés issus de l’expérience de correspondance des couleurs, ou bien une méthode pour dénormaliser ces coefficients. Les coefficients dont je parle sont les coefficients trichromatiques u{a,b,c}_\lambda du tableau 3. Je ne sais même pas si ces données figurent dans le tableau 4, donc il s’agit peut-être de deux questions différentes
L’explication me paraît simple. La couleur, c’est de la lumière, et c’est quelque chose de linéaire qui va de l’ultraviolet au bleu, au vert, au jaune, au rouge, puis à l’infrarouge. C’est juste une ligne
Dans la réalité physique, il n’existe pas de lumière violette. Quand l’œil reçoit en même temps de la lumière rouge et bleue, l’esprit fabrique toute la gamme des violets et des magentas entre le bleu et le rouge. Donc, pour inclure le magenta, il faut tracer une autre ligne entre le bleu et le rouge. Autrement dit, il faut courber la ligne des couleurs réelles, et c’est exactement ce qu’on voit dans le diagramme de chromaticité
C’est pourquoi j’ai écrit « lumière “rouge” » plutôt que « lumière rouge ». J’ai associé le spectre physique à une échelle de gris selon les axes nm et énergie, et le spectre perceptif à des couleurs selon l’angle de teinte et la luminance. Les deux peuvent être enroulés dans un espace colorimétrique perceptif à trois dimensions, et l’on peut aussi interpoler le spectre physique des nm vers les teintes. On peut également le disposer le long d’un espace dichromatique à deux dimensions, celui des mammifères non primates, afin de souligner la dépendance au système nerveux. Les idées fausses sur la couleur sont tellement répandues, de la maternelle jusqu’au doctorat, qu’il est utile d’être extrêmement prudent pour gagner en clarté
Dans l’optique évoquée par l’expression « réalité physique », il n’y a en fait aucune couleur. C’est l’esprit qui fabrique toutes les couleurs. Attribuer à la lumière une propriété de couleur indépendante du sujet percevant est une erreur de catégorie. En science des couleurs, ce qu’on appelle ici réalité physique se nomme plus précisément la distribution spectrale de puissance du rayonnement électromagnétique dans le domaine visible. Dans la mesure où ce rayonnement stimule la réponse chromatique du système visuel humain, la lumière violette existe bel et bien. Elle n’est simplement pas simulée par un rayonnement unique dans une bande de longueurs d’onde étroite
La « frontière des pourpres » en bas du diagramme en fer à cheval de la CIE montre la frontière perceptive produite par des stimuli de grandes et de courtes longueurs d’onde, c’est-à-dire par le mélange de primaires rouge/bleu. Mais supposer que la lumière possède une couleur naturelle est une description de la réalité très anthropocentrée. D’autres organismes ont des réponses caractéristiques très différentes de celles des humains. Il suffit d’imaginer des sens sensibles à la polarisation. Si la roue chromatique des artistes est circulaire, c’est parce que, dans l’esprit des artistes, la couleur apparaît ainsi comme un quale. La physique des qualia relève davantage de la complexité des réponses internes de l’organisme que des stimuli externes. Parler de la couleur de la lumière est une expression de sens commun, mais elle attribue excessivement des caractéristiques humaines à la physique du stimulus. Il faut expliquer les choses aussi simplement que possible, mais pas plus simplement que cela
Une explication qui voit la « couleur réelle » comme une propriété de la lumière plutôt que comme une perception crée davantage de malentendus qu’elle n’apporte de clarté