Filtres TSV

Nous cherchons maintenant à créer des filtres en TSV.

Mais pour cela il nous manque une fonction essentielle : celle qui à partir d'une couleur RVB renvoie cette même couleur exprimée dans l'espace TSV.

RVB vers TSV

Voici l'algorithme le plus "dur" et le moins assisté du tutoriel ! Une fois ce sous-chapitre passé vous allez pouvoir vous amuser ;) .

Renverser les étapes de l'algorithme

L'algorithme d'avant consistait à sélectionner une couleur sur la roue des couleurs, puis d'appliquer une saturation et une valeur. Nous allons donc aller dans l'autre sens :

1) Étudier la formule de la Valeur et de la Saturation

Vous devez étudier les barycentres que vous avez écrit pour retrouver les variables de $\text{Saturation}$ et de $\text{Valeur}$ (qui sont désormais inconnues) à partir des autres qui sont maintenant connes.

Vous allez devoir raisonner de la même façon que le passage du mitigeur au mélangeur en essayant de renverser les formules trouvées auparavant.

Les formules que vous trouvez doivent faire ressortir le fait qu'échanger les canaux R,V,B ne modifie pas la Saturation et la Valeur.

Indice :

Intéressez vous à la valeur minimale ainsi que la valeur maximale des trois canaux.

2) Modifier R,V,B

Il faut maintenant modifier les variables R, V et B pour retrouver une couleur pure. On aura alors $\text{Saturation}=1$ et $\text{Valeur}=1$

Indice n°1 :

Vous devez appliquer aux canaux R,V et B la fonction inverse de ce que vous avez fait pour passer d'une couleur pure à une couleur TSV.

Indice n°2 :

La fonction inverse de $f(x)=ax+b, a != 0$ est $f^{-1}(x)=(x-b)/a$.

3) Renverser la fonction de Teinte

Enfin, vous n'avez plus qu'à trouver la Teinte d'une couleur à partir de sa position sur la roue des couleurs pures !

Indice :

Pour créer Teinte_Depuis_RVB vous allez devoir, comme dans RVB_Depuis_Teinte, distinguer 6 cas différents, et retrouver le coefficient d'un des 6 barycentres.

Vérification élémentaire

Je vous laisse trouver des tests pour vos formules. En attendant, une vérification élémentaire s'impose : convertir une couleur RVB en TSV, puis la re convertir en RVB et vérifier qu'elle est identique. Vous pouvez appliquer cela pour tous les pixels d'une image.

1
2
3
// Operation sur la couleur en RVB du pixel
C_TSV.DefinirDepuisRVB( C_RVB );
C_RVB.DefinirDepuisTSV( C_TSV );

Verification

L'image de sortie est sensée être identique ! Ce test permet de montrer visuellement que les deux espaces de couleurs sont en bijection !

Vous pouvez aussi faire la différence entre les deux images et vérifier que l'on obtient bien une image complètement noire.

Précautions à prendre

Vous devez prendre quelques précautions avant de manipuler des couleurs dans l'espace TSV.

Teinte

Je le rappelle encore une fois, que la Teinte est une grandeur circulaire. Vous ne pouvez donc pas la traiter comme les autres informations : toute information de Teinte est à considérer modulo 1 (ou l'amplitude que vous avez choisi comme intervalle de définition de la teinte si ce n'est pas $[0;1]$).

Saturation et Valeur

D'autres précautions à prendre sont relatives à notre définition de la Saturation et de la Valeur : un niveau de gris ne contient pas d'information de Teinte. Donc :

  1. Faites attention lorsqu'à la sortie d'une transformation TSV la Saturation est devenue nulle (niveau de gris) : l'information de Teinte n'a plus de sens.

  2. Faites attention lorsqu'à l'entrée d'une transformation TSV la Saturation est nulle (niveau de gris) : l'information de Teinte n'a pas de sens.

Il est préférable dans votre code de prévoir le cas où la Teinte n'est pas définie (par exemple utiliser le NaN). Il est aussi pratique de faire en sorte que la couleur noire aie une Saturation égale à 0.

Bijection entre TSV et RVB

En fait on n'a pas vraiment démontrer que TSV et RVB étaient en bijection puisqu'on n'avait pas déterminé les ensembles qui l'étaient.

Le paragraphe précédent justifie le fait que l'on enlève tous les niveaux de gris (blanc et noir inclus !) pour trouver deux sous-espaces du RVB et du TSV qui sont en bijection. Ainsi les ensembles en bijection sont :

  • pour le RVB $(r,v,b) \in [0;1]^{3} \backslash \{r=v=b\}$ : la dernière condition enlevant les gris,
  • pour le TSV $(t,s,v) \in [0;1[ \times ]0;1] \times ]0;1]$ : $t=1$ représente la même couleur que $t=0$ , on enlève les gris (dans la saturation) et le noir (dans la valeur).

Canaux Saturation et Valeur

Dans ce sous-chapitre nous allons voir qu'est-ce qu'on peut modifier sur les canaux de Saturation et de Valeur. Mais avant, une petite digression mathématique :) .

Une autre façon de voir les fonctions affines

Au lieu d'appliquer $f(x)=ax+b$, vous pouvez appliquer une homothétie 1D : $f(x)=k(x-c)+c$$k$ est le coefficient de dilatation ($k=1$ donne la fonction identité, $k<0$ donne une symétrie par rapport à $c$) et $c$ le centre de l'homothétie (la quantité invariante de notre fonction).

Par exemple $f(x)=2(x-0.5)+0.5$ transforme l'intervalle $[0.25;0.75]$ en $[0;1]$ en laissant $0.5$ identique. Autre exemple, la fonction pour réaliser le négatif d'un canal, $f(x)=1-x=-1(x-0.5)+0.5$ est en réalité une symétrie par rapport à $0.5$.

Exemple avec une homothétie de rapport 3 sur la Valeur et dont le centre parcours $[0;1]$ :

Avant Apres

Ceci vaut bien évidemment aussi pour l'espace RVB.

Vous pouvez coder ces filtres dès maintenant.

Refaire un exemple vu

Ensuite vous pouvez refaire l'exemple du sous-chapitre I.3.4 où on a multiplié ces canaux par un coefficient ainsi que calculer la valeur moyenne de ces canaux !

Gamma

Vous pouvez aussi appliquer une fonction gamma sur ces canaux :

Avant Apres Avant Apres

A gauche le gamma parcourt $[0.3;2.0]$ sur la Saturation à gauche et parcourt $[0.3;2.0]$ à droite sur la Valeur.

Forcer les canaux

Vous pouvez carrément forcer ces canaux à une certaine quantité.

Ici la Saturation parcourt $[0;1]$ :

Avant Apres

Ici la Saturation (à gauche) et la Valeur (à droite) parcourent $[0;1]$ :

Avant Apres Apres

Canal Teinte

Dans ce sous-chapitre nous allons voir ce que l'on peut faire avec le canal Teinte.

Rotation

Pour le canal Teinte vous pouvez effectuer une rotation, ce qui revient simplement à rajouter une quantité.

Avant Apres Avant Apres

Ceci permet de généraliser l'échange de canaux. Rajouter $\pm 1/3$ de votre intervalle de Teinte transforme $(R,V,B)$ en $(B,R,V)$ ou $(V,B,R)$. Rajouter la moitié de l'intervalle transforme toute couleur primaire en couleur secondaire (opposée sur la roue des couleurs) et vice-versa.

Homothétie et symétrie

Voici ce que donne une symétrie ($k=-1$) et dont le centre parcourt la Roue des couleurs :

Avant Apres

Voici ce que donne une homothétie avec $k=4$ dont le centre parcourt la Roue des couleurs :

Avant Apres

Forcer la teinte

Vous pouvez redéfinir la teinte de tous les pixels de l'image à une certaine valeur.

C'est un joli effet qui permet à l'image finale d'être le mélange de Noir, de Blanc, ainsi que de la couleur pure associée à la teinte choisie.

Avant Apres Avant Apres

Ici dans le temps varie la teinte choisie pour redéfinir tous les pixels.