Introduction à la gestion des images sous MATLABDate de publication : 29/10/2007 , Date de mise à jour : 16/12/2007
Par
Jérôme Briot (Dut)
Ce tutoriel est une introduction à la gestion des images sous MATLAB. Dans un premier temps, il récapitule
les différents
formats de fichiers images supportés. Les outils permettant de gérer les images sont ensuite brièvement
présentés. Puis la représentation des images est abordée. Des liens pour s'initier ou se
perfectionner au traitement d'images sont ensuite répertoriés. Pour conclure sur une note moins sérieuse,
quelques Easter Eggs relatifs aux images sont dévoilés.
Avant propos
1. Formats de fichiers supportés
2. Outils de gestion des images
2-A. Les fonctions MATLAB
2-B. Les Toolbox
2-C. Les images tests
3. Représentation des images
3-A. Matrice image
3-B. Objets graphiques représentant les images
3-B-1. L'objet Image
3-B-2. L'objet Surface
4. Ressources disponibles
5. Les images cachées (Easter Eggs)
Remerciements
Avant propos
MATLAB est un langage initialement créé pour traiter des problèmes d'algèbres linéaires (bibliothèques LAPACK/LINPACK)
Donc, en tant qu'outil optimisé pour le calcul matriciel, il convient parfaitement pour le développement rapide d'algorithmes et
de programmes pour la manipulation d'images numériques. Ces dernières sont en effet représentées par des matrices à 2 ou 3 dimensions.
Cet article est avant tout une présentation générale de la gestion des images sous MATLAB. Il n'a pas pour vocation à aborder
les notions de manipulation ou de traitement d'images. Les liens donnés en fin d'article permettront au lecteur d'approfondir les notions
abordées ici.
Certaines parties de cet article sont évolutives (par exemple, le tableau de la première partie) et seront mis à jour au fur et à mesure.
1. Formats de fichiers supportés
Les opérations de lecture/écriture des fichiers contenant des images sous MATLAB
sont grandement simplifiées grâce à des fonctions toutes faites qui sont disponibles soit :
Le tableau suivant est un récapitulatif de la plupart des formats de fichiers supportés par MATLAB
| Format |
Lecture |
Ecriture |
Fonctions/Liens |
Toolbox |
| Analyze |
x |
|
readanalyze.m |
|
| Analyze 7.5 |
x |
|
analyze75read |
Image Processing |
| BMP |
x |
x |
imread, imwrite, print |
|
| CUR |
x |
|
imread |
|
| DICOM |
x |
x |
dicomread, dicomwrite |
Image Processing |
| DPX |
x |
|
DPX file reader |
|
| EMF |
|
x |
print |
|
| ENVI |
x |
x |
ENVI to MATLAB
MATLAB to ENVI
An improved ENVI file reader,
READ_ENVIHDR |
|
| EPS |
|
x |
print |
|
| FDF |
x |
x |
Varian MRI FDF reader |
Image Processing |
| FITS |
x |
x |
fits_toolbox,
fits |
|
| GeoTIFF |
x |
|
geotiffread |
Mapping |
| GIF |
x |
x |
imread, imwrite |
|
| GIPL |
x |
x |
GIPL Toolbox |
|
| HDF-EOS |
x |
x |
Earth Observing System Data Visualization |
|
| HDF4 |
x |
x |
imread, imwrite, print |
|
| ICO |
x |
|
imread |
|
| ILL |
|
x |
print |
|
| JPEG |
x |
x |
imread, imwrite, print |
|
| JPEG2000 |
x |
x |
JPEG2000 |
|
| JPK |
x |
|
Opens JPK AFM files |
|
| LSM |
x |
|
LSM File Toolbox |
|
| METAPOST |
|
x |
Multi-METAPOST Toolbox |
|
| MINC |
x |
x |
EMMA |
|
| NIfTI |
x |
x |
Tools for NIfTI (ANALYZE) MR image |
|
| PBM |
x |
x |
imread, imwrite, print |
|
| PCX |
x |
x |
imread, imwrite, print |
|
| PGM |
x |
x |
imread, imwrite, print |
|
| PIC |
x |
|
PicRead |
|
| PNG |
x |
x |
imread, imwrite, print |
|
| PNM |
x |
x |
imread, imwrite, print |
|
| PPM |
x |
x |
imread, imwrite, print |
|
| PSD |
x |
|
Adobe Photoshop PSD file reader |
|
| RAS |
x |
x |
imread, imwrite, print |
|
| SIF |
x |
x |
Andor SIF image reader |
|
| SIR |
x |
|
SIR file format utilities |
|
| STK |
x |
|
Metamorph stacks into Matlab |
|
| SVG |
|
x |
Scalable Vector Graphics (SVG) Export of Figures |
|
| TIFF |
x |
x |
imread, imwrite, print,
tiffread2 |
|
| VFF |
x |
|
Micro-CT VFF reader |
Image Processing |
| WSQ |
x |
x |
WSQ image library (for fingerprints) v.2.8 |
|
| XIF |
x |
x |
XIF Image Reader,
readxif - xiftoolbox |
|
| XWD |
x |
x |
imread, imwrite |
|
| Format |
Lecture |
Ecriture |
Fonctions/Liens |
Toolbox |
Se référer à la documentation MATLAB pour les fonctions imread, imwrite et print.
Se référer à la documentation de l'Image Processing Toolbox pour les fonctions dicomread, dicomwrite et analyze75read.
Se référer à la documentation de la Mapping Toolbox pour la fonction geotiffread.
Pour plus d'informations sur les codes disponibles sur le File Exchange ou sur le web, merci de contacter en priorité leurs auteurs.
 |
Si vous constatez une erreur ou si vous souhaitez qu'une fonction soit ajoutée à ce tableau, contacter en priorité l'auteur de cet article ou le responsable de la rubrique
MATLAB sur Developpez.com
|
2. Outils de gestion des images
2-A. Les fonctions MATLAB
| Fonction |
Description |
| image |
Affiche une image (objet graphique Image) |
| imagesc |
Affiche une image (objet graphique Image) avec interpolation des couleurs |
| imread |
Lit une image d'un fichier (formats standards) |
| imwrite |
Ecrit une image dans fichier (formats standards) |
| imfinfo |
Extrait des informations d'un fichier (formats standards) |
| print |
Exporte une image (formats standards) |
2-B. Les Toolbox
Il existe trois Toolbox MATLAB spécifiques liées à l'acquisition, à l'analyse et au traitement des images :
2-C. Les images tests
De nombreuses images tests sont disponibles avec ou sans les toolbox spécifiques au traitement d'images.
Avec MATLAB :
Chaque image est enregistrée dans un fichier .mat et chacun de ces fichiers comporte deux variables :
- X : la matrice image
- map : la palette de couleurs associées
Le chargement de ces images s'effectue avec la fonction load et l'affichage peut être obtenu comme ceci :
figure
load(<nom du fichier mat>);
colormap(map);
imagesc(X);
axis image
|
| Aperçu |
Fichier |
Dimension |
Type |
 |
cape.mat |
X : 360x360 map : 192x3 |
Couleurs indexées Classe double [1 size(map,1)] |
 |
clown.mat |
X : 200x320 map : 81x3 |
Couleurs indexées Classe double [1 size(map,1)] |
 |
detail.mat |
X : 359x371 map : 64x3 |
Couleurs indexées Classe double [1 size(map,1)] |
 |
durer.mat |
X : 648x509 map : 128x3 |
Couleurs indexées Classe double [1 size(map,1)] |
 |
earth.mat |
X : 257x250 map : 64x3 |
Couleurs indexées Classe double [1 size(map,1)] |
 |
flujet.mat |
X : 400x300 map : 64x3 |
Couleurs indexées Classe double [1 size(map,1)] |
 |
gatlin.mat |
X : 480x640 map : 64x3 |
Couleurs indexées Classe double [1 size(map,1)] |
 |
gatlin2.mat |
X : 176x260 map : 64x3 |
Couleurs indexées Classe double [1 size(map,1)] |
 |
mandrill.mat |
X : 480x500 map : 220x3 |
Couleurs indexées Classe double [1 size(map,1)] |
 |
spine.mat |
X : 367x490 map : 64x3 |
Couleurs indexées Classe double [1 size(map,1)] |
Il existe aussi une image au format JPEG disponible sur toutes les versions de MATLAB (même les plus anciennes).
Cette image se lit avec la fonction imread et s'affiche avec la fonction image.
| Aperçu |
Fichier |
Dimension |
Type |
 |
ngc6543a.jpg |
650x600x3 |
Couleurs vraies - RGB Classe uint8 [0 255] |
Avec l'Image Processing Toolbox :
Cette toolbox est livrée avec plusieurs images dans les formats courants (jpeg, tiff, png).
Format JPEG :
| Aperçu |
Fichier |
Dimension |
Type |
 |
football.jpg |
256x320x3 |
Couleurs vraies - RGB Classe uint8 [0 255] |
 |
greens.jpg |
300x500x3 |
Couleurs vraies - RGB Classe uint8 [0 255] |
Format TIFF :
| Aperçu |
Fichier |
Dimension |
Type |
 |
AT3_1m4_01.tif AT3_1m4_02.tif ... AT3_1m4_10.tif |
480x640 |
Couleurs indexées Classe uint8 [0 255] |
 |
autumn.tif |
206x345x3 |
Couleurs vraies - RGB Classe uint8 [0 255] |
 |
board.tif |
648x306x3 |
Couleurs vraies - RGB Classe uint8 [0 255] |
 |
cameraman.tif |
256x256 |
Couleurs indexées Classe uint8 [0 255] |
 |
canoe.tif |
207x346 (map : 256x3) |
Couleurs indexées Classe uint8 [0 255] |
 |
cameraman.tif |
159x191 |
Couleurs indexées Classe uint8 [0 255] |
 |
circbw.tif |
280x272 |
Image binaire Classe logic [0 1] |
 |
circuit.tif |
280x272 |
Couleurs indexées Classe uint8 [0 255] |
 |
eight.tif |
242x308 |
Couleurs indexées Classe uint8 [0 255] |
 |
forest.tif |
301x447 (map : 256x3) |
Couleurs indexées Classe uint8 [0 255] |
 |
kids.tif |
400x318 (map : 256x3) |
Couleurs indexées Classe uint8 [0 255] |
 |
logo.tif |
107x122 |
Image binaire Classe logic [0 1] |
 |
m83.tif |
378x400 (map : 256x3) |
Couleurs indexées Classe uint8 [0 255] |
 |
mandi.tif |
2014x3039 |
Couleurs indexées Classe uint8 [0 255] |
 |
moon.tif |
537x358 |
Couleurs indexées Classe uint8 [0 255] |
 |
mri.tif |
128x128 (map : 256x3) |
Couleurs indexées Classe uint8 [0 255] |
 |
paper1.tif |
229x224 |
Couleurs indexées Classe uint8 [0 255] |
 |
pout.tif |
291x240 |
Couleurs indexées Classe uint8 [0 255] |
 |
shadow.tif |
223x298 (map : 256x3) |
Couleurs indexées Classe uint8 [0 255] |
 |
spine.tif |
367x490 (map : 256x3) |
Couleurs indexées Classe uint8 [0 255] |
 |
tire.tif |
205x232 |
Couleurs indexées Classe uint8 [0 255] |
 |
trees.tif |
258x350 (map : 256x3) |
Couleurs indexées Classe uint8 [0 255] |
Format PNG :
| Aperçu |
Fichier |
Dimension |
Type |
 |
bag.png |
250x189 |
Couleurs indexées Classe uint8 [0 255] |
 |
blobs.png |
272x329 |
Image binaire Classe logic [0 1] |
 |
circles.png |
256x256 |
Image binaire Classe logic [0 1] |
 |
coins.png |
246x300 |
Couleurs indexées Classe uint8 [0 255] |
 |
concordaerial.png |
2036x3060x3 |
Couleurs vraies - RGB Classe uint8 [0 255] |
 |
concordorthophoto.png |
2215x2956 |
Couleurs indexées Classe uint8 [0 255] |
 |
fabric.png |
480x640x3 |
Couleurs vraies - RGB Classe uint8 [0 255] |
 |
gantrycrane.png |
264x400x3 |
Couleurs vraies - RGB Classe uint8 [0 255] |
 |
glass.png |
181x282 |
Couleurs indexées Classe uint8 [0 255] |
 |
hestain.png |
227x303x3 |
Couleurs vraies - RGB Classe uint8 [0 255] |
 |
liftingbody.png |
512x512 |
Couleurs indexées Classe uint8 [0 255] |
 |
onion.png |
135x198x3 |
Couleurs vraies - RGB Classe uint8 [0 255] |
 |
pears.png |
486x732x3 |
Couleurs vraies - RGB Classe uint8 [0 255] |
 |
peppers.png |
384x512x3 |
Couleurs vraies - RGB Classe uint8 [0 255] |
 |
pillsetc.png |
384x512x3 |
Couleurs vraies - RGB Classe uint8 [0 255] |
 |
rice.png |
256x256 |
Couleurs indexées Classe uint8 [0 255] |
 |
saturn.png |
1500x1200x3 |
Couleurs vraies - RGB Classe uint8 [0 255] |
 |
snowflakes.png |
110x370 |
Couleurs indexées Classe uint8 [0 255] |
 |
tape.png |
384x512x3 |
Couleurs vraies - RGB Classe uint8 [0 255] |
 |
testpat1.png |
256x256 |
Couleurs indexées Classe uint8 [0 255] |
 |
text.png |
256x256 |
Image binaire Classe logic [0 1] |
 |
tissue.png |
506x800x3 |
Couleurs vraies - RGB Classe uint8 [0 255] |
 |
westconcordaerial.png |
394x369x3 |
Couleurs vraies - RGB Classe uint8 [0 255] |
 |
westconcordorthophoto.png |
366x364 |
Couleurs indexées Classe uint8 [0 255] |
3. Représentation des images
3-A. Matrice image
MATLAB peut lire des images codées sur 8, 16, 24 ou 32 bits. Mais le stockage de ces données ne peut être fait qu'avec trois types de variables :
- le type uint8 (entier non signé de 8bits) de plage [0 255]
- le type uint16 (entier non signé de 16bits) de plage [0 65535]
- le type double (réel 64bits) de plage [0 1] (Plus généralement : [-realmax realmax])
Par défaut, les fonctions sous MATLAB étant faites pour traiter des matrices de type double, il peut être nécessaire
de convertir les données de la matrice image, codées en type uint8/uint16, en type double avant de les utiliser avec certaines fonctions comme : conv2, convn, fft2, fftn...
Dans le cas contraire, un warning sera retourné (exemple avec fftn) :
Warning: FFTN on values of class UINT8 is obsolete.
Use FFTN(DOUBLE(X)) or FFTN(SINGLE(X)) instead.
|
MATLAB interprète les couleurs associées à l'image de plusieurs manières selon le type de données contenues dans la matrice image.
3-B. Objets graphiques représentant les images
Parmi les nombreux objets graphiques disponibles sous MATLAB, deux permettent de visualiser des images :
l'objet graphique de type Image et l'objet graphique de type Surface.
3-B-1. L'objet Image
L'objet graphique de type Image est l'objet généralement utilisé pour visualiser les images. Il est généré soit par la fonction image, soit par la fonction imagesc.
Cet objet a pour parent un objet conteneur de type Axes et il ne possède pas lui-même d'objet enfant.
La seule restriction concernant cet objet est qu'il est impérativement créé dans le plan x0y et qu'il ne peut en aucun cas être manipulé en rotation (par des fonctions
comme rotate3D par exemple).
Les propriétés principales de cet objet sont :
- CData : matrice 2D ou 3D contenant les valeurs des pixels de l'image
- CDataMapping : interprétation des valeurs pixels sous forme de couleur (valeur 'direct' ou 'scale')
- XData : position dans le repère x0y du premier et du dernier pixel suivant l'axe x
- YData : position dans le repère x0y du premier et du dernier pixel suivant l'axe y
La liste complète des propriétés de l'objet Image est disponible ici.
Le code suivant montre la différence entre une image dont le premier pixel est centré en (1,1) et une autre image dont le
premier pixel est centré en (5,4) :
function placeimage
rgb=rand(3,6,3);
figure('numbertitle','off',...
'toolbar','none','menubar','none')
subplot(2,1,1)
image(rgb)
axis image
hold on
plot(1,1,'ro')
subplot(2,1,2)
image(rgb,'xdata',5,'ydata',4 )
axis image
hold on
plot(5,4,'ro')
|
Voici le résultat à l'affichage :
3-B-2. L'objet Surface
Un objet de type Image étant contraint à être dessiné dans le plan x0y, un objet Surface sera utilisé dans les cas d'affichage
d'image dans un plan quelconque. Ce type d'objet est généré par des fonctions comme : surf, surface, pcolor, ...
Cet objet a pour parent un objet conteneur de type Axes et il ne possède pas d'objet enfant.
La liste des propriétés des objets Surface est disponible ici.
Un point très intéressant de cet objet est qu'il peut également servir à appliquer une image comme texture sur une surface mathématique.
Le code ci-dessous montre comment plaquer l'image suivante ( Projet Blue Marble - NASA's Earth Observatory) sur une sphère :

figure('doublebuffer','on',...
'renderer','opengl',...
'numbertitle','off',...
'name','Projet Blue Marble - NASA''s Earth Observatory',...
'menubar','none',...
'toolbar','none',...
'units','pixels',...
'position',[200 200 400 300])
X=imread('BlueMarble.jpg','jpg');
X=X(end:-1:1,:,:);
n=50;
theta = (-n:2:n)/n*pi;
phi = (-n:2:n)'/n*pi/2;
cosphi = cos(phi); cosphi(1) = 0; cosphi(n+1) = 0;
sintheta = sin(theta); sintheta(1) = 0; sintheta(n+1) = 0;
r=1;
x = r*cosphi*cos(theta);
y = r*cosphi*sintheta;
z = r*sin(phi)*ones(1,n+1);
surf(x,y,z,'facecolor','texturemap',...
'cdata',X,'edgecolor','none');
axis tight
axis equal
axis off
axis vis3d
cameratoolbar
cameratoolbar('setcoordsys', 'none')
|
Ce qui donne :
Sous MATLAB, utilisez le bouton "Orbit Camera" (  ) de la barre d'outils pour faire tourner la sphère terrestre.
4. Ressources disponibles
5. Les images cachées (Easter Eggs)
De nombreux développeurs MATLAB furent surpris, suite à une mauvais manipulation (l'appel de la fonction image sans argument), de voir apparaitre
la photo d'un petit garçon à l'écran (qui plus est la tête à l'envers) :
Steve Eddins a donné la clé de ce mystère dans son blog.
Voici donc un programme permettant de visualiser les 15 images cachées dans MATLAB depuis la version 5.0 :
function showhiddenimages
defimage = pow2(get(0,'DefaultImageCData'),47);
figure('numbertitle','off','name','MATLAB hidden images',...
'toolbar','none','menubar','none')
colormap(gray)
X=[47,51
42,46
37,41
36,36
35,35
34,34
33,33
28,32
23,27
18,22
13,16
9,12
5,8
1,4];
for n=1:14
subplot(3,5,n)
imagesc(bitslice(defimage,X(n,1),X(n,2)));
axis image off
title(num2str(n))
end
subplot(3,5,15)
r = bitslice(defimage,0,0);
g = bitslice(defimage,17,17);
b = bitslice(defimage,34,34);
imagesc(cat(3,r,g,b));
axis image off
title('15')
function b = bitslice(a,lowbit,highbit)
numbits = highbit - lowbit + 1;
b = bitshift(a,-lowbit);
b = fix(b);
b = bitand(b,bitcmp(0,numbits));
b = b/max(b(:));
|
Commentaires sur ces images (toujours d'après Steve Eddins) :
- le plus vieux des fils de Steve Eddins
- un chien appartenant à un développeur de The MathWorks
- un autre chien appartenant à un développeur de The MathWorks
- l'inverse de la matrice de Hilbert (3x3)
- le logo (initial et de mauvaise résolution) de The MathWorks
- le nombre préféré de Loren Shure
- le carré magique (3x3)
- le plus jeune des fils de Steve Eddins
- le carré magique caché dans la gravure de Albrecht Dürer, Melancholia
- des pièces de monnaies (en fait un calembour en anglais...)
- Loren Shure âgée de 4 ans
- Wilkinson, Givens, and Forsythe, à la Gatlinburg Conference de 1964 sur l'algèbre numérique.
- Steve Eddins lui-même
- l'image par défaut de MATLAB 4
- l'histoire du cochon jaune
Remerciements
L'auteur tient à remercier UNi[FR] pour la correction orthographique de cet article.
 
Copyright © 2007-2008 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'à 3 ans de prison et jusqu'à 300 000 E
de dommages et intérêts.
Cette page est déposée à la
SACD.
|