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.
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_toning. toning.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.