2011-10-07 11 views
9

Supongamos que tenemos una matriz I de tamaño 49x49x5, que corresponde a 5 imágenes de tamaño 49x49 apiladas a lo largo de la tercera dimensión, por lo que tenemos un total de 5 imágenes. Estas imágenes deben visualizar la densidad de un gas en un espacio 3D, por lo que podemos pensar en cada imagen como un corte de sección de la habitación en diferentes lugares.Capas de varias imágenes en 3D-espacio

¿Hay alguna manera de hacer una figura en MATLAB donde las 5 imágenes se muestran colgadas en el espacio 3D del que "provienen"?

Aquí está una imagen de esperar por lo que es más claro lo que busco: 5 images haning in 3D space

+0

¿Qué usaste para generar esa imagen? – Jacob

+2

Google Sketchup :) – Vidar

Respuesta

12

Considere el siguiente ejemplo. Utiliza la función de bajo nivel SURFACE para trazar imágenes apiladas:

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

estoy usando imágenes de color indexado (con asignación de colores directa), pero se puede cambiar fácilmente para utilizar las imágenes en escala de grises (con asignación de colores en escala).

Ahora, si desea obtener el espacio 3D dispuesto como lo ha mostrado en su pregunta, simplemente intercambie las dimensiones Y y Z (imágenes apiladas a lo largo de la dimensión Y en lugar de la dimensión Z).

En general, para tener más control en el ángulo de visión, utilice camera manipulation functions.

screenshot_zstacked_indexed screenshot_ystacked_grayscale

+0

¿puedo preguntarte cómo haces cinco imágenes cargando una? ¿Qué pasa con la idea si tengo 5 imágenes gpeg diferentes y quiero colgarlas como en 3D? @Amro –

+1

@MuhammadUsmanSaleem en el ejemplo anterior. Simplemente estoy repitiendo la misma imagen 5 veces y apilándolas una encima de la otra. Obviamente, puede leer diferentes imágenes de la misma manera, siempre que todas sean del mismo tamaño. También estaba usando imágenes "indexadas", pero puede cambiarlas para mostrar imágenes en "escala de grises" (apiladas en el 3. ° tenue) o "en color verdadero" (apiladas en el 4. ° tenue). Aquí hay un ejemplo de imágenes RGB: http://pastebin.com/T1shKdYF – Amro

+0

gracias por hermosa respuesta. Sí, sé que acaba de cargar la construcción en imagen en matlab, luego crea copias de esta imagen mediante una nueva configuración. En realidad tengo 3 imágenes gpeg diferentes. Estos son los chats meteorológicos de la atmósfera superior que quiero mostrar como 3d donde z axiz será altura en la atmósfera? ¿Cómo después de leer estas 3 imágenes, entonces dónde hago la modificación en su código amoroso y hermoso? Por favor, vea la imagen del prototipo de eykanal a continuación. @Amro soy tu fan .... Estaba esperando de un par de días para hablar contigo. Final escuchas mi voz ... –

3

La función que está buscando es la función patch. A modo de ejemplo:

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

Esto especifica un triángulo (tres puntos), y las coordenadas de los vértices son (1,2,1), (1,6,1), y (6,2,-1). Si agregara un cuarto punto a cada vector, sería un rectángulo, con el nuevo vértice en la nueva coordenada x, y, z.

Para responder a su pregunta publicada directamente, puede trazar una serie de rectángulos para cada variable, simplemente usando una matriz multidimensional para x, y y z, donde cada columna especifica un polígono diferente. En la práctica, esto funciona de la siguiente manera:

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

Lo que hace:

Four stacked rectangles

Hay opciones que puede utilizar para añadir color a los polígonos, comprobar los documentos.

+1

Tal vez lo malinterpretaste (y mi imagen sola fue engañosa). Quiero llenar esos parches con imágenes almacenadas en la matriz. ¿Se puede hacer eso con parches? Estoy revisando slice() ahora que parece prometedor. – Vidar

+1

@Vidar - En realidad, sí, pero mi ejemplo no es lo que estás buscando en ese momento. Consulte la página [Patch Properties] (http://www.mathworks.com/help/techdoc/ref/patch_props.html?), La sección CData. – eykanal

+0

@eykanal me guiarás por encima de la respuesta de Armo por favor –

Cuestiones relacionadas