Gestion des couleurs par MATLAB

Apprendre à mieux programmer en MATLAB

Ce tutoriel est une introduction à la gestion des couleurs sous MATLAB.

Il contient :

  • une présentation des couleurs RGB (true color) ;
  • une présentation des couleurs indexées (indexed color) ;
  • une présentation des couleurs indexées mises à l'échelle (scaled).

Le but de cet article est de vous montrer comment MATLAB interprète les couleurs. Ceci afin de vous permettre de personnaliser le rendu de vos graphiques avec des objets Image, Surface ou Patch.

Votre avis et vos suggestions sur cet article m'intéressent !
Alors après votre lecture, n'hésitez pas : 2 commentaires Donner une note à l'article (5)

Article lu   fois.

L'auteur

Site personnelPage personelle de Jérôme Briot (Dut)

Liens sociaux

Viadeo Twitter Google Bookmarks ! Facebook Digg del.icio.us Yahoo MyWeb Blinklist Netvouz Reddit Simpy StumbleUpon Bookmarks Share on Google+ 

I. Introduction

Pour simplifier, on peut considérer qu'une couleur en format numérique s'exprime via un triplet de valeurs dans l'espace colorimétrique RGBRed Green Blue (ou RVBRouge Vert Bleu en français).

Avec MATLAB, une couleur peut être exprimée soit en spécifiant explicitement les trois valeurs R, G et B, soit par l'intermédiaire d'un indice dans une table contenant elle-même des couleurs RGB. Dans le premier cas, on parle de couleurs vraies (true color en anglais) alors que dans le second, on parle de couleur indexée (indexed color en anglais).

Nous allons voir dans cet article comment ces différentes couleurs sont interprétées par MATLAB.

Bien que les exemples de cet article se basent sur les objets Image, les explications sont valables pour les objets graphiques Surface ou Patch.

II. Couleurs RGB

Une couleur RGB est précisée par trois valeurs correspondantes aux trois composantes rouge, verte et bleue de cet espace colorimétrique.

Les valeurs prises par ces triplets dépendent de la classe utilisée par la variable pour les stocker. Sous MATLAB, il est seulement possible d'utiliser les classes uint8, uint16 et double.

Le tableau suivant récapitule les informations relatives à ces trois classes appliquées aux couleurs :

Classe Description Plage de valeur
uint8 nombre entier, non signé, codé sur 8 bits [0 255]
uint16 nombre entier, non signé, codé sur 16 bits [0 65535]
double nombre réel, codé sur 64 bits [0 1]

Une même couleur RGB peut donc s'exprimer avec des valeurs différentes suivant la classe de la variable qui la contient.

Par exemple, la couleur rouge aura [255 0 0] comme triplet en uint8, [65535 0 0] en uint16 ou encore [1 0 0] en double.

Pour obtenir simplement le triplet RGB d'une couleur, on peut se servir de la fonction uisetcolor.

Pour illustrer la gestion des couleurs RGB par MATLAB, prenons l'exemple d'une image contenant quatre pixels de couleurs respectives rouge, orange, jaune et bleu. Le tableau suivant montre les codes permettant de générer l'image à partir de la fonction image en fonction de la classe de la variable contenant les valeurs des pixels.

Code MATLAB Aperçu
 
Sélectionnez
Xuint8 = zeros(1,4,3,'uint8');
Xuint8(:,:,1) = [  0 255 255 255];
Xuint8(:,:,2) = [  0 255 127   0];
Xuint8(:,:,3) = [255   0   0   0];

image(Xuint8)
Image non disponible
 
Sélectionnez
Xuint16 = zeros(1,4,3,'uint16');
Xuint16(:,:,1) = [    0 65535 65535 65535];
Xuint16(:,:,2) = [    0 65535 32767     0];
Xuint16(:,:,3) = [65535     0     0     0];

image(Xuint16)
Image non disponible
 
Sélectionnez
Xdouble = zeros(1,4,3,'double');
Xdouble(:,:,1) = [0 1 1   1];
Xdouble(:,:,2) = [0 1 0.5 0];
Xdouble(:,:,3) = [1 0 0   0];

image(Xdouble)
Image non disponible

III. Couleurs indexées

Avant de voir le codage des couleurs indexées, il faut aborder la notion de palette de couleurs.

III-A. Palette de couleurs

Une palette de couleurs (palette en anglais ou encore colormap sous MATLAB) est un tableau numérique de taille Mx3 où chaque ligne contient les valeurs du triplet RGB d'une couleur donnée.

Sous MATLAB, la palette est stockée dans une variable de classe double. Par conséquent, les valeurs y sont comprises dans l'intervalle [0 1].

La palette de couleurs s'applique à l'objet graphique Figure en utilisant la fonction colormap . Au final, les valeurs de la palette sont stockées dans la propriété Colormap de l'objet Figure.

MATLAB possède 17 palettes de couleurs prédéfinies :

Image non disponible Image non disponible

Pour utiliser une de ces palettes prédéfinies, on utilise la fonction colormap comme ceci :

 
Sélectionnez
colormap(jet); % Attribue la palette Jet à l'objet Figure courant

L'argument d'entrée de la fonction colormap est bien le nom de la palette et non pas une chaîne de caractères car les noms des différentes palettes sont en fait des fonctions MATLAB.

Par défaut, le nombre de couleurs dans ces palettes est de 64. Il peut néanmoins être augmenté ou diminué en spécifiant le nombre de couleurs comme ceci :

 
Sélectionnez
colormap(hsv(5)) % Palette Hsv avec 5 couleurs

Il est aussi possible de définir sa propre palette de couleurs par une matrice Mx3 dont chaque valeur est comprise dans l'intervalle [0 1] :

 
Sélectionnez
% Palette composée de trois couleurs
cmap = [1 0 0   % Triplet RGB de la couleur rouge
        0 1 0   % Triplet RGB de la couleur verte
        0 0 1]; % Triplet RGB de la couleur bleue

colormap(cmap);

Il est également possible d'effectuer les mêmes opérations en renseignant directement la propriété Colormap de l'objet Figure en utilisant la fonction set :

 
Sélectionnez
set(gcf, 'colormap', jet); % Attribue la palette Jet à l'objet Figure courant
 
Sélectionnez
set(gcf, 'colormap', hsv(5)) % Palette Hsv avec 5 couleurs
 
Sélectionnez
% Palette composée de trois couleurs
cmap = [1 0 0   % Triplet RGB de la couleur rouge
        0 1 0   % Triplet RGB de la couleur verte
        0 0 1]; % Triplet RGB de la couleur bleue

set(gcf, 'colormap', cmap);

III-B. Couleurs indexées

Une couleur indexée est précisée par un simple indice qui pointe vers une ligne d'une palette de couleurs et donc vers une couleur RGB.

Sous MATLAB, comme pour les valeurs du triplet RGB, cet indice peut être de classe uint8, uint16 ou double.

Classe Description Plage de valeur
pour les indices
uint8 nombre entier, non signé, codé sur 8 bits [0 255]
uint16 nombre entier, non signé, codé sur 16 bits [0 65535]
double nombre réel, codé sur 64 bits [1 size(colormap,1)]

Pour illustrer la gestion des couleurs indexées par MATLAB, prenons le même exemple que dans le chapitre sur les couleurs RGB. Soit une image contenant quatre pixels de couleurs respectives rouge, orange, jaune et bleu et dont les valeurs sont indexées sur la palette jet avec 64 couleurs. Le tableau suivant montre les codes permettant de générer l'image à partir de la fonction image.

Code MATLAB Aperçu
 
Sélectionnez
Xuint8 = zeros(1,4,'uint8');
Xuint8(:,:) = [7 39 47 55];

colormap(jet(64))

image(Xuint8)
Image non disponible
 
Sélectionnez
Xuint16 = zeros(1,4,'uint16');
Xuint16(:,:) = [7 39 47 55];

colormap(jet(64))

image(Xuint16)
Image non disponible
 
Sélectionnez
Xdouble = [8 40 48 56];

colormap(jet(64))

image(Xdouble)
Image non disponible

Pour mieux visualiser ce que MATLAB fait, voici une représentation graphique de l'association des valeurs numériques (en haut) avec les indices de la palette de couleur (au milieu) qui donne les couleurs finales de l'image (en bas) pour la classe double.

Image non disponible

III-B-1. Remarque n°1

On remarque que pour les variables de classe uint8 et uint16 la valeur des indices est minorée de 1 par rapport à la classe double. Analysons un peu plus en détail cette particularité.

Que se passerait-il si la valeur d'un indice uint8 ou uint16 valait 0 ?

Comme ces valeurs font directement référence à un indice de la palette de couleur, et comme MATLAB n'accepte pas l'indice 0 pour l'indexage des matrices, une couleur ayant une valeur 0 provoquerait l'apparition du message d'erreur "??? Subscript indices must either be real positive integers or logicals". Pour éviter ceci, MATLAB ajoute automatiquement 1 à chaque valeur uint8 ou uint16.

Cette particularité est à connaitre et à mémoriser absolument pour éviter des décalages dans les couleurs affichées.

III-B-2. Remarque n°2

Que se passerait-il si la valeur d'un indice était supérieure au nombre de couleurs (nombre de lignes) de la palette ?

Pour tout indice supérieur au nombre de couleurs de la palette, MATLAB affecte la valeur du dernier indice de la palette.

Prenons comme exemple une image en couleurs indexées composée de quatre pixels dont les valeurs respectives 0, 1, 2 et 3 sont stockées en classe uint8.

Tentons d'afficher cette image sur un objet Figure avec une palette de couleurs composée uniquement de deux couleurs, rouge et bleu, comme ceci :

Image non disponible

Voici le code correspondant ainsi qu'un aperçu de l'image obtenue (avec superposition des valeurs des pixels) :

Code MATLAB Aperçu
 
Sélectionnez
X = zeros(2, 2, 'uint8');
X(:,:) = [0 1 ; 2 3];
 
cmap = [1 0 0   % Triplet RGB de la couleur rouge
        0 0 1]; % Triplet RGB de la couleur bleue
  
figure

colormap(cmap);
   
image(X)
Image non disponible

Analysons pas à pas le comportement de MATLAB.

Comme on l'a vu précédemment, MATLAB ajoute d'abord 1 à chaque valeur de la variable X puisque celle-ci est de classe uint8.

Les valeurs de X deviennent donc [1 2 ; 3 4]

Ensuite, MATLAB tronque toutes les valeurs supérieures au nombre de couleurs de la palette (ici 2).

Les valeurs de X deviennent donc finalement [1 2 ; 2 2]

On obtient donc bien une image composée d'un seul pixel rouge (première couleur de la palette) et de trois pixels bleus (deuxième couleur de la palette).

IV. Représentation de phénomènes physiques

Dans les chapitres précédents, nous avons abordé la gestion des couleurs quand celles-ci sont issues d'images classiques.

MATLAB étant utilisé dans divers domaines de l'ingénierie, on souhaite souvent visualiser des phénomènes physiques (chaleur, contraintes mécaniques, rayonnement…). Or ces phénomènes ont des plages de valeurs qui ne correspondent pas aux plages [0 255], [0 65535 et [0 1] que MATLAB utilise et que nous avons vues précédemment.

Dans des relevés de températures, on pourra par exemple avoir une plage de valeurs comprises entre -50° et +50°.

Dans l'imagerie médicale, l'échelle de Hounsfield utilisée pour associer l'intensité des pixels aux valeurs CT a pour plage [-1024 +5000].

Il est également parfois nécessaire de faire du fenêtrage sur les valeurs à afficher pour étudier des zones de variations faibles.

Pour pouvoir afficher ces informations sous forme de couleur sous MATLAB, il faut les modifier pour les faire correspondre au fonctionnement des couleurs indexées que nous avons vu précédemment.

Nous allons donc aborder les techniques de mise à l'échelle des valeurs à représenter à l'aide des propriétés CLim et CDataMapping.

IV-A. Les propriétés CLim et CDataMapping

La manipulation des propriétés CLim et CDataMapping est très utile pour contrôler et personnaliser le rendu des graphiques sous MATLAB.

CLim est une propriété des objets Axes alors que CDataMapping est une propriété des objets Image, Surface ou Patch.

La propriété CDataMapping peut prendre une des deux valeurs Direct ou Scaled. Dans le cas de la valeur Direct, l'interprétation des couleurs se fait comme nous l'avons vu précédemment dans le chapitre "Couleurs indexées" de cet article.

Le renseignement de la propriété CDataMapping à Scaled procède à un seuillage et une égalisation (ou étalement) des valeurs des indices avant l'affichage afin d'occuper toute la plage des couleurs de la palette. Elle force MATLAB à tenir compte des valeurs de la propriété CLim de l'objet Axes lors de l'affichage.

La propriété CLim contient un vecteur de deux valeurs numériques [C(1) C(2)] qui représentent la valeur de seuillage bas et la valeur de seuillage haut utilisées avec CDataMapping.

Lors de l'application des valeurs [C(1) C(2)] à la propriété CLim, MATLAB effectue d'abord un seuillage haut et bas des valeurs des pixels à l'aide des deux valeurs C(1) et C(2). Il fait ensuite une égalisation des valeurs des pixels seuillées sur le nombre de couleurs de la palette.

Pour résumer :

  1. toute valeur inférieure ou égale à C(1) est remplacée par C(1) ;
  2. toute valeur supérieure ou égale à C(2) est remplacée par C(2) ;
  3. égalisation de la plage [C(1) C(2)] vers la plage [1 size(colormap,1)].

Ce qui peut se traduire par le code MATLAB suivant :

 
Sélectionnez
X = min(X,CL(2)); % Seuillage haut
X = max(X,CL(1)); % Seuillage bas

c = class(X);

X = cast(X,'double');

X = fix((X-CL(1))/(CL(2)-CL(1))*(m-1))+1; % avec m : nombre de couleurs de la palette

X = cast(X,c);

Vous pouvez consulter la FAQ pour plus d'informations sur cette technique et sur l'utilité de la fonction cast : Comment normaliser les valeurs d'une matrice dans l'intervalle [0 1] ?.

Les deux propriétés CLim et CDataMapping n'ont aucun effet sur les couleurs RGB du premier chapitre de cet article.

Prenons l'exemple d'une image contenant trois zones de couleurs réparties au début, au milieu et à la fin de la palette jet composée de 64 couleurs.

Le tableau suivant montre le code et l'aperçu de l'affichage de cette image avec la fonction image.

Code MATLAB Aperçu
 
Sélectionnez
X = zeros(4, 4, 'double');

X(:,:) = [1  2  3  4
          2 29 31 62
          3 30 32 63
          4 62 63 64];

colormap(jet(64));

image(X)
Image non disponible

Pour mieux comprendre ce que MATLAB fait, voici une représentation graphique de l'association des valeurs numériques (en haut) avec les indices de la palette de couleur (au milieu) qui donne les couleurs finales de l'image (en bas).

Image non disponible

Comme on peut le remarquer, du fait de l'étalement des valeurs des pixels, les différences dans la zone centrale (en vert) sont difficilement perceptibles.

En renseignant la propriété Clim de l'objet Axes où est affichée l'image et la propriété CDataMapping de l'objet Image créé par la fonction image de manière judicieuse, on peut mettre en évidence la zone centrale.

Le tableau suivant montre le code modifié et l'image obtenue.

Code MATLAB Aperçu
 
Sélectionnez
X = zeros(4, 4, 'double');

X(:,:) = [1  2  3  4
          2 29 31 62
          3 30 32 63
          4 62 63 64];

colormap(jet(64));

image(X,'cdatamapping','scaled')

set(gca,'clim',[28 33])
Image non disponible

Les différences dans la zone centrale sont maintenant bien mises en évidence.

Pour mieux comprendre ce que MATLAB fait, reprenons pas à pas le processus.

Tout d'abord, les valeurs sont seuillées en fonction du vecteur [28 33] selon les deux règles suivantes :

  • toute valeur inférieure ou égale à 28 prend la valeur 28 ;
  • toute valeur supérieure ou égale à 33 prend la valeur 33.
Image non disponible
Seuillage haut et bas en fonction des valeurs de CLim (ici 28 et 33)

MATLAB procède ensuite à l'égalisation des valeurs comme nous l'avons vu précédemment.

Image non disponible
Egalisation des valeurs des pixels dans l'intervalle [1 64]

Pour finir, MATLAB associe les indices aux couleurs de la palette de couleurs.

Image non disponible

IV-B. Les fonctions caxis et imagesc

MATLAB possède deux fonctions utiles qui peuvent simplifier la gestion de la mise à l'échelle des couleurs.

La fonction caxis permet de spécifier les valeurs de la propriété CLim. Elle permet également de remettre à zéro les modifications à l'aide de l'argument 'auto'. Elle peut également servir à geler les modifications grâce à son argument 'freeze'.

La fonction imagesc simplifie la mise à l'échelle des valeurs puisqu'elle met automatiquement la propriété CDataMapping de l'objet Image qu'elle crée à Scaled et qu'elle peut prendre en argument le vecteur qui sert à la propriété CLim. Si cet argument n'est pas spécifié, imagesc utilise la valeur minimale et maximale des pixels.

Le code suivant :

 
Sélectionnez
image(X,'cdatamapping','scaled')

set(gca,'clim',[28 33])

se simplifie en :

 
Sélectionnez

imagesc(X,[28 33])

V. Conclusion

Cet article vous a présenté la gestion des couleurs sous MATLAB.

Voici un résumé des différences entre les couleurs RGB, indexées et indexées mises à l'échelle.

Les couleurs RGB sont les plus simples à manipuler. Elles sont insensibles aux valeurs des propriétés CDataMapping et CLIm. Le choix d'une palette de couleur n'a aucun effet sur ces couleurs.

Les couleurs indexées sans mise à l'échelle sont utilisées lorsque le nombre de couleurs est relativement faible et que la plage de variation des intensités n'est pas très importante. Avec ces couleurs, la valeur de la propriété CDataMapping est Indexed. Le choix de la palette de couleurs affecte le rendu final.

Les couleurs indexées avec mise à l'échelle sont utilisées pour représenter des phénomènes physiques avec de grandes plages de variation des intensités. Elles peuvent également être utilisées pour mettre en évidence des zones de faibles variations d'intensité. Avec ces couleurs, la valeur de la propriété CDataMapping est Scaled. Le choix de la palette de couleurs affecte le rendu final, de même que les valeurs de la propriété CLim.

Vous devriez maintenant être capable de mieux personnaliser le rendu de vos graphiques avec des objets Image, Surface ou Patch.

Votre avis et vos suggestions sur cet article m'intéressent !
Alors après votre lecture, n'hésitez pas : 2 commentaires Donner une note à l'article (5)

VI. Remerciements

L'auteur tient à remercier Winjerome pour la correction orthographique de cet article.

En complément sur Developpez.com

  

Copyright © 2012-2014 Jérôme Briot. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.