Tutoriel Matlab

FAQ

Comment représenter une image dans le repère usuel ?
Comment enregistrer une matrice dans un fichier ?
Comment charger un fichier dans une matrice ?
Comment enregistrer une matrice sous forme d'image ?
Comment représenter une image (en niveau de gris) en 3D ?
Comment parcourir un ensemble de fichiers d'un répertoire ?
Comment ajouter une barre de progression ?
Comment ajouter un répertoire au PATH de Matlab ?
Comment supprimer les espaces inutiles entre les images des subplot ?Comment ajouter un titre global à une figure de subplot ?
Comment créer un gif ?
Comment créer visuellement un masque ?

Comment représenter une image dans le repère usuel ?

Par convention une matrice A=(a_{ij}) avec i\in [0,M-1] et
j\in [0,N-1] (donc de taille M\times N) est représentée sous forme d'image de la manière suivante :

dipum_fig_2_1_a

Sous Matlab également, à l'exception près que les indices débutent à 1 (et non plus 0) et donc se termine en M et N.

Ainsi si la matrice A nous sert à échantillonner la fonction f(x,y) dans le plan usuel (les x en abscisse vers la droite et y en ordonnée vers le haut) il faut effectuer un changement de repère pour visualiser la fonction dans le repère usuel. Pour inverser les rôles des deux axes de la figure ci-dessous on considère la transposée de la matrice A, puis pour rétablir l'axe (y) vers le haut on utilise la commande flipud de Matlab.

Pour résumé :

imagesc(flipud(A')); 
colormap(gray);

On voit l'image dans le bon sens, mais les graduations des ordonnées sont toujours dans le mauvais sens. Pour renverser la vapeur on utilise la commande :

set(gca,'YDir','normal');

Seulement cela a également pour effet de retourner l'image comme le faisait flipud ! Donc on comprend que l'utilisation de set(...) nous dispense d'utiliser le premier flipud, au final :

imagesc(X')
set(gca,'YDir','normal');

Comment enregistrer une matrice dans un fichier ?

save('test.mat','X')

Comment charger un fichier dans une matrice ?

load('test.mat','X')
# ou X = load('test.txt') pour un fichier texte
# ou X = imread('test.tiff') pour une image au format TIFF

Comment enregistrer une matrice sous forme d'image ?

imagetosave = mat2gray(X)
imwrite(imagetosave,'nom.jpg')


Comment représenter une image (en niveau de gris) en 3D ?

Si par exemple on souhaite voir en "relief" la célèbre image de Lena :

Lena en 3D

function out = image_3D(img)
I = imread(img);          % store the data into a matrix I
m = size(I,1);            % number of rows
n = size(I,2);            % number of columns
I = double(I);            % convert the entries to double
minI = min(min(I));       % min of all the data
maxI = max(max(I));       % max of all the data

% we create a grid of the same size
x = 1 : 1 : m; 
y = 1 : 1 : n; 
[X,Y] = meshgrid(x,y);

f=figure('Visible','on');       % turn 'off' to disable display
s2 = subplot(1,2,2,'position',[0.5 0 0.7 0.7]);
set(s2,'Units','normalized');
hold on;
surf(X,Y,I,'LineStyle','none'); % the 3D view of the grayscale image
colormap(jet);                  % you can change the colormap
caxis([minI,maxI]);             % to use the complete range of colormap
colorbar;                       % add a colorbar
imgzposition = 2*minI-maxI;     % position of the 2D view under the 3D view

% scale the between [0, 255] in order to use a custom color map for it.
scaledimg = (floor1*255)); % perform scaling

% convert the image to a true color image with the gray colormap.
colorimg = ind2rgb(scaledimg,gray(256));

% plot the image plane using surf.
surf([1 m],[1 n],repmat(imgzposition, [2 2]),...
    colorimg,'facecolor','texture');
set(s2,'YDir','reverse');
view(45,30);
xlabel('x');
ylabel('y');
zlabel('z');
title('3D view of the grayscale image');

% We put aside the input grayscale image
s1 = subplot(1,2,1,'position',[0 0.1 0.4 0.5]);
set(s1,'Units','normalized');
imagesc(colorimg);
xlabel('x');
ylabel('y');
title('the input grayscale image');
%truesize;

set(f, 'Color', 'w');
f = tightfig(f);
[pathstr,name,ext] = fileparts(img); % to separate name and extension
saveas(f,strcat(name,'.pdf'));
% export_fig does not work because we use a RGB data
end

Comment parcourir un ensemble de fichiers d'un répertoire ?

files = dir('*.tif');
filenames = {files.name}';
for i=1:length(filenames)
name = filenames(i); % which is a cell
image_3D(name{1});   % name{1} is the string contained inside it
end

Comment ajouter une barre de progression ?

h = waitbar(0,'Please wait...');
for i=1:100, % computation here %
waitbar(i/100)
end
close(h)

Comment ajouter un répertoire au PATH de Matlab ?

tmp=which('filename');     % recherche le chemin vers le fichier "filename"
index=strfind(tmp,'/');    % index du caractère '/' dans la chaîne tmp              
p=tmp(1:index(end));       % répertoire qui contient le fichier "filename"
addpath([p,'foldername']); % ajoute le répertoire "foldername" au chemin
% addpath(genpath(p));     % ajoute tous les (sous) répertoires
clear p tmp index          % efface ces variables temporaires

Comment supprimer les espaces inutiles entre les images des subplot ?

f=figure; % 3 images en subplot
subplot(1,3,1);
load clown; image(X); axis image; colormap(map)
freezeColors; % pour que chaque image ait sa propre colormap
subplot(1,3,2);
load earth; image(X); axis image; colormap(map)
freezeColors;
subplot(1,3,3);
load mandrill; image(X); axis image; colormap(map)

on obtient :

Capture d’écran 2016-03-04 à 16.07.14

Si on rajoute ces deux lignes à la fin :

truesize(f,[200 200]); % supprime les espaces en haut et en base
tightfig;              % supprime les espaces à gauche et à droite

on obtient :

Capture d’écran 2016-03-04 à 16.08.35

Comment ajouter un titre global à une figure de subplot ?
Grâche à la commande suptitle('Titre'), tout simplement.

Comment créer un gif ?

for i=1:100
f=figure;
print(f, '-dpng', ['image_',num2str(iter,'%03d'),'.png']);
close(f);
end

L'option '%03d' permet de mettre deux 0 devant les chiffres et un 0 devant les nombres de 2 chiffres. Cela permet d'avoir des numéros d'images bien ordonnées pour ensuite créer le gif via la commande convert dans un terminal :

convert -delay 50 -loop 0 image_*.png animation.gif

L'option -delay donne le temps entre deux frames en centième de secondes, ici 50*1/100s = 0,5s ; l'option -loop 0 précise que le gif doit tourner en boucle.

Comment créer visuellement un masque ?

Imaginez que vous avez cette image dont vous voulez supprimer la grande ligne :

xstarCette image dans Matlab est une matrice X (ici de taille 65x65). Pour supprimer la grande ligne, vous devez identifier la région de pixels R qui englobe cette ligne. C'est assez pénible de déterminer à la tâtons les indices de ces pixels. Voici comme s'y prendre visuellement :

1. Enregistrer la matrice sous forme d'image :

imwrite(X,'monimage.png')

2. Ouvrir monimage.png avec votre éditeur d'image préféré, par exemple gimp ou photoshop. Puis créer un nouveau masque (un "layer"), qui a donc la même taille que monimage.
3. Sélectionner le. Initialement vide, remplissez le en noire (Edition > Remplir), ce qui aura pour effet d'assigner des 0 à tous les pixels du fond du masque.
4. Utiliser l'oeil pour visualiser monimage tout en restant sélectionné sur le masque pour agir sur celui-ci.
5. Utiliser l'outil de "lasso polygonal" pour sélectionner la région qui englobe la ligne à faire disparaître. Remplissez cette région en blanc.
6. Exporter le masque en png.
7. Ouvrir monmasque.png dans Matlab :

masque=imread('monmasque.png');

La matrice masque est de taille 65x65x3 (car il y a 3 canaux pour la couleur), on va donc conserver qu'un seul des canaux et ramener la matrice à une taille 65x65 :

masque=squeeze(masque(:,:,1));

8. Reste à supprimer la ligne de X en assignant les pixels de la région R à zéro, pixels correspondant aux indices non nuls de la matrice masque, d'où :

X(find(masque>0))=0;

9. Visualisons le résultat :

figure; imagesc(X); colormap gray; axis image;

xstar2

Sélection du masque sous photoshop

Haut de page


  1. (I - minI)./(maxI - minI 

css.php