Déterminer l’histogramme HSV d’une image RGB
Conversion RGB vers HSI et manipulation de fichiers PPM
jeudi 29 décembre 2005, par Pierre-Luc Bacon
Il m’était nécessaire récemment d’étudier les histogrammes d’une série d’images enregistrées sous le format jpg. Or, je n’ai pu trouver d’outils satisfaisants à cette tache sous Linux. J’ai donc choisi de coder la solution.
Pour réduire la complexité du développement qui était contraint à quelques heures, il a été convenu que le format PPM était tout indiqué à nouveau pour ce type d’expérimentation. En effet, le programme nivgris, détaillé dans cet [article-35], allait servir de base à l’autre. Également, il avait été décidé que Gnuplot allait servir à l’affichage des données de l’histogramme : ce qui réduit considérablement les demandes en travail par rapport à une solution basée par exemple sur la librairie GD. Cela permet donc, par l’entremise de la bibliothèque gnuplot_i qui n’est qu’une "interface", d’obtenir directement un graphique en format png.
Le principe du programme se présente donc ainsi :
- Ouvrir le fichier ppm
- Scruter tous les pixels RGB et les convertir en HSV
- Incrémenter l’élément d’un tableau - 3 en tout (H,S et V) - selon la valeur de H, S ou V qui sert d’indice
- Produire un fichier dat pour gnuplot
- Fermer le fichier
- Créer les graphiques avec gnuplot_i
Conversion HSV vers RGB
Le format HSV, acronyme de "Hue Saturation Value", est un format qui possède des caractéristiques intéressantes pour toute application d’analyse vidéo. En effet, contrairement au RGB, le HSV est un format dit "naturel" car sa définition relève davantage de la conception humaine de la couleur plutôt que celle du RGB qui s’applique d’abord à des dispositifs électroniques. Cela rend donc le HSV apte par exemple à une opération de seuillage des couleurs qui autrement pourrait être facilement faussée quelque facteur externe.
La signification des composants du HSV peuvent s’expliquer de cette manière :
Le hue peut être définie comme le "type" de couleur ou la "teinte". Ex : bleu, rouge, orange
La saturation est la "pureté" d’une couleur. Plus sa valeur approche de 0, plus la couleur devient grisâtre.
V (value) est la clareté de la couleur.
Chacune de ces valeurs est définie dans une gamme déterminée. Par exemple, le hue variera généralement de 0 à 360 mais peut être parfois normalisé entre 0 et 100. Quant à S et V, ceux-ci varient de 0 à 1 ou, exprimé en pourcentage, de 0 à 100%. Il est plus facile de comprendre ceci en observant cette représentation du HSV :
Le hue est donc vu comme la variation autour de la circonférence du cône, d’où s’explique sa gamme de valeurs comprises entre 0 et 360 degrés. La saturation s’explique comme le rayon d’un disque du cône. V varie finalement du sommet du cône à sa base.
Outre la méthode théorique directement issue du modèle mathématique, la conversion d’une valeur en RGB vers le HSI peut être effectuée sans trop de charge du processeur. En effet, il se trouve que l’on puisse recourir à ce raccourci :
Également deux exceptions se présentent :
Si max=min alors h ne peut être définit
Si max=0 alors s ne peut être définit
Cette conversion peut-être codée ainsi dans une fonction :
Cette fonction, appellée avec la valeur des composants RGB en paramètre ainsi que l’adresse sur les variables pour H,S et V, retournera H dans l’intervalle 0-360 ainsi que S et V dans 0-100.
Notez ici que les fonction max et min sont en fait des macros qu’il faudra prendre soin de définir dans l’entête :
Création de l’histogramme
Comme expliqué sommairement plus-haut, le principe de calcul de l’histogramme se base sur l’incrémentation d’un tableau pour H, S et V. Ceci est visible dans cette partie du programme :
Le fichier PPM est parcouru pour obtenir toutes les valeurs RGB des pixels et être convertis en HSV. Par la suite, on incrémente un élément d’un des tableaux à la position indexée par la valeur convertie. Par exemple, si l’on trouve que la valeur de hue pour un pixel vaut 134, alors hue[134] sera incrémenté. De cette manière, chaque élément du tableau représente chacune des valeurs entières possibles pour H,S et V.
Par la suite, on procède à l’opération contraire de lecture du tableau pour écrire un fichier .dat pour Gnuplot :
Finalement, après avoir "déroulé" les tableaux dans le même fichier Gnuplot et fermé ce dernier, on peut créer les fichier png à partir de gnuplot_i. Consultez le manuel de référence de Gnuplot et gnuplot_i pour en savoir davantage.
Résultat
Après avoir exécuté hsvhist sur une image ppm de cette manière :
hsvhist fichier.ppm donnees |
3 fichiers sont créés. D’abord le fichier gnuplot qui contient les histogrammes pour H,S et V ainsi que les graphiques en format png du hue et de sv.
Les résultats semblent concluants et l’outil, bien pratique. Également, il serait possible de faire évoluer le programme de telle sorte qu’il puisse créer d’autres graphiques plus détaillés par exemple. Cependant, dans le cadre des exigences initiales, l’objectif est atteint. L’étude de ces histogrammes est donc maintenant à venir
Notez d’ailleurs cette caractéristique du hue pour la couleur de "peau" près de 25...
À consulter également...
Conversion en bloc JPG vers PPM
Documents joints
-
Code source du programme (GZ - 16.6 ko)






Répondre à l'auteur: