Sometimes I have to put text on a path

Friday, July 11, 2008

codes matlab 2D 3D image (fr)

xes abscisses d'un graphique ?
Les objets de type Axes ne possèdent pas de propriété permettant d'incliner les labels des repères de l'axe des abscisses d'un graphique.

Il existe néanmoins plusieurs contributions disponibles sur le File EXchange qui répondent à ce besoin :


---------------

Comment mettre une étiquette à mes points ?
x=rand(3,1);
y=rand(3,1);

figure
plot(x,y,'r+');

str=num2str([1:numel(x)].','%1d'); % ATTENTION le premier argument de NUM2STR doit être un vecteur colonne
text(x+0.01,y+0.01,str) % Le décalage de 0.01 est arbitraire ici.
------------
omment tracer une ligne dont la couleur varie ?
x = rand(3,1);
y = rand(3,1);

figure
subplot(2,1,1)
plot(x,y)

subplot(2,1,2)

patch('xdata',[x;x(end:-1:1)],...
'ydata',[y;y(end:-1:1)],...
'facecolor','interp', ...
'edgecolor','interp',...
'facevertexcdata',[y;y(end:-1:1)])
-------------
omment animer le tracé d'une courbe ?
% Génération des données
th=0:0.02:10*pi;
y=sin(th);

% Création de l'objet Figure contenant les tracés
fig=figure;

% Première objet Axes  est tracée la courbe directe
subplot(2,1,1)
% Tracé de la courbe
plot(th,y,'r-')
% Ajustement des limites de l'objet Axes
xlim([min(th) max(th)])
ylim([min(y) max(y)])

% Second objet Axes  est tracée la courbe animée
subplot(2,1,2)

% Modification de la propriété DoubleBuffer de l'objet Figure pour
% éviter le clignotement de la fenêtre
% NECESSAIRE POUR TOUTE ANIMATION
set(fig,'doublebuffer','on')

% Tracé du premier point de la courbe
% et récupération de l'identifiant (handle) p de l'objet Line crée.
p=plot(th(1),y(1),'r-');
% Ajustement des limites de l'objet Axes
xlim([min(th) max(th)])
ylim([min(y) max(y)])

% On boucle sur le nombre de points à tracer. 
% On démarre à 2 puisque le premier est déjà tracé
for n=2:numel(th)

% Ajout des points de la courbe au fur et à mesure
% en utilisant la combinaison SET + identifiant (handle)
set(p,'xdata',th(1:n),'ydata',y(1:n));
% Forçage de l'affichage du tracé
drawnow

end
-------------
Comment récupérer les valeurs de données tracées ?
Dans tous les cas, il faut utiliser la fonction FINDOBJ pour récupérer l'identifiant de l'objet dont on veut
récupérer les données.

Pour les objets de type Line (nuage de points ou lignes), Surface ou Mesh, on récupère les propriétés XDATA, YDATA et ZDATA

Pour les objets de type Image, on récupère la propriété CDATA

Pour les objets de type Patch, on récupère, soit les propriétés XDATA, YDATA et ZDATA, soit les propriétés VERTICES et FACES


[X,Y,Z] = peaks(20)
surf(X,Y,Z);

h=findobj('type','surf');
xx=get(h,'xdata')
yy=get(h,'ydata')

zz=get(h,'zdata')
--------------------
Comment redimensionner une image ?
La première solution consiste à utiliser la fonction IMRESIZE contenue dans l'Image Processing Toolbox.

La deuxième solution utilise l'indexage des matrices. Puisqu'une
image est une matrice 2D ou 3D (RGB), il est très simple de diminuer la
taille d'une image en jouant sur l'indexage. Par exemple, pour diminuer
par deux la taille d'une image 2D, il suffit de ne conserver qu'un pixel sur deux


img=rand(150,200); % Une image 2D aléatoire
size(img)

ans =

150   200

img=img(1:2:end,1:2:end);

size(img)

ans =

75   100

--------Pour une image 3D (RGB), le code devient :
img=rand(150,200,3); % Une image 3D (RGB) aléatoire
size(img)

ans =

150   200     3

img=img(1:2:end,1:2:end,:);

size(img)

ans =

75   100     3
-----
On remarque que cette solution utilisant l'indexage se limite à des facteurs de réductions/agrandissement entier.

La troisième solution utilise les fonctions d'interpolation.

Soit INTERP2 pour diminuer par deux la taille d'une image 2D :
img = rand(150,200); % Une image 2D aléatoire
size(img)

ans =

150   200

[c,r ] = size(img); % Récupération des 2 dimensions de l'image

[ci,ri] = meshgrid(1:2:r,1:2:c); % Génération de la grille d'interpolation

img = interp2(img,ci,ri); % Interpolation des valeurs des pixels

size(img)

ans =

75   100

Soit INTERP3 pour diminuer par deux la taille d'une image 3D :
img = rand(150,200,3); % Une image 3D (RGB) aléatoire
size(img)

ans =

150   200     3

[c,r,p] = size(img); % Récupération des 3 dimensions de l'image

[ci,ri,pi] = meshgrid(1:2:r,1:2:c,1:p); % Génération de la grille d'interpolation

img = interp3(img,ci,ri,pi); % Interpolation des valeurs des pixels du plan R

size(img)

ans =

ans =

75   100     3

1 comment:

  1. bonjour,
    a ce que si possible tracer des courbes de fonctions x, en matlab, mais la fonction x "ni pas défini" c'est a dire ne pas connu, mais on a les condition sur cette fonction

    ReplyDelete