在三维空间中叠加多个图像的分层处理

9
假设我们有一个大小为49x49x5的矩阵I,对应5个大小为49x49的图像沿第三个维度堆叠,因此我们总共有5个图像。这些图像应该可视化3D空间中气体密度,因此我们可以将每个图像视为在不同位置切割房间的截面。
是否有办法在MATLAB中制作一张图,其中显示所有5个图像悬挂在它们“来自”的3D空间中?
以下是一张图片,希望能让我的需求更清晰: 5 images haning in 3D space

你用什么生成了那张图片? - Jacob
3个回答

12

考虑下面的例子。它使用低级别的SURFACE函数来绘制堆叠图片:

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

我正在使用索引颜色图像(通过直接映射来实现),但很容易改为使用灰度图像(通过比例缩放映射来实现)。

如果您想要像您在问题中展示的那样将3D空间排列,只需交换Y和Z维度(图像沿Y维堆叠而不是Z维)。

通常,要对查看角度进行更多控制,请使用相机操作函数

screenshot_zstacked_indexed screenshot_ystacked_grayscale


请问您如何通过加载一个图像来制作五个图像?如果我有5个不同的JPEG图像,想要将它们悬挂在3D中,这个想法怎么样?@Amro - Muhammad Usman Saleem
1
在上面的例子中,我只是重复相同的图像5次,并将它们叠放在一起。您可以以同样的方式读取不同的图像,只要它们都是相同的大小。此外,我正在使用“索引”图像,但您可以将其更改为显示“灰度”(堆叠在第3维中)或“真彩色”图像(堆叠在第4维中)。这是RGB图像的示例:http://pastebin.com/T1shKdYF - Amro
感谢您美丽的回复。是的,我知道您只是在Matlab中加载内置图像,然后通过重塑创建该图像的副本。实际上,我有3个不同的JPEG图像。这些是我想要显示为三维的上层大气天气图表,其中Z轴将是大气中的高度?在阅读这3个图像之后,我在哪里可以修改您可爱而美丽的代码?请参见Eykanal的原型图像。@Amro我是您的粉丝...我等了很多天才能和您交谈。最终你听到了我的声音... - Muhammad Usman Saleem
@MuhammadUsmanSaleem 谢谢。就像我在pastebin中展示的那样,将图像堆叠在彼此之上。所以如果你有3个RGB图像,那么就是 I = cat(4,img1,img2,img3)。同时,在我的例子中,我只是使用索引k作为Z轴坐标。因此,如果每个图像都有特定的“高度”,请使用它(即用正确的高度替换 'ZData',Z.*k 部分)。如果您需要进一步帮助,最好创建一个新问题,而不是在评论中发布答案。只需确保包括所有必要的信息以及您当前的代码即可。 - Amro
您好,以下是編程相關內容的中文翻譯:或者使用 .jpg 圖像進行z軸層疊?我的溫度、高度和風速數據在文本文件中,從那裡我生成了這些圖像(圖表)。現在當我對您美麗的代碼進行一些修改時,它會按照我想要的方式堆疊三個圖像,但所有圖像的背景都變成了棕色,這使讀者甚至無法查看這個3D圖。請告訴我,在製作我的圖表時,如果將它們製作成切片,那麼我就可以根據這個新問題發布嗎?@Amro - Muhammad Usman Saleem
显示剩余3条评论

3
您要查找的函数是patch函数。举个例子:
x=[1 1 6]; y=[2 7 2]; z=[1 1 -1];

这个指定了一个三角形(三个点),顶点的坐标分别为(1,2,1)(1,6,1)(6,2,-1)。如果你对每个向量都添加一个第四个点,它将成为一个矩形,新的顶点在新的x、y、z坐标上。

为了直接回答您发布的问题,您可以通过使用xyz的多维数组来为每个变量绘制多个矩形,其中每列指定不同的多边形。实际应用中,情况如下:

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

这意味着:

四个堆叠的矩形

你可以使用选项为多边形添加颜色,请查看文档。


1
也许你误解了(可能是因为我的图像单独看有误导性)。我想用存储在矩阵中的图像来填补那些裂缝。这是否可以使用patches完成?我现在正在检查slice()功能,它似乎很有前途。 - Vidar
1
@Vidar - 实际上,它是可以的,但我的例子不是你要找的。请查看补丁属性页面,CData部分。 - eykanal
@eykanal,请问您可以指导我如何理解上面的 Armo 的答案吗? - Muhammad Usman Saleem

2

1
链接已损坏;替换为搜索该文本的结果。 - IRTFM

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接