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
|
|
Sélectionnez
|
|
Sélectionnez
|
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 :
Pour utiliser une de ces palettes prédéfinies, on utilise la fonction colormap comme ceci :
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 :
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] :
% 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 :
set(gcf, 'colormap'
, jet); % Attribue la palette Jet à l'objet Figure courant
set(gcf, 'colormap'
, hsv(5)) % Palette Hsv avec 5 couleurs
% 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
|
|
Sélectionnez
|
|
Sélectionnez
|
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.
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 :
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
|
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 :
- toute valeur inférieure ou égale à C(1) est remplacée par C(1) ;
- toute valeur supérieure ou égale à C(2) est remplacée par C(2) ;
- é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 :
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
|
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).
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
|
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.
MATLAB procède ensuite à l'égalisation des valeurs comme nous l'avons vu précédemment.
Pour finir, MATLAB associe les indices aux couleurs de la palette de couleurs.
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 :
image(X,'cdatamapping'
,'scaled'
)
set(gca,'clim'
,[28 33])
se simplifie en :
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
VI. Remerciements▲
L'auteur tient à remercier Winjerome pour la correction orthographique de cet article.