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 avec et
(donc de taille ) est représentée sous forme d'image de la manière suivante :
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 nous sert à échantillonner la fonction dans le plan usuel (les en abscisse vers la droite et 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 , puis pour rétablir l'axe 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 :
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 :
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 :
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 :
Cette 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;
(I - minI)./(maxI - minI ↩