2011-10-07 5 views
9

Supposons que nous ayons une matrice I de taille 49x49x5, correspondant à 5 images de taille 49x49 empilées le long de la troisième dimension, donc nous avons un total de 5 images. Ces images doivent visualiser la densité d'un gaz dans un espace 3D, de sorte que nous pouvons considérer chaque image comme une section de la pièce à différents endroits.Superposition de plusieurs images dans l'espace 3D

Est-il possible de faire une figuration dans MATLAB où toutes les 5 images sont montrées comme suspendues dans l'espace 3D dont elles sont "venues"?

Voici une image, espérons le rendre plus clair ce que je suis après: 5 images haning in 3D space

+0

Qu'avez-vous utilisé pour générer cette image? – Jacob

+2

Google Sketchup :) – Vidar

Répondre

12

Considérons l'exemple suivant. Il utilise la fonction de bas niveau SURFACE pour tracer des images empilées:

%# create stacked images (I am simply repeating the same image 5 times) 
img = load('clown'); 
I = repmat(img.X,[1 1 5]); 
cmap = img.map; 

%# coordinates 
[X,Y] = meshgrid(1:size(I,2), 1:size(I,1)); 
Z = ones(size(I,1),size(I,2)); 

%# plot each slice as a texture-mapped surface (stacked along the Z-dimension) 
for k=1:size(I,3) 
    surface('XData',X-0.5, 'YData',Y-0.5, 'ZData',Z.*k, ... 
     'CData',I(:,:,k), 'CDataMapping','direct', ... 
     'EdgeColor','none', 'FaceColor','texturemap') 
end 
colormap(cmap) 
view(3), box on, axis tight square 
set(gca, 'YDir','reverse', 'ZLim',[0 size(I,3)+1]) 

J'utilise des images couleur indexées (avec cartographie couleur directe), mais il peut être facilement modifié pour utiliser les images en niveaux de gris (avec la cartographie des couleurs mis à l'échelle).

Maintenant, si vous voulez obtenir l'espace 3D arrangé comme vous l'avez montré dans votre question, il suffit d'interchanger les dimensions Y et Z (images empilées le long de la dimension Y au lieu de la dimension Z).

En général, pour avoir plus de contrôle sur l'angle de vue, utilisez le camera manipulation functions.

screenshot_zstacked_indexed screenshot_ystacked_grayscale

+0

puis-je demander comment vous faites cinq images en chargeant un? Qu'en est-il de l'idée si j'ai 5 images gpeg différentes et que je veux les accrocher comme en 3D? @Amro –

+1

@MuhammadUsmanSaleem dans l'exemple ci-dessus Je répète juste la même image 5 fois et je les empile les unes sur les autres. Vous pouvez évidemment lire des images différentes de la même manière, à condition qu'elles aient toutes la même taille. J'utilisais aussi des images "indexées", mais vous pouvez le changer pour afficher soit des images "en niveaux de gris" (empilées dans la 3ème dim) ou "truecolor" (empilées dans la 4ème dim). Voici un exemple pour les images RVB: http://pastebin.com/T1shKdYF – Amro

+0

merci pour la belle réponse. Oui, je sais que vous venez de charger dans l'image dans matlab, puis crée des copies de cette image en remodelant. En fait, j'ai 3 images gpeg différentes. Ce sont des conversations météorologiques atmosphériques supérieures que je veux montrer en 3D où z axiz sera hauteur dans l'atmosphère? Comment Après avoir lu ces 3 images, où puis-je modifier votre code aimante et belle? S'il vous plaît voir l'image prototype d'eykanal ci-dessous. @Amro je suis votre fan .... j'attendais d'un no de jours pour parler avec vous. Finale tu entends ma voix ... –

3

La fonction que vous cherchez est la fonction patch. A titre d'exemple:

x=[1 1 6]; y=[2 7 2]; z=[1 1 -1]; 

Ceci indique un triangle (trois points), et les coordonnées des sommets sont (1,2,1), (1,6,1) et (6,2,-1). Si vous ajouteriez un quatrième point à chaque vecteur, ce serait un rectangle, avec le nouveau sommet à la nouvelle coordonnée x, y, z.

Pour répondre à votre question directement affiché, vous pouvez tracer un certain nombre de rectangles pour chaque variable simplement en utilisant un tableau multidimensionnel pour x, y et z, où chaque colonne indique un polygone différent. En pratique, cela fonctionne comme suit:

% plot two rectangles 
x = [1 1 1 1; 
    1 1 1 1; 
    4 4 4 4; 
    4 4 4 4;]; 

y = [1 1 1 1; 
    2 2 2 2; 
    2 2 2 2; 
    1 1 1 1;]; 

z = [1 2 3 4; 
    1 2 3 4; 
    1 2 3 4; 
    1 2 3 4;]; 

patch(x,y,z,'w'); 

Ce qui fait:

Four stacked rectangles

Il y a des options que vous pouvez utiliser pour ajouter de la couleur aux polygones, vérifier les docs.

+1

Peut-être avez-vous mal compris (et mon image seule était trompeuse). Je veux remplir ces correctifs avec des images stockées dans la matrice. Cela peut-il être fait avec des correctifs? Je vérifie maintenant slice() qui semble prometteur. – Vidar

+1

@Vidar - En fait, c'est possible, mais mon exemple n'est pas ce que vous cherchez. Consultez la page [Patch Properties] (http://www.mathworks.com/help/techdoc/ref/patch_props.html?), La section CData. – eykanal

+0

@eykanal voulez-vous me guider au-dessus Armo réponse s'il vous plaît –

Questions connexes