2011-10-07 10 views
9

Supponiamo di avere una matrice I di dimensioni 49x49x5, corrispondente a 5 immagini di dimensioni 49x49 impilate lungo la terza dimensione, quindi abbiamo un totale di 5 immagini. Queste immagini dovrebbero visualizzare la densità di un gas in uno spazio 3D, quindi possiamo pensare a ciascuna immagine come a una sezione della stanza in diverse posizioni.Stratificazione di più immagini nello spazio 3D

C'è un modo per creare una figura in MATLAB in cui tutte e 5 le immagini vengono visualizzate come appese nello spazio 3D da cui "provengono"?

Ecco un'immagine si spera che lo rende più chiaro quello che sono dopo: 5 images haning in 3D space

+0

Cosa hai usato per generare l'immagine? – Jacob

+2

Google Sketchup :) – Vidar

risposta

12

Considerare il seguente esempio. Si utilizza la funzione di basso livello SURFACE per tracciare immagini impilati:

%# 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]) 

sto usando immagini a colori indicizzati (con mappatura colore diretto), ma può essere facilmente modificato per usare immagini in scala di grigi (con mappatura dei colori in scala).

Ora, se si desidera disporre lo spazio 3D come mostrato nella domanda, è sufficiente interscambiare le dimensioni Y e Z (immagini raggruppate lungo la dimensione Y anziché la dimensione Z).

In generale, per avere un maggiore controllo sull'angolo di visualizzazione, utilizzare camera manipulation functions.

screenshot_zstacked_indexed screenshot_ystacked_grayscale

+0

posso chiederti come fai cinque immagini caricandone una? che dire dell'idea se ho 5 diverse immagini gpeg e voglio appenderle come in 3d? @Amro –

+1

@MuhammadUsmanSaleem nell'esempio precedente Sto solo ripetendo la stessa immagine 5 volte e impilandole una sopra l'altra. Ovviamente puoi leggere diverse immagini nello stesso modo, purché abbiano tutte la stessa dimensione. Inoltre, stavo usando le immagini "indicizzate", ma puoi cambiarle per visualizzare le immagini "in scala di grigi" (impilate nella terza sfumatura) o "truecolor" (impilate nella quarta sfumatura). Ecco un esempio per le immagini RGB: http://pastebin.com/T1shKdYF – Amro

+0

grazie per la bellissima risposta. Sì, so che basta caricare l'immagine creata in MATLAB, quindi creare copie di questa immagine rimodellando. In realtà ho 3 diverse immagini gpeg. Queste sono le migliori chat atmosferiche atmosferiche che voglio mostrare come 3d dove z axiz sarà altezza nell'atmosfera? Come dopo aver letto queste 3 immagini, allora dove faccio le modifiche nel tuo codice amorevole e bello? Si prega di vedere l'immagine prototipo eykanal qui sotto. @ Amro sono il tuo fan .... stavo aspettando da un pò di giorni a parlare con te. Finale senti la mia voce ... –

3

La funzione che stai cercando è la funzione patch. A titolo di esempio:

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

Specifica un triangolo (tre punti), e le coordinate dei vertici sono (1,2,1), (1,6,1) e (6,2,-1). Se si aggiungesse un quarto punto a ciascun vettore, questo sarebbe un rettangolo, con il nuovo vertice alla nuova coordinata x, y, z.

Per rispondere alla tua domanda postata direttamente, è possibile tracciare una serie di rettangoli per ogni variabile semplicemente utilizzando un array multidimensionale per x, y, e z, dove ogni colonna specifica un poligono diverso. In pratica, questo funziona come segue:

% 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'); 

che rende:

Four stacked rectangles

Ci sono opzioni che è possibile utilizzare per aggiungere colore ai poligoni, controllare la documentazione.

+1

Forse hai frainteso (e la mia immagine da sola era fuorviante). Voglio riempire quelle patch con le immagini memorizzate nella matrice. Può essere fatto con le patch? Sto controllando slice() ora che sembra promettente. – Vidar

+1

@Vidar - In realtà, può, ma il mio esempio non è quello che stai cercando allora. Controlla la pagina [Patch Properties] (http://www.mathworks.com/help/techdoc/ref/patch_props.html?), La sezione CData. – eykanal

+0

@eykanal mi guidi sopra la risposta Armo per favore –

Problemi correlati