Plugin GIMP : Transformation YUV – RGB

Ce post est le résultat d’un travail scolaire.  Voir le rapport original. Voir la page actuelle des plugins GIMP.


Plugin GIMP : Transformation YUV – RGB

Rémi Peyronnet – Février 2002


Introduction
Elaboration du plug-in
Utilisation
Code
Conclusion
Références

Introduction

Gimp est un logiciel de traitement d’image issu du monde libre, et de plus en plus employé. OpenSource, il profite de nombreuses contributions, en particulier grâce à de nombreux plugins qu’il est possible de développer.

Cependant, je n’ai pas encore vu à ce jour de plugin permettant la conversion des canaux Rouge Vert Bleu (RGB), dans l’espace de couleur YUV (Luminance, Chrominances rouges et bleues). Il peut être souvent utile de travailler dans un tel mode, et de décomposer l’image en ces trois composantes. Ce plug-in a donc pour but de répondre à ce besoin.

I. Elaboration du plug-in

I. 1. Espaces de couleur

Le problème se pose de savoir comment représenter une couleur sur un ordinateur. Il existe pour cela beaucoup de techniques. La plus utilisée sur les ordinateurs est la représentation RGB, qui décrit une couleur par ses composantes rouges, vertes et bleues. Cette représentation correspond exactement à l’affichage des couleurs sur un écran par projection d’un flux d’électrons plus ou moins intense sur des pastilles rouges, vertes et bleues, qui en se mélangeant nous donne l’impression de couleur.

La représentation YUV est aussi très utilisée, principalement dans tout ce qui est compression d’image. Y représente la luminance de la couleur, et U et V, la chrominance de cette couleur dans le rouge et le bleu. Cette représentation est utile, car l’oeil est plus sensible aux variations de luminances qu’aux variations de chrominance. Séparer ces trois composantes permettra donc de pouvoir dégrader plus les chrominances, tout en conservant mieux la luminance.

I. 2. Formules de conversions

I. 2. a. Du RGB vers le YUV

La principale difficulté, outre l’écriture du plug-in lui-même, a été de trouver les formules adéquates pour la conversion YUV-RGB. En effet, en première approche, nous pouvons prendre pour la luminance simplement la moyenne des trois composantes Rouge, Vert et Bleu. Cependant, cette façon de faire n’est pas très juste, car elle ne tient pas compte de la sensibilité de l’oeil aux couleurs. Comme nous pouvons le constater dans les courbes ci-dessous, l’oeil à l’impression que le vert est beaucoup plus lumineux que le bleu. Il nous faut donc en tenir compte.

 

Perception des couleurs
J’ai donc cherché sur Internet quelles formules utiliser, et on en trouve de très diverses. La formule la plus fréquente est : Y = 0.299*R + 0.587*G + 0.114*B. On peut constater que cette formule tient bien compte du fait que l’oeil perçoit le vert comme plus lumineux que le rouge, qui est lui-même plus lumineux que le bleu.

Pour le calcul des chrominances, nous utiliseront les formules : U = -0.169*R - 0.331*G + 0.500*B + 128.0 et V = 0.500*R - 0.419*G - 0.081*B + 128.0. Comment peut-on comprendre ces formules ? Premièrement, nous pouvons remarquer que ces deux formules sont prévues pour osciller entre 0 et 255 avec comme valeur moyenne 128. Par exemple, une valeur 255 pour Bleu, avec le coefficient 0.5, sera ramené dans les limites. De même pour le rouge et le vert (dans le sens négatif, -(0.169+0.331)=-0.500). Nous sommes ainsi assurés qu’avec des valeurs comprises entre 0 et 255 en entrée, nous aurons bien des valeurs entre 0 et 255 en sortie, ce qui est vital pour notre application. Il est de plus possible d’exprimer U et V en fonction de Y, et de retrouver ainsi le sens premier des chrominances (Y-R), (Y-B).

Récapitulatif :

  • Y = 0.299*R + 0.587*G + 0.114*B
  • U = -0.169*R - 0.331*G + 0.500*B + 128.0
  • V = 0.500*R - 0.419*G - 0.081*B + 128.0

I. 2. b. Du YUV au RGB

Si les formules ci-dessus abondent, il en va autrement dans le sens inverse. J’avais en premier lieu trouvé les formules (associées aux précédentes) :

  • R = Y + (1.4075 * (V – 128));
  • G = Y – (0.3455 * (U – 128) – (0.7169 * (V – 128));
  • B = Y + (1.7790 * (U – 128);

Cependant cet ensemble de formules ne conserve pas du tout correctement les couleurs, comme en témoignent ces deux images, avant et après une conversion RGB vers YUV puis YUV vers RGB :

avant et après double conversion

La distorsion entre les deux est alors intolérable.

Ce que nous cherchons à obtenir en fait, c’est que le produit des transformations RGB vers YUV et YUV vers RGB fasse l’identité. Il suffit donc de chercher à inverser les formules trouvées pour le premier passage. J’ai donc cherché à utiliser MatLab, disponible à l’école. Les résultats obtenus ont été tout à fait décevant, puisque le produit manuel des deux matrices ne donnait pas l’identité… L’utilisation de SciLab, logiciel gratuit, s’est révélée beaucoup plus efficace. Les formules obtenues sont alors :

  • r = 1 * y – 0.0009267*(u-128) + 1.4016868*(v-128)
  • g = 1 * y – 0.3436954*(u-128) – 0.7141690*(v-128)
  • b = 1 * y + 1.7721604*(u-128) + 0.0009902*(v-128)

En raison des arrondis, il faut veiller à arrondir les nombres plus grands que 255 à 255, et négatifs à 0, au risque de voir apparaître des défauts dans l’image, 255.6 étant enregistré à 0 lors de sa conversion à un octet.

Il est tout à fait rassurant de constater après coup que les formules obtenues sont conformes à celles utilisées dans la norme JPEG, trouvée ensuite. Notons qu’il serait préférable d’arrondir les 0.009267 à 0, comme dans la norme.

Avec ces formules, la transformation RGB vers YUV suivi de son inverse est invisible à l’oeil, malgré les légères erreurs d’arrondi lors de la conversion de la valeur réelle en un octet.

I. 3. Programmation d’un Plug-in GIMP

L’intégration dans GIMP n’a pas été la chose la plus facile du projet, car la documentation est assez elliptique sur ce sujet. Heureusement, il existe beaucoup de plugins pour GIMP OpenSource, ce qui m’a permis de comprendre le fonctionnement normal d’un Plugin.

Le plugin possède un code d’initialisation, qui se charge d’enregistrer la fonction dans GIMP, en inscrivant par exemple une entrée dans un menu. Lorsque ce menu est appelé, la fonction principale du plugin est appelée, en donnant en paramètre un pointeur vers l’image. GIMP possède une manière optimisée de traiter les images, en les découpant par carreaux. Pour ce plugin, qui n’a pas besoin d’une connaissance complète de l’image mais seulement d’un pixel pour opérer, nous avons opté pour cette méthode. Le traitement est donc inclus dans uns boucle, qui s’occupe de découper l’image en blocs, puis nous traitons ensuite, chaque pixel, ligne par ligne. GIMP s’occupe ensuite de gérer l’affichage et la gestion des blocs, ce qui permet par exemple d’annuler l’effet appliqué.

II. Utilisation

Ce plugin est distribué soit sous forme de fichier source à compiler, soit en un binaire pour windows, à placer dans le répertoire ‘plugins’ de GIMP. Il faut alors relancer GIMP, et les entrées ‘RGB to YUV’ et ‘YUV to RGB’ sont ajoutées dans le menu Image/Couleurs. Il suffit juste de cliquer sur une de ces entrées pour lancer le plugin.

En sortie, le canal Y sera placé dans le canal Rouge, le U dans le Vert, et le V dans le Bleu. Grâce à la boîte de dialogue des canaux, vous pouvez demander de ne modifier ou voir qu’un ou plusieurs de ces canaux YUV à la fois.

III. Code

Conclusion

Voici donc un plugin Gimp complètement fonctionnel, permettant de convertir les images en YUV, de travailler dessus, puis de repasser dans le domaine RGB.

Références

 

Laisser un commentaire

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.

Fermer le menu