Theoretical annex on colors

Back to Roxame colors

 

A theoretical note

By construction, every digital model has always a finite number of columns. But, beyond cetain values, and in particular for the RGB 255 model, we are beyond the differenciation capacities of the human eye, and we get the feeling of a continuous space.

From points to lines and other subsets

 

Ces palettes sont évidemment très "réductrices". Le mot même de palette est un peu trompeur. La palette d'un peintre ne comprend qu'un petit nombre de couleurs, mais il peut les mélanger et les diluer, ce qui n'est pas le cas ici, où une couleur n'est qu'un point dans l'espace à trois dimensions des couleurs.  

 

Pour retrouver cette impression de "continuité",  une des méthodes de base est de réduire l'espace des couleurs non pas à un certain nombre de points, mais à un certain nombre  de lignes, de surfaces voire de sous ensembles volumiques.

Mais il est assez peu intéressant de faire ces projections dans l'espace "technologique" qu'est le cube RGB. Il vaut mieux opérer  mais dans un espace mieux lié à notre psychologie de la vision: l'espace HSV : hue (pour ton), saturation et valeur (approximativement, luminosité). Nota : il existe d'autre espaces, par exemple HSL. Chacun a ses avantages et inconvénients.

3

Il s'agit encore d'un espace à trois dimensions, donc on peut passer de manière déterministe et sans perte ("biunivoque") de l'un à l'autre, au moyen de fonctions appropriées. Si vous avez sous la main un logiciel comme Gimp ou Photoshop, vous pouvez manipuler ces deux espaces avec le "color chooser".

Alors que l'espace RGB est un cube, l'espace HSV est un cône (ou une pyramide à base hexagonale, mais en pratique on l'utilise comme un cône). L'axe du cône est celui des valeurs (luminosités), de 0 à 255.  Autour de cet axe,  nous avons deux coordonnées ("polaires"), la distance au centre pour la saturation (de 0 à 1000) et l'angle (en degrés) pour le ton (hue). Ce dernier point correspond à une caractéristique de la vision humaine, pour qui les couleurs forment une "roue". Cela oblige souvent le programmeur à prendre des précautions.

D'une part les opérations de comparaison, de différence, d'augmentation doivent toujours se faire "modulo 360".

D'autre part, quand on transforme une couleur RGB en HSV, la saturation zéro est obtenue quand les trois valeurs R, G, B sont égales entre elles. Dans ce cas, il faut considérer que le ton n'est pas défini. Roxame le met à zéro, mais c'est dangereux, car si l'on fait ensuite un changement de saturation, on obtiendra du rouge, effet qui en général n'était pas recherché (cas des dégradés, par exemple).

De plus, le modèle ne correspond pas complètement à nos idées naturelles, puisque sur la base du cône, (valeurs 255), on retrouve les couleurs "vives" (saturées, saturation 1000) sur le tour de la base, et le blanc au centre, que notre oeil perçoit comme plus lumineux,. Tapez color_wheel pour en avoir une illustration avec deux coupes de ce cône, l'une au milieu de l'axe des valeurs, l'autre à la base (255).

Projection sur une ligne

L'exemple le plus simple est le passage au grisé (tapez graying à partir d'un document chargé)  qui projette toutes les couleurs sur l'axe des luminosités, depuis 0 pour le noir jusqu'à 255 pour le blanc. Noter que sur cet axe, à saturation zéro, le ton n'a pas de sens.

On peut imaginer un grand nombre de telles lignes. Il suffit pour cela

- soit de fixer la valeur de deux des trois paramètres et de n'en laisser jouer qu'un
. ci dessus, on a fixé sat à 0, hue n'a pas de sens, on ne joue que sur val
. on peut fixer sat et hue, et ne jouer que sur val ; on a une ligne qui va du sommet à un point de la base (pas testé) ; en général, pas très bon résultat sur parce qu'on n'a pas de blanc  ;
. on peut fixer val et hue, ne jouer que sur sat (pas testé) ; on a une ligne qui part de l'axe central, lui est perpendiculaire et va à une extrémité
. on peut fixer val et sat, et jouer sur hue .

- soit de se donner deux équations reliant les trois variables ; mais cela permet d'avoir des résultats plus riches que le simple rabattement sur une valeur ; comparez par exemple graying avec smart_graying , qui vise à retrouver la chaleur des tirages argentiques sur papier légèrement crème (quelquefois, l'effet est excessif). Il en va de même pour les camaïeux, ou toning (liste en toning.c), dont quelques uns sont assez satisfaisants, par exemple blue_toning ou sepia_toning (ils rappellent les "virages" pratiqués dans les années 30 ) d'autres plus  bizarres, comme  green_mauve_toning, ou mériteraient d'être améliorés, comme sienna_toningtoning.rd applique un de ces filtres choisi au hasard.  

helix_l est une ligne hélicoïdale avec le ton proportionnel à la luminosité, partant d'une valeur aléatoire pour val =0 et faisant un tour complet jusqu'à val 255. Résultats peu intéressants.

Plusieurs lignes

Pour l'expérience, nous avons créé la fonction ralign, qui réduit à un ensemble de lignes qui conservent la valeur du pixel d'origine, mais s'alignent sur le ton et la saturation de la couleur donnée dans la palette.  On peut tester sur une seule couleur avec rfiller

Le résultat n'est pas satisfaisant pour les couleurs claires, car alors la saturation est trop forte en général. Nous avons fait un essai en réduisant les saturations dans les valeurs claires, avec salign et sfiller

Nous avons tenté un essai plus ambitieux en construisant une série de lignes définies par quatre points : le noir, le blanc et deux couleurs intermédiaires, une plus claire et une plus foncée, choisies dans la palette complète de Roxame. L'objectif était de contourner certaines zones déplaisantes de l'espace des couleurs (jaune vif foncé).

Pour faire fonctionner :

- chercher la liste des palettes de tubes avec tubeset.c

- charger une palette de tubes avec le nom de cette palette suivi de .tb

- voir les valeurs d'un des tubes de cette palette en tapant le nom du tube suivi de .sh
- charger une image et appliquer la palette de tubes en tapant talign

A ce jour, les résultats ne sont pas convaincants, mais rien n'empêcherait de poursuivre les recherches. Il est assez facile de créer de nouveaux tubes et de nouvelles palettes en s'inspirant des palettes existantes dans le dictionnaire. Il n'est pas nécessaire d'intervenir sur le code proprement dit.

Surfaces

On conserve deux des valeurs d'origine. La réduction d'espace est encore moins forte que sur une ou plusieurs lignes. Le résultat est donc moins "stylisé".

Quelques exemples :  

plate_f , précédé d'un nombre, projette sur le plan de la valeur correspondante (tout est noir si le nombre est zéro, on est au maximum des valeurs si le nombre est 255).
plate_hf  précédé d'un nombre, projette sur le demi-plan correspondant au ton choisi (nombre entre 0 et 360). On a le même type de résultat en frappant d'abord le nom d'une couleur (par exemple green)  suivi de coulref_f.
hplane (toujours précédé d'un nombre entre 0 et 360) projette non pas sur le demi-plan correspondant au ton, mais sur le plan complet du ton et de son complémentaire. les résultats sont parfois assez jolis.  
qalign conserve la valeur, mais aligne en ton et saturation sur la couleur la plus proche dans la palette en cours. On peut tester sur une couleur déterminée avec qfiller
helix.f on projette sur une surface hélicoïdale (comme helix.l ci-dessus, mais en ne fixant pas la saturation) le hue étant proportion de la valeur. Le résultat n'a pas un grand intérêt, mais est nettement plus plaisant que la projection sur une ligne. 

Several surfaces

Projection sur des surfaces

 melon_f  précédé d'un nombre entre 0 et 360, par exemple 60 . découpe le volume par une série de tranches

A volume

shrink_f  précédé d'un nombre réduit l'espace dans toutes ses dimensions. Sans intérêt en général.

Comme il est souvent déconseillé, aux aquarellistes par exemple, d'éviter les noirs absolus, nous proposons blacksupp qui remonte proportionnellement toutes les luminosités pour ne pas avoir de valeur inférieure au nombre indiqué juste avant.

Beyond

Roxame comporte de nombreuses fonctions permettant d'agir sur les couleurs, notamment sur les luminosités (liste en tapant val_filter.c)  ou les saturations ( sat_filter.c) .

Au delà, l'action sur les couleurs dépasse les transformations point par point dans l'espace des couleurs, et prend en compte par exemple la position dans l'image, pour obtenir des dégradés.

 

Creative Commons License
This work is licensed under a Creative Commons Attribution-NonCommercial 4.0 International License.