Les Images sous Matlab

Introduction:

MATLAB  est bien adapté à la manipulation des images puisque l'élément de base de traitement sous MATLAB  est la matrice, et une image n'est rien d'autre qu'une matrice dont chaque élément représente la couleur et l'éclairement d'un pixel.

MATLAB dispose de fonctions permettant de manipuler des images dans différents formats dont :
•    BMP (Microsoft Windows Bitmap)
•    HDF (Hierarchical Data Format)
•    JPEG (Joint Photographic Experts Group)
•    PCX (Paintbrush)
•    PNG (Portable Network Graphics)
•    TIFF (Tagged Image File Format)
•    XWD (X Window Dump)

MATLAB  supporte trois classes différentes pour l'affichage des images :
  • double : Virgule flottante double précision
  • unit 16 : entier 16 bits
  • unit 8  : entier 8 bits

Les fonctions qui permettent d'afficher les images interprètent les données différemment selon la classe dans laquelle elles ont été enregistrées.

Les fonctions permettant de manipuler des images sont :


imread:    Lit une image à partir d'un fichier
Imwrite:    Sauvegarde une image dans un fichier
image:    Affiche une image
imagesc:    Traite des données et les affiches comme image
imfinfo:    Récupère des information sur une image stockée dans un fichier
Ind2rgb:    Convertit une image indexée en une image RGB

Dans MATLAB , une image est représentée par une matrice de donnée n x m plus éventuellement une matrice palette (colormap) k * 3. Trois type d'images sont ainsi traités :
   •    Les images indexées
   •    Les images monochromes ou à niveau de gris
   •    Les images RGB (truecolor)


LES IMAGES INDEXÉES

Une image indexée est représentée par une matrice index (d'indices) n x m et une matrice colormap k * 3. Chaque élément de la matrice index est un indice qui pointe vers une ligne de la matrice colormap où se trouve le triplet R G B correspondant à la couleur du pixel.

 

Pour visualiser une image indexée, on utilise les deux fonctions image et colormap. Le fichier clown.mat situé dans le dossier C:\MATLABR11\toolbox\matlab\demos contient une image représenté par une matrice index X (200x320) et une matrice colormap map (81 x 3). Pour lire le fichier clown.mat on utilise la commande load.

>>   load clown
>>   image(X);
>>   colormap(map);

Pour se débarrasser de la graduation des axes:
>> axis off

Pour arranger la rapport largeur hauteur:
axis image


Si vous disposez du toolbox images processing, vous avez une panoplie d'outils pour manipuler les images comme la fonction imshow() qui a quelques petits plus sur la fonction image() . Essayer imshow(X, map) pour voir ce que ça donne. Je vais continuer ce tutoriel avec la fonction image(), rien ne vous empêche d'utiliser imshow()

On peut consulter une portion de la matrice X pour voir à quoi ça ressemble :

>> P = X(78:84,157:165)

P =
    77    77    45    64    45    45    45    40    45
    42    54    80    42    28    35    60    28    42
    42    42    64    31    30    30    42    30     30
    60    45    45    14    45    14    45    45     45
    54    45    45    45    38    30    30    45    30
    71    54    73    54    54    54    73    54     28
    77    77    72    60    42    60    42    42    42

Chaque élément est un indice qui correspond à une ligne de la matrice map. On peut voir les couleurs correspondantes dans la matrice map.

>>   map(77,:)
ans =
0.99609375000000   0.86718750000000   0.70312500000000

>>   map(14,:)
ans =
0.41406250000000   0.12500000000000   0.12500000000000

Changement de palette

Une image indexée peut être visualisée avec différentes palette. MATLAB  dispose d'un certain nombre de fonctions permettant de générer des colormaps comme : gray, hsv, hot, cool, bone, copper, pink, flag. Pour voir la liste complète, tapez help graph3d dans la fenêtre MATLAB .

Avec l'image affichée, essayer les commandes suivantes tout en observant l'image à l'écran

colormap(gray)
colormap(bone)
colormap(hsv)
colormap(hot)

Colormap est une fonction (m-file) qui change la matrice palette que Matlab gère comme une propriété colormap de la figure.  De ce fait les deux commandes suivantes sont équivalentes :

colormap(map);
set(gcf,'colormap',map);


Quand on affiche une image indexée dans une nouvelle figure, elle est affichée avec la colormap par défaut de MATLAB  qui est la colormap JET constituée de 64 triplet RGB. Si on désire changer la colormap par défaut, on peut utiliser la commande suivante : set( 0, 'DefaultFigureColormap',colormap_de_votre_choix). Exemples :

set(0,'defaultfigurecolormap',gray);
set(0,'defaultfigurecolormap',cool(200));
set(0,'defaultfigurecolormap',A);    (A est une matrice préparée à l'avance)


L'appel des fonctions gray, cool, . . . sans paramètres génère une colormap ayant la même longueur que la colormap de la figure courante. S'il n'y a pas d'image à l'écran, il n'y a pas de colormap courante, les colormaps générée par les fonctions précédentes auront la longueur de la colormap par défaut. Pour générer une colormap avec une longueur donnée, il suufit de le préciser, exemple :
G = gray(200).

Si le nombre d'indices dans une image est différent du nombre de lignes dans la colormap, la fonction image donne un rendu de couleur pas toujours correcte. Pour y remédier, utilisez la commande imagesc  qui adapte l'image à la colormap en faisant correspondre le plus petit indice dans l'image à la première ligne de la colormap, le plus grand à la dernière ligne, les indices intermédiaires sont répartis linéairement.

I = [1 2 3 4; 1 1 1 1; 2 1 2 1; 1 4 1 4]
P = flag(11);
colormap(P);
imagesc(I); axis off;





LES IMAGES RGB (TueColor)

Les images RGB sont des images où chaque pixel est représenté par une combinaison des trois couleurs de base Red, Green et Blue. Chaque couleur est codée sur 8 bits ce qui fait que chaque pixel est codé sur 24 bits.

MATLAB  stocke une image RGB n x m dans une matrice à trois dimensions n x m x 3.  Chaque plan de la matrice représente une couleur. La couleur d'un pixel est obtenue par la combinaison des trois couleurs situées à la position correspondante dans la matrice.


Utiliser la fonction imread() pour lire l'image stockée dans le fichier ngc6543a.jpg 
a=imread('ngc6543a.jpg');

Vérifier sa dimension à l'aide la commande size
size(a)
ans =    650   600     3

Afficher l'image à l'aide la commande image
image(a); axis off; axis image;


On peut diminuer le gap entre l'image et les les limites de la figure
>> set(gca,'position',[0 0 1 1])



L'image étant un peu grande, nous allons en extraire une image contenant seulement la zone centrale en prenant seulement une partie de la matrice a

b = a(125:450,90:500, : );
image(b); axis off; axis image;



On peut maintenant sauvegarder notre nouvelle image dans un fichier avec le format de notre choix. Essayons les formats JPG et BMP

imwrite(b, 'etoile.jpg', 'JPG');
imwrite(b, 'etoile.bmp', 'BMP');

imwrite(b, 'etoile.png', 'PNG');

Utilisez l'explorateur Windows pour vérifier que la taille du fichier etoile.bmp est 30 fois plus grande que le fichier etoile.jpg,

Essayons de voir à quoi ressemblent les données dans la matrice. Pour cela formons une petite matrice pour qu'on puisse l'afficher à l'écran. (6 pixels sur 6)

c = b(160:166,218:224,:)
c(:,:,1) =
  255  252  198  142  132  123   85
  255  217  160  130  125  100   85
  185  150  116  114  113   74   87
  120  113  101  103  110   84   92
  103  114  100   85   99   96   96
   92   81   79   88   98  100   95
   90   84   83   90   98  102  102


c(:,:,2) =
  247  231  162   94   73   56   12
  244  195  124   82   67   34   12
  172  125   80   67   57    8   17
  104   87   63   56   54   21   23
   74   77   55   36   42   34   28
   42   29   23   31   36   36   28
   27   20   21   26   33   36   32


c(:,:,3) =
  255  255  255  229  227  214  163
  255  255  250  230  227  194  164
  255  253  228  225  218  166  167
  254  249  234  224  213  170  165
  240  252  233  206  199  179  163
  199  192  192  196  195  182  159
  170  166  168  172  175  170  156


Vérifiez que les données de chaque plan sont codées sur 8 bits (format unit8 de MATLAB ) : chaque élément varie en 0 et 255. Le triplet [0 0 0] correspond au noir et le triplet [255 255 255] correspond au blanc.

remarque : pour changer de format (classe) de codage des pixels, on pourrait utiliser les fonctions de conversion

Visualiser la petite image c  crée ci-dessus

image(c);

Changeons la couleur de quelques pixels et regardons l'effet sur l'image :

c(5,5,:)=[255 0    0];      %rouge
c(5,6,:)=[0   255  0];      %vert
c(5,7,:)=[0   0  255];      %bleu
image(c)
;

On peut aussi changer plusieurs pixel d'un seul coup :

c(3,3:5,:)=[255 255 0; 0 255 255; 255 0 255];
image(c);



On peut aussi modifier une image en injectant une image dedans :

On commence par capturer la partie centrale (étoile) de l'image b
x = b(148:170,208:228,:);
image(x); axis off, axis image;


affichons la taille de la matrice x

size(c)
ans =     23    21     3

Injectons maintenant la matrice x dans la matrice b à la position (131,188)

b(131:131+22,   188:188+20,  : ) = x;
image(b); axis off, axis image;





LES IMAGES MONOCHROMES

Une image monochrome est une image représentée par une matrice n x m. Chaque élément de la matrice représente l'éclairement d'un pixel. Normalement, les éléments de la matrice sont stockés en format double, soit 64 bits en virgule flottante. Pour réduire l'occupation de la mémoire, MATLAB  visualise les images monochromes en les traitant comme des images indexées. La matrice image est convertie en une matrice d'indice que l'utilisateur peur visualiser avec la colormap de son choix.


 
Nettoyons l'espace de travail et chargeons l'image RGB etoile.jpg :

clear
close all
X = imread('etoile.jpg');


gardon seulement le plan rouge ce qui correspond à une image monochrome :

X = X(:,:,1);

Visualisons l'image avec la colormap bone :

colormap(bone);
imagesc(X); axis off, axis image


On peut aussi nous amuser à faire nos propres colormap :

p = (0 : 0.01 : 1)';
z= zeros(size(p));


maintenant essayer les commandes suivantes tout en observant l'image :

colormap([p z z])
colormap([z p z])
colormap([z z p])
colormap([p p z])
colormap([p z p])
colormap([z p p])


on obtient des images suivantes: