在MATLAB中对3D立方体执行2D切割

时间:2015-08-17 18:08:04

标签: matlab image-processing 3d 2d

我有一个装满小立方体的3D立方体。用小立方体填充后,我可以看到它的面孔。我想通过x,y或z轴执行切割,这样我就可以在某些点看到内部结构。这是立方体的图像,

enter image description here

我想看看这个立方体的内部结构。搜索后,我发现可以使用slice。我用过这段代码,

figure
  [x,y,z] = meshgrid(1:100);
 v = repmat(magic(100),[1 1 100]);
% 
% % Define the slice plane
 [xi, yi] = meshgrid(1:100);
 zi = xi;
% 
% % Slice it
slice(x,y,z,v,xi,yi,zi);
 drawnow

但是我得到了完全不同颜色的结果。结果如下,

enter image description here

您能否告诉我如何修复上面的代码以产生通过轴的切割?另外,如果您能解释如何完成此过程,我将非常感激,因为我不完全理解上面的代码。

1 个答案:

答案 0 :(得分:1)

重新。第一个问题 - 我不知道用Hoki的代码切割你的多重立方体的简单方法(但见下文)。 polyxpoly可能会有所帮助,但仍需要投影到切片的平面上。

重新。第二个问题 - 切片是切割体积数据,"意思是密度,它在体积的每个点都有一个值。 repmat(magic(...))行正在制作100x100x100(3-d)阵列,阵列中每个100 * 100 * 100 = 1,000,000个网格点都有一个数字。碰巧这些点具有介于1和100 ^ 2之间的不同值,因此您获得了不同的颜色。

Hoki的代码与slice的效果不佳,因为它使用patch制作多边形而不是使用体积数据。另一种方法是以体积方式制作立方体。此代码应自行运行,但是 - 小心 - 未经过测试。它独立于你提到的Hoki代码。

face=ones(10,10);        %make a small cube, 10x10x10
middle=zeros(10,10);
middle(1,1:10)=1;
middle(10,1:10)=1;
middle(1:10,1)=1;
middle(1:10,10)=1;
small_cube=cat(3,face,repmat(middle,1,1,8),face);

% Now make an array of them - ten in each direction, so 100x100x100
v=repmat(small_cube,10,10,10);

% Now define the slice plane and slice as above.
[xi, yi] = meshgrid(1:100);
zi = xi;

figure;
slice(x,y,z,v,xi,yi,zi);
drawnow

修改:在上文中,0适用于不属于多维数据集的点,1适用于点。这是多维数据集的voxel表示。 face用于顶部和底部,middle用于顶部和底部之间的边缘切片。第一个repmat堆叠了八个中间片,就像一个汉堡馅饼。 catface放在该堆栈的顶部和底部,就像发髻的两半一样。然后第二个repmat在大立方体中生成999个其他小立方体。

修改2 :在上面的代码中用zeros替换NaN应该使多维数据集的内部透明。 (也未经过测试!)