OVH Cloud OVH Cloud

Relations entre RVB et TSL

8 réponses
Avatar
Pierre CHAUVEAU
Bonjour à toutes et à tous,

Dans Windows et autre OS je suppose, une boîte de dialogue permet de
choisir des couleurs en jouant soit sur les valeurs RVB, soit sur les
valeurs TSL.

Avec la souris, on déplace un curseur qui fait évoluer ces valeurs.
Connaissez-vous les relations qui lient les valeurs RVB aux valeurs TSL.

Au vu du fonctionnement de cette boîte, il ya bijection totale dans les
relations : RVB <--> TSL

Connaissez-vous ces relations ou savez-vous où les trouver ?

Les seules relations que j'ai trouvées dans les relations entre espaces
de couleurs ne sont pas bijectives.

Merci de votre aide.

Pierre.

8 réponses

Avatar
Fred
Pierre CHAUVEAU wrote:
Connaissez-vous ces relations ou savez-vous où les trouver ?


Peut etre http://semmix.pl/color/models/emo10.htm ?

Avatar
Charles VASSALLO
Pierre CHAUVEAU wrote:
Bonjour à toutes et à tous,

Dans Windows et autre OS je suppose, une boîte de dialogue permet de
choisir des couleurs en jouant soit sur les valeurs RVB, soit sur les
valeurs TSL.

Avec la souris, on déplace un curseur qui fait évoluer ces valeurs.
Connaissez-vous les relations qui lient les valeurs RVB aux valeurs TSL.

Au vu du fonctionnement de cette boîte, il ya bijection totale dans les
relations : RVB <--> TSL

Connaissez-vous ces relations ou savez-vous où les trouver ?


Le plus souvent, en appelant 'max' et 'min' la plus grande et la plus
petite des composantes RVB, on prend S = 100*(max-min)/max et L =
100*max/255. Le calcul de la teinte est un peu plus compliqué. Après la
soustraction de 'min' aux 3 composantes et le produit par 255/(max-min),
l'une des 3 composantes est nulle et une autre à 255, et la troisième
donne un angle de rotation entre 0 et 60 degrés sur le cercle
chromatique à partir d'une des couleurs de base rouge, jaune, vert,
cyan, bleu, magenta. Tu trouveras un petit dessin qui explique la chose
dans
http://www.oitregor.fr.eu.org/numeric/photoshop/page7b.html

Il y a toutefois une autre façon de calculer S et T,
L = 50*(max+min)/255 ; S = 100*(max-min)/255
que Photoshop utilise aussi parfois sans rien dire, le sournois, quand
ça l'arrange (par ex. dans le réglage teinte/saturation ou la conversion
en N&B)

Charles

Avatar
Pierre CHAUVEAU
Pierre CHAUVEAU wrote:

Connaissez-vous ces relations ou savez-vous où les trouver ?



Peut etre http://semmix.pl/color/models/emo10.htm ?


Merci pour le lien.

Pierre


Avatar
Pierre CHAUVEAU
Le plus souvent, en appelant 'max' et 'min' la plus grande et la plus
petite des composantes RVB, on prend S = 100*(max-min)/max et L =
100*max/255. Le calcul de la teinte est un peu plus compliqué. Après la
soustraction de 'min' aux 3 composantes et le produit par 255/(max-min),
l'une des 3 composantes est nulle et une autre à 255, et la troisième
donne un angle de rotation entre 0 et 60 degrés sur le cercle
chromatique à partir d'une des couleurs de base rouge, jaune, vert,
cyan, bleu, magenta. Tu trouveras un petit dessin qui explique la chose
dans
http://www.oitregor.fr.eu.org/numeric/photoshop/page7b.html

Il y a toutefois une autre façon de calculer S et T,
L = 50*(max+min)/255 ; S = 100*(max-min)/255
que Photoshop utilise aussi parfois sans rien dire, le sournois, quand
ça l'arrange (par ex. dans le réglage teinte/saturation ou la conversion
en N&B)

Charles

Merci pour ces renseignements et lien.


C'est justement dans le but de faire une correction de teinte/saturation
dans mon programme "ProcImg". J'essaie de faire ça correctement.

Cordialement.

Pierre

Avatar
Sansame
Pierre CHAUVEAU wrote:

C'est justement dans le but de faire une correction de
teinte/saturation dans mon programme "ProcImg". J'essaie de faire ça

correctement.

Des programmes de conversion pour passer d'un modèle colorimétrique

à un autre sont fournis ici :
http://www.easyrgb.com/math.php?MATH=M19#text19

Vous y trouverez un programme pour passer de HSL à RGB : en voici la
reproduction mais je ne garantit pas qu'un décalage n'ait pu s'y
glisser. Mieux vaut donc que vous rapporter à l'original...

__________DEBUT_______________________________________________________

if ( S == 0 ) //HSL values = From 0 to 1
{
R = L * 255 //RGB results = From 0 to 255
G = L * 255
B = L * 255
}
else
{
if ( L < 0.5 ) var_2 = L * ( 1 + S )
else var_2 = ( L + S ) - ( S * L )

var_1 = 2 * L - var_2

R = 255 * Hue_2_RGB( var_1, var_2, H + ( 1 / 3 ) )
G = 255 * Hue_2_RGB( var_1, var_2, H )
B = 255 * Hue_2_RGB( var_1, var_2, H - ( 1 / 3 ) )
}


--------------------------------------------------------------------------- --

Hue_2_RGB( v1, v2, vH ) //Function Hue_2_RGB
{
if ( vH < 0 ) vH += 1
if ( vH > 1 ) vH -= 1
if ( ( 6 * vH ) < 1 ) return ( v1 + ( v2 - v1 ) * 6 * vH )
if ( ( 2 * vH ) < 1 ) return ( v2 )
if ( ( 3 * vH ) < 2 ) return ( v1 + ( v2 - v1 ) * ( ( 2 / 3 ) - vH )
* 6 )
return ( v1 )
}
_________FIN_____________________________________________________________


A l'examen de ce programme, il ne semble pas que cette conversion soit
identique à celle qui a été observée par Charles Vassalo dans
Photoshop. Vous remarquerez par exemple que le calcul des composantes
RGB est différent selon que l'inégalité L<0.5 est vérifiée ou pas
(!) C'est d'autant plus bizarre que les conversion RGB<->HSL qui
trainent dans les livres sont différentes. Je les rappelle ci-dessous
avec les notations max=max(R,G,B) et min=min(R,G,B) adoptées par
Charles Vassalo :

La définition de la teinte (H=hue) est commune aux modèles HSL et HSV
:

Si max=R alors H=(0 + (G-B)/(max-min))x60
Si max=G alors H=(2 + (B-R)/(max-min))x60
Si max=B alors H=(4 + (R-G)/(max-min))x60

On remarque que si max=min, c'est à dire dans le cas ou R=G=B
(gris) alors S=0 et H (la teinte) est indéfini.

La saturation et la luminance différent selon le modèle considéré :

Conversion RGB-HSL
Saturation = max - min
Luminance/Lightness = (max - min)/2

Conversion RGB-HSV
Saturation = (max - min))/max
Value = max

Sauf erreur de calcul, ces définitions aboutissent aux exemples
ci-dessous :

RGB HSL HSV
1 0 0 0° 1 0.5 0° 1 1
0.5 1 0.5 120° 0.5 .75 120° 1 1
0 0.5 0 240° 0.5 0.5 240° 1 0.5

J'espère que ces informations vous seront utiles. Sans doute
faudrait-il interroger Adobe sur la manière dont Photoshop implémente
(comme disent les modernes) la modèle TSL/HSL... Merci à vous et à
Charles Vassalo de nous donner ici vos éventuelles conclusions.

Sansame

Avatar
Pierre CHAUVEAU
Pierre CHAUVEAU wrote:

C'est justement dans le but de faire une correction de


teinte/saturation dans mon programme "ProcImg". J'essaie de faire ça
correctement.

Des programmes de conversion pour passer d'un modèle colorimétrique
à un autre sont fournis ici :
http://www.easyrgb.com/math.php?MATH=M19#text19

Vous y trouverez un programme pour passer de HSL à RGB : en voici la
reproduction mais je ne garantit pas qu'un décalage n'ait pu s'y
glisser. Mieux vaut donc que vous rapporter à l'original...

__________DEBUT_______________________________________________________

if ( S == 0 ) //HSL values = From 0 to 1
{
R = L * 255 //RGB results = From 0 to 255
G = L * 255
B = L * 255
}
else
{
if ( L < 0.5 ) var_2 = L * ( 1 + S )
else var_2 = ( L + S ) - ( S * L )

var_1 = 2 * L - var_2

R = 255 * Hue_2_RGB( var_1, var_2, H + ( 1 / 3 ) )
G = 255 * Hue_2_RGB( var_1, var_2, H )
B = 255 * Hue_2_RGB( var_1, var_2, H - ( 1 / 3 ) )
}


-----------------------------------------------------------------------------

Hue_2_RGB( v1, v2, vH ) //Function Hue_2_RGB
{
if ( vH < 0 ) vH += 1
if ( vH > 1 ) vH -= 1
if ( ( 6 * vH ) < 1 ) return ( v1 + ( v2 - v1 ) * 6 * vH )
if ( ( 2 * vH ) < 1 ) return ( v2 )
if ( ( 3 * vH ) < 2 ) return ( v1 + ( v2 - v1 ) * ( ( 2 / 3 ) - vH )
* 6 )
return ( v1 )
}
_________FIN_____________________________________________________________


A l'examen de ce programme, il ne semble pas que cette conversion soit
identique à celle qui a été observée par Charles Vassalo dans
Photoshop. Vous remarquerez par exemple que le calcul des composantes
RGB est différent selon que l'inégalité L<0.5 est vérifiée ou pas
(!) C'est d'autant plus bizarre que les conversion RGB<->HSL qui
trainent dans les livres sont différentes. Je les rappelle ci-dessous
avec les notations max=max(R,G,B) et min=min(R,G,B) adoptées par
Charles Vassalo :

La définition de la teinte (H=hue) est commune aux modèles HSL et HSV
:

Si max=R alors H=(0 + (G-B)/(max-min))x60
Si max=G alors H=(2 + (B-R)/(max-min))x60
Si max=B alors H=(4 + (R-G)/(max-min))x60

On remarque que si max=min, c'est à dire dans le cas ou R=G=B
(gris) alors S=0 et H (la teinte) est indéfini.

La saturation et la luminance différent selon le modèle considéré :

Conversion RGB-HSL
Saturation = max - min
Luminance/Lightness = (max - min)/2

Conversion RGB-HSV
Saturation = (max - min))/max
Value = max

Sauf erreur de calcul, ces définitions aboutissent aux exemples
ci-dessous :

RGB HSL HSV
1 0 0 0° 1 0.5 0° 1 1
0.5 1 0.5 120° 0.5 .75 120° 1 1
0 0.5 0 240° 0.5 0.5 240° 1 0.5

J'espère que ces informations vous seront utiles. Sans doute
faudrait-il interroger Adobe sur la manière dont Photoshop implémente
(comme disent les modernes) la modèle TSL/HSL... Merci à vous et à
Charles Vassalo de nous donner ici vos éventuelles conclusions.

Sansame



Merci pour ces explications et ce lien.

Pierre.


Avatar
Sansame
Oops ! Dans mon précédent message, j'ai commis une faute de frappe.
La conversion de données RGB pour obtenir la luminance du modèle HSL
est :

L = (max + min)/2

et non, comme je l'ai écrit dans un moment d'égarrement(max - min)/2
ce qui aurait pour conséquence que L serait toujours égal à S/2 !!!

Sansame
Avatar
Charles VASSALLO
Sansame wrote:
Oops ! Dans mon précédent message, j'ai commis une faute de frappe.
La conversion de données RGB pour obtenir la luminance du modèle HSL
est :

L = (max + min)/2

et non, comme je l'ai écrit dans un moment d'égarrement(max - min)/2
ce qui aurait pour conséquence que L serait toujours égal à S/2 !!!



Dans le sélecteur de couleurs, Photoshop utilise manifestement S =
100*(max-min)/max et L = 100*max/255, mais pas dans le réglage
teinte/saturation. Pour le calcul de la teinte, je précise bien dans ma
page web que c'est «quelque chose comme ça» ; ce sont les formules que
j'utilisais du temps de l'Amiga. Etant donné l'importance pratique fort
modérée du TSL (ne pas confondre avec LCH :-)), cela n'a guère d'importance.

Charles