# Gnral Dveloppement > Algorithme & Mathmatiques > Traitement d'images >  probleme de transformation de RGB vers HSV

## mobi_bil

bonjour, je veux transformer une image du RGB vers HSV.
Le probleme est que j'ai trouv beaucoup de formules diffrentes, je n'arrive pas  choisir la bonne ( ou bien qui correspond) mthode. merci  .

----------


## ToTo13

Bonjour,

il y a une contribution sur le sujet.

----------


## mobi_bil

Bonjour,
je pense qu'il y a quelques erreurs sur les formules : contribution

----------


## pseudocode

> Bonjour,
> je pense qu'il y a quelques erreurs sur les formules : contribution


Par exemple, quelle couleur RGB est mal convertie ?

----------


## mobi_bil

bonjour pseusocode.

voici des liens qui parlent de la conversion rgb vers hsv avec deux versions diffrentes :

http://scien.stanford.edu/class/psyc...ts/02/sojeong/

http://fr.wikipedia.org/wiki/Teinte_Saturation_Valeur


http://www.aqra.ca/spip.php?page=art...&id_article=61

je ne sais pas lequel j'utilise !

----------


## pseudocode

Perso, j'utilise la technique dcrite sur Wikipedia.  :;):

----------


## mobi_bil

merci.
supposons qu'on a fait la conversion rgb vers hsv d'une image, comment crer un histogramme hsv de cette image, d'ailleur il existe combien d'histogrammes hsv pour la comparaison? je sais que un pour h (0-355) les autres aucune ide. de toute faon merci.

----------


## pseudocode

> merci.
> supposons qu'on a fait la conversion rgb vers hsv d'une image, comment crer un histogramme hsv de cette image, d'ailleur il existe combien d'histogrammes hsv pour la comparaison? je sais que un pour h (0-355) les autres aucune ide. de toute faon merci.


Il y a beaucoup d'histogrammes possibles. Pour faire de la comparaison, je te suggre de t'inspirer des "MPEG-7 Color Descriptors".  :;): 

Pour commencer, tu peux faire un histogramme HSV 256-bin. Dans cet histogramme, on se limite  16 valeurs de H, 4 valeurs de S et 4 valeurs de V. Pour faire simple, tu peux faire une quantization uniforme du genre:



```

```

----------


## mobi_bil

bonjour.
aprs avoir crer les trois histogrammes HSV, comment faire pour comparer les couleurs de deux images? Est ce qu'on utilise les trois histogrammes ou bien le H seulement?

----------


## pseudocode

> aprs avoir crer *les trois histogrammes* HSV, comment faire pour comparer les couleurs de deux images? Est ce qu'on utilise les trois histogrammes ou bien le H seulement?


 ::koi::  ?

Si tu as suivi ce que j'ai dit au dessus, tu obtiens un seul histogramme.

----------


## mobi_bil

mais on utilise quelle mesure de similarit? je ne pense pas que la distance euclidienne.

----------


## pseudocode

> mais on utilise quelle mesure de similarit? je ne pense pas que la distance euclidienne.



On utilise habituellement la norme L1 = Somme{ Abs( H1(i)-H2(i) ) }, mais tu peux utiliser la norme L2 si tu veux.

----------


## mobi_bil

je ne pense pas qu'on peut appliquer Les distances de Minkowski ( Lp Normes), car ces distances s'appliquent aux vecteurs de dimensions de mme importance comme R G B ( le r, g, b ont la mme importance) mais par contre pour l'espace HSV ce qui compte le plus c'est le H, la puret et la clarit ( S, V) n'ont pas beaucoup d'importance par rapport au H (La couleur)  :;): .

----------


## pseudocode

> je ne pense pas qu'on peut appliquer Les distances de Minkowski ( Lp Normes), car ces distances s'appliquent aux vecteurs de dimensions de mme importance comme R G B ( le r, g, b ont la mme importance) mais par contre pour l'espace HSV ce qui compte le plus c'est le H, la puret et la clarit ( S, V) n'ont pas beaucoup d'importance par rapport au H (La couleur) .


 :8O:  ?

On applique le norme L1 sur l'histogramme du post #8, qui contient TOUTES les couleurs et pas juste une composante !

----------


## mobi_bil

mais dans l'espace H S V, le s et v ne sont pas des couleurs, non?

----------


## pseudocode

> mais dans l'espace H S V, le s et v ne sont pas des couleurs, non?


L'histogramme du post #8 contient 256 COULEURS !!

Ces 256 couleurs sont construites  partir des 3 composantes HSV en faisant varier H,S,V de faon a avoir 16 valeurs diffrentes de H, 4 valeurs diffrentes de S et 4 valeurs diffrentes de V. 



```

```

Ensuite, pour chaque pixel de l'image, on incrmente le "bin" de l'histogramme dont la couleur est la plus proche de ce lui du pixel.

----------


## mobi_bil

> // get h,s,v coefficients (each in range [0,1])
> 	float [] hsv = pixel.getHSV();


Vous avez dit que vous utilisez la mthode de wikipedia pour le calcul de H S V, mais dans ce code vous avez dites qu(ils sont entre 0 et 1)




> Il y a beaucoup d'histogrammes possibles. Pour faire de la comparaison, je te suggre de t'inspirer des "MPEG-7 Color Descriptors"[


. j'ai pas trouv d'article qui parle de a.

----------


## pseudocode

> Par exemple le pixel :
> R=135, G=24, B=86;
> comment vous calculez les valeurs de H S V .


Heu... c'tait pas dj la premiere question de cette discussion ?

Moi j'utilise les formules de wikipedia:

http://fr.wikipedia.org/wiki/Teinte_...e_RVB_vers_TSV




> j'ai pas trouv d'article qui parle de a.


Par exemple: http://www.ee.cityu.edu.hk/~lmpo/pub..._ICIP_dcsd.pdf

----------


## mobi_bil

bonjour pseudocode, j'espre que vous tes bien.

Pour tester votre codejava, j'ai pris un pixel p(R=154, G=83, B=34)
j'ai trouv :
H=24.5 , S=0.78, V=154.

Question 1: Est ce qu'on prend H=24 ou bien 25.

Question 2 :
dans votre algo vous avez crit :



> // get h,s,v coefficients (each in range [0,1])
> 	float [] hsv = pixel.getHSV();


donc vous avez suppos que les valeurs sont entre [0,1], comment vous avez converti les valeurs de H et V.

----------


## pseudocode

> Pour tester votre codejava,


*Mon* code ? Quel code ?  ::koi:: 




> j'ai pris un pixel p(R=154, G=83, B=34)
> j'ai trouv :
> H=24.5 , S=0.78, V=154.


Le rsultat me parrait curieux. S et V n'ont pas l'air d'tre sur la mme chelle.




> Question 1: Est ce qu'on prend H=24 ou bien 25.


On prend l'entier le plus proche. Dans le cas particulier "N+0.5" c'est au choix : soit N, soit N+1




> Question 2 :
> dans votre algo vous avez crit
> donc vous avez suppos que les valeurs sont entre [0,1], comment vous avez converti les valeurs de H et V.


Une simple division:

h(reel) = H(entier) / Hmax
v(reel) = V(entier) / Vmax

----------


## mobi_bil

Merci beaucoup pseudocode.

Juste une dernire confirmation :
Hmax =360 ( ou bien 359)

Voici un lien (Applet) de demonstration de la convertion entre RGB HSV YIQ CIELab. http://www.cs.rit.edu/~ncs/color/a_spaces.html

----------


## pseudocode

> Juste une dernire confirmation :
> Hmax =360 ( ou bien 359)


sans doute 359.

----------


## mobi_bil

bonjour pseudocode,



> Pour commencer, tu peux faire un histogramme HSV 256-bin. Dans cet histogramme, on se limite  16 valeurs de H, 4 valeurs de S et 4 valeurs de V. Pour faire simple, tu peux faire une quantization uniforme du genre:
> 
> 
> 
> ```
> 
> ```


Ou puis je trouver le document qui explique cette mthode

----------


## pseudocode

> Ou puis je trouver le document qui explique cette mthode


Ce code est juste un calcul d'histogramme dans l'espace de couleurs HSV 16-4-4.

De quelle "mthode" tu parles ? Les "MPEG-7 Color Descriptors" ?  ::koi::

----------


## mobi_bil

aaahhh,
Si j'ai bien compris, c'est une manire de quantification de toutes les couleurs de HSV en 16-4-4 ?

----------


## pseudocode

> aaahhh,
> Si j'ai bien compris, c'est une manire de quantification de toutes les couleurs de HSV en 16-4-4 ?


Heu, oui. C'est un histogramme (= cumul de valeurs) des couleurs dans l'espace HSV 16-4-4 (=256 couleurs possibles).

----------


## mobi_bil

Une question ( si vous pouvez me rpondre ) :
Est ce qu'il y a une raison pour choisir 16-4-4 ?

----------


## pseudocode

> Une question ( si vous pouvez me rpondre ) :
> Est ce qu'il y a une raison pour choisir 16-4-4 ?


Ca fait 256 valeurs, ce qui tient sur un octet. Mais bon, ce n'est pas le plus important.

En fait, ca reprsente assez bien la palette des couleurs qui sont distinguables l'une de l'autre par un tre humain. C'est donc un bon "descripteur".

----------


## mobi_bil

MERCI beaucoup pseudocode,
Ou est ce que je peux trouver cette palette?
Si vous avez un document ou bien un lien ou je peux trouver cette palette et la quantification 16-4-4, merci de le poster.

----------


## pseudocode

> MERCI beaucoup pseudocode,
> Ou est ce que je peux trouver cette palette?


 ::koi:: . Et bien, ce sont les 256 valeurs de l'espace HSV-16-4-4.

Mais je suppose que tu cherches des couleurs correspondantes dans un espace RGB-24bits ?

----------


## mobi_bil

dans ce cas,  quoi bon de passer de rgb vers hsv, on a pu utiliser la palette 256 RGB sans faire le tour vers HSV ?

----------


## pseudocode

> dans ce cas,  quoi bon de passer de rgb vers hsv, on a pu utiliser la palette 256 RGB sans faire le tour vers HSV ?


"la palette 256 RGB" ? Comment tu la calcules celle la ?

----------


## mobi_bil

Moi je ne sais pas, d'aprs vous est ce que c'est possible ?

----------


## pseudocode

> Moi je ne sais pas, d'aprs vous est ce que c'est possible ?


On peut toujours calculer une palette de 256 couleurs  partir de l'espace HSV-16-4-4. Mais comment les choisir ? 

Si on se rduit aux couleurs RGB-24bits , ca nous fait tout de meme 16 millions de couleur a rentrer dans une palette de 256  ::aie:: . 

Soit en moyenne 65536 couleurs par "case" de notre palette. On peut choisir la couleur la plus sombre, la plus lumineuse, la plus colore... pour chaque case. Ca reste un choix arbitraire. 

Un petit exemple des couleurs possibles o chaque case contient "seulement" 1024 couleurs:

----------


## mobi_bil

Merci,



> On peut toujours calculer une palette de 256 couleurs  partir de l'espace HSV. Mais comment les choisir ?


Je veux savoir.

----------


## pseudocode

> Merci,
> 
> Je veux savoir.


bah, j'en sais rien.  ::D:

----------


## mobi_bil

comment a,  ::(: 
c'est vous qui ma proposer le code :




> // uniform quantization
> 	int ih = (int)(0.5+hsv[0]*15); // 0<=ih<=15
> 	int is = (int)(0.5+hsv[1]*3);  // 0<=is<=3
> 	int iv = (int)(0.5+hsv[2]*3);  // 0<=iv<=3

----------


## pseudocode

> comment a, 
> c'est vous qui ma proposer le code :


Ca c'est de la quantization : pour n'importe quelle couleur RGB-24bits (parmi 16 millions) cela calcule le vecteur couleur correspondant dans l'espace HSV-16-4-4 (parmi 256). 

Par contre je ne peux pas faire l'inverse : pour une couleur HSV-16-4-4 (parmi 16) je ne peux pas calculer LE SEUL vecteur couleur correspondant dans l'espace RGB-24bits (parmi 16 millions). Donc je ne peux pas crer UNE SEULE palette de 256 couleurs.

----------


## mobi_bil

bonjour pseudocode,
dans l'algorithme de quantification HSV, pourquoi vous avez diviser par 359, autrement, pourquoi vous avez voulu des valeur de H S V entre 0 et 1. merci

----------


## pseudocode

> bonjour pseudocode,
> dans l'algorithme de quantification HSV, pourquoi vous avez diviser par 359, autrement, pourquoi vous avez voulu des valeur de H S V entre 0 et 1. merci


Les valeurs de HSV sont traditionnellement des triplets de valeurs entre 0 et 1. Je ne sais pas pourquoi, mais c'est une habitude.

H est une valeur spciale : elle reprsente la teinte. 
H=0.00 correspond au rouge
H=1.00 correspond au rouge aussi  ::aie:: .
Entre ces 2 valeurs, on passe par les autres teinte (vert, bleu, violet, ...)

----------


## mobi_bil

merci pseudocode,
j'ai une autre question, est ce que chaque valeur RGB a sa valeur correspondante dans HSV

----------


## pseudocode

> merci pseudocode,
> j'ai une autre question, est ce que chaque valeur RGB a sa valeur correspondante dans HSV


oui, on peut passer de l'un a l'autre par les formules de conversion (cf. wikipedia)

----------


## mobi_bil

> oui, on peut passer de l'un a l'autre par les formules de conversion (cf. wikipedia)


Ohh   ::cry:: 
Oui on peut passer de rgb vers hsv, l je suis d'accord, mais l'inverse ( HSV vers RGB) : je ne sais pas, puisque vous avez dit oui, comment vous expliquez a :

L'espace TSV contient toutes les couleurs, ce qui permet  chaque couleur de l'espace RGB d'avoir une correspondance TSV. En revanche, la conversion d'un espace colorimtrique  l'autre exploite les oprateurs "max" et "min". La conversion est donc irrversible, c'est  dire que les teintes TSV ne sont pas toutes reprsentes dans l'espace RGB.

cette information n'est pas la mienne .
( cf : http://fr.wikipedia.org/wiki/Teinte_...e_RVB_vers_TSV)

----------


## pseudocode

Ah. La phrase de Wikipedia est tres ambigu, c'est vrai. Ce qu'ils veulent dire c'est qu'il n'y a pas une bijection au sens mathmatique (au sens : chaque element RGB correspond a un unique element HSV et reciproquement).

Par exemple la couleur noir RGB(0,0,0) a une infinit de reprsentations possibles en HSV. Il suffit de mettre V=0 et n'importe quels valeurs pour H et S.

Pour lever ces ambiguts, on pose les rgles suivantes:
- Si V=0 alors on force S=0
- Si S=0 alors on force H=0

 :;): 

(PS: je te conseille de lire la version anglaise de wikipedia, qui est gnralement plus prcise)

----------


## mobi_bil

> Par exemple la couleur noir RGB(0,0,0) a une infinit de reprsentations possibles en HSV. Il suffit de mettre V=0 et n'importe quels valeurs pour H et S


d'aprs vous, l'space HSV contient combien de couleurs ?
Est ce que 360x100x100 ?

----------


## pseudocode

> d'aprs vous, l'space HSV contient combien de couleurs ?
> Est ce que 360x100x100 ?


HSV, RGB, et tous les autres espaces contiennent une *infinit* de couleurs puisque les coordonnes sont des nombres *rels* (entre 0 et 1).

En informatique, on fait une quantification des ces espaces pour avoir un nombre *fini* de couleurs. Par exemple RGB-24bits = 16777216 couleurs, ou HSV-16-4-4 = 256 couleurs.

----------


## mobi_bil

mais pourquoi dans la dfinition de HSV (selon wikipedia)
teinte :0-360
saturation : 0-100
valeur :0-100

a montre que le nombre est finit.

----------


## pseudocode

> mais pourquoi dans la dfinition de HSV (selon wikipedia)
> teinte :0-360
> saturation : 0-100
> valeur :0-100
> 
> a montre que le nombre est finit.


H entre 0 et 360
S,V entre 0% et 100%

Ces valeurs ne sont pas forcment entires, par exemple HSV(17.23, 24.871%, 84.744541125%).

Pour les rendre "entires" il faut faire une quantification.

----------


## mobi_bil

vous avez raison, merci beaucoup ::D:  ::D: :

et le R G B ? R=0-255, G=0-255, B=0-255 ;

----------


## pseudocode

> vous avez raison, merci beaucoup:
> 
> et le R G B ? R=0-255, G=0-255, B=0-255 ;


Espace RGB : infinit de valeurs, gnralement des rels entre 0 et 1

RGB-24bits : 256*256*256 valeurs,  gnralement des entiers entre 0 et 255

 :;):

----------


## mobi_bil

cette opration de quantification se passe quand ?
quand on prend une photo ( par apareil photo ), est ce que l'ordinateur fait cette quantification automatique ?

----------


## pseudocode

> cette opration de quantification se passe quand ?
> quand on prend une photo ( par apareil photo ), est ce que l'ordinateur fait cette quantification automatique ?


Ca se passe dans l'appareil photo. Le capteur optique mesure une quantit analogique (infinit de valeurs) et l'appareil photo transforme cette mesure en valeur numrique (valeurs finies) grace a un convertisseur analogique/numrique (ADC)

----------


## mobi_bil

bonjour pseudocode,
juste une dernire chose; Vous avez dit dans le post #16 :




> Ces 256 couleurs sont construites  partir des 3 composantes HSV en faisant varier H,S,V de faon a avoir 16 valeurs diffrentes de H, 4 valeurs diffrentes de S et 4 valeurs diffrentes de V.


et vous avez cit les 256 couleurs :




> Couleur #0 : H=0% S=0% V=0%
> Couleur #1 : H=6% S=0% V=0%
> Couleur #2 : H=13% S=0% V=0%
> Couleur #3 : H=20% S=0% V=0%
> .....
> .....


le problme est que ces couleurs reprsentent tous le noir ( S=V=0) ?
                MERCI de me rpondre.

----------


## pseudocode

> bonjour pseudocode,
> juste une dernire chose; Vous avez dit dans le post #16 :
> 
> et vous avez cit les 256 couleurs :
> 
> le problme est que ces couleurs reprsentent tous le noir ( S=V=0) ?


Oui, tout  fait. Choisir "0%" n'tait sans doute pas un bon choix de quantification.  ::P: 

A vous de choisir 4 valeurs de quantification les plus adquates:
[0,0.25] -->  A
[0.25,0.5] --> B
[0.5,0.75] --> C
[0.75,1.0] --> D

----------


## mobi_bil

> [0,0.25] -->  A
> [0.25,0.5] --> B
> [0.5,0.75] --> C
> [0.75,1.0] --> D


j'ai pas compris, c'est quoi A,B,C,D : des intervalles ?
Est ce que vous pouvez me proposer vous mme ces couleurs ( selon votre choix ) merci.

----------


## pseudocode

> j'ai pas compris, c'est quoi A,B,C,D : des intervalles ?


A,B,C,D ce sont les 4 valeurs possibles de ta quantification. Dans mon exemple du post #16 j'avais pris 0,33,66,100.




> Est ce que vous pouvez me proposer vous mme ces couleurs ( selon votre choix ) merci.


Tu peux essayer avec le milieu des intervalles : 12.5, 37.5, 62.5, 87.5

----------


## mobi_bil

donc dans le post #16, pour toutes les couleurs : on fait les modifications suivantes :

pour S et V : 

0%-->12.5%

33%-->37.5

66%-->62.5

100%-->87.5

----------


## pseudocode

> donc dans le post #16, pour toutes les couleurs : on fait les modifications suivantes :
> 
> pour S et V : 
> 0%-->12.5%
> 33%-->37.5
> 66%-->62.5
> 100%-->87.5


Oui. 

Mais c'est juste un exemple. Tu peux prendre les valeurs que tu veux.

----------


## mobi_bil

si on suit cet exemple :
on aura 5 intervalles et non pas 4 .
Preuve :
comment on va quantifier les 5 couleurs suivantes :

H=x, S=11%, V=10%
H=x, S=20%, V=20%
H=x, S=40%, V=42%
H=x, S=70%, V=70%
H=x, S=95%, V=95%

le H ne pose pas de problme, il s'agit de S et V :

----------


## pseudocode

> si on suit cet exemple :
> on aura 5 intervalles et non pas 4 .


 ::koi:: 

[0,25%] --> 12.5%
]25%,50%] --> 37.5%
]50%,75%] --> 62.5%
]75%,100%] --> 87.5%




> Preuve :
> comment on va quantifier les 5 couleurs suivantes :
> H=x, S=11%, V=10%
> H=x, S=20%, V=20%
> H=x, S=40%, V=42%
> H=x, S=70%, V=70%
> H=x, S=95%, V=95%
> le H ne pose pas de problme, il s'agit de S et V :


H=x, S=11%, V=10% --> (?,  12.5%,  12.5%)
H=x, S=20%, V=20% --> (?,  12.5%,  12.5%)
H=x, S=40%, V=42% --> (?,  37.5%,  37.5%)
H=x, S=70%, V=70% --> (?,  62.5%,  62.5%)
H=x, S=95%, V=95% --> (?,  87.5%,  87.5%)

----------


## mobi_bil

ah oui vous avez raison, merci .

----------


## mobi_bil

bonjour pseudocode,
en analysant l'algorithme du post #8 :
j'ai compris la partie 



> int index = ((is*4)+iv)*16+ih;
> hist[index]++;


normalement c'est une faon de remplir le tableau hist :
H=0,S=0,V=0, premire case
H=0,S=0,V=1, deuxime case et ainsi de suite.

Mais j'ai pas pu comprendre la partie :



> int ih = (int)(0.5+hsv[0]*15); // 0<=ih<=15
> int is = (int)(0.5+hsv[1]*3);  // 0<=is<=3
> int iv = (int)(0.5+hsv[2]*3);  // 0<=iv<=3


 quoi sert le 0.5 ajout ? Merci .

----------


## pseudocode

> quoi sert le 0.5 ajout ? Merci .


C'est une formule usuelle d'arrondi double/int, utilise par exemple dans la fonction round().

double --> int

[0.0, 0.5[ --> 0
[0.5, 1.5[ --> 1
[1.5, 2.5[ --> 2
...

----------


## mobi_bil

merci beaucoup pseudocode, grae  vous, tout est clair maintenant  ::): .
avant de mettre fin  cette contribution, est ce que vous pouvez me donner la diffrence entre les formules de conversion rgb vers hsv.
Par exemple , il y a une formule qui calcul le V comme :
V=(R+G+B)/3 diffrente de celle de wikipdia.
S=1- MIN(r,v,b)/(r + v+ b)
J'ai trouv 5 versions diffrentes de conversion.
A votre avis, quelle est la diffrence ? merci.

----------


## pseudocode

Attention, il y a une diffrence entre les espaces HSL et HSV. 

Mais sinon, pour un espace donn, les formules donnent le mme rsultat.

----------


## mobi_bil

> Attention, il y a une diffrence entre les espaces HSL et HSV.


si vous pouvez me donner la diffrence en quelques mots, merci.




> Mais sinon, pour un espace donn, les formules donnent le mme rsultat.


comment vous expliquez cette diffrence ?
R=206, G=121, B=51
leurs valeurs correspondantes en HSV sont :
H=0.07, S=0.75, V=0.8

Mais en utilisant autres formules de conversions, j'ai pas trouv le mme rsultat , par exemple, par les formules suivantes :




> V=(R+G+B)/3 diffrente de celle de wikipdia.
> S=1- MIN(r,v,b)/(r + v+ b)


on trouve 
V=126/255 = 0.49
S=0.86

----------


## pseudocode

> si vous pouvez me donner la diffrence en quelques mots, merci.


Non, pas en quelques mots. Mais disons juste que le H est le meme, mais que S,V,L sont diffrents.




> Mais en utilisant autres formules de conversions, j'ai pas trouv le mme rsultat , par exemple, par les formules suivantes


Je ne sais pas d'ou sort cette formule de conversion, mais elle a l'air fausse (ou du moins pas standard). Il faut utiliser celle de Wikipedia ou de www.easyrgb.com  :;):

----------

