【发布时间】:2016-02-22 09:16:03
【问题描述】:
在 Matlab 中,我想绘制几个二维图像(I(x,y) 格式的二维矩阵中的所有数据)。我知道对于单个图,imagesc(I) 可以实现所需的图像。但是,现在,我得到了一些图像,并想将它们以堆栈格式放置,就像Examples中显示的图像一样
【问题讨论】:
-
你要的叫切片,看这个问题stackoverflow.com/questions/29625091/…
在 Matlab 中,我想绘制几个二维图像(I(x,y) 格式的二维矩阵中的所有数据)。我知道对于单个图,imagesc(I) 可以实现所需的图像。但是,现在,我得到了一些图像,并想将它们以堆栈格式放置,就像Examples中显示的图像一样
【问题讨论】:
正如您所暗示的,对您的问题最有用的功能是:slice。您还应该好好阅读这篇 Mathworks 文章:Exploring Volumes with Slice Planes,因为它提供了有关如何使用 slice 的更多示例。
在您的情况下,您拥有每个切片的数据(每个图像都是一个切片),您只需要将它们打包在一起,以便 Matlab 将它们解释为体积数据。
由于您没有提供任何样本数据,因此我必须生成一个小样本。我将使用 Matlab 函数flow 生成体积数据并从中提取 4 张图像(4 片):
%% Generate sample images
[x,y,z,v] = flow; %// x,y,z and v are all of size [25x50x25]
im1 = v(:,:,5); %// extract the slice at Z=5. im1 size is [25x50]
im2 = v(:,:,10); %// extract the slice at Z=10. im2 size is [25x50]
im3 = v(:,:,15); %// extract the slice at Z=15. im3 size is [25x50]
im4 = v(:,:,20); %// extract the slice at Z=20. im4 size is [25x50]
hf = figure ;
subplot(221);imagesc(im1);title('Z=5');
subplot(222);imagesc(im2);title('Z=10');
subplot(223);imagesc(im3);title('Z=15');
subplot(224);imagesc(im4);title('Z=20');
%// This is just how I generated sample images, it is not part of the "answer" !
这为您提供了 4 个简单的图像:
现在才是真正的乐趣。将所有图像堆叠在一个矩阵中,就像它们只是切片一样:
M(:,:,1) = im1 ;
M(:,:,2) = im2 ;
M(:,:,3) = im3 ;
M(:,:,4) = im4 ;
您现在有一个矩阵M [25x50x4]。 如果你的图片太多,你可以设计一个循环来堆叠它们。
从那里开始,只需拨打slice 即可获得您想要的照片。查看文档以探索所有可能的渲染选项。一个简单的例子是:
hf2 = figure ;
hs = slice(M,[],[],1:4) ;
shading interp
set(hs,'FaceAlpha',0.8);
产生:
注意:这使用默认索引,这应该对您描述的问题有好处(只是堆叠一些图像)。如果您希望您的体积具有真实坐标,您可以使用ndgrid 构建坐标系。例如:
[xs,ys,zs] = ndgrid( 1:25 , 1:50 , 1:4 ) ;
将创建大小为[25x50x4] 的网格/坐标系。只需替换数字即可构建您需要的网格坐标。
【讨论】:
将它们全部排列在 3D 矩阵中。这将安排它们以使您获得stack(i,j,k),其中stack(i,:,:) 为您提供特定图像,i 是切片编号。完成后,使用this 库。 Viewer3D 几乎可以让您在交互式 3D GUI 中可视化所有内容并执行插值。但是,切片之间的数据应该存在正相关,否则 3D 图像将显得毫无意义。
【讨论】: