【问题标题】:Performing 2D cut on 3D cube in MATLAB在 MATLAB 中对 3D 立方体执行 2D 切割
【发布时间】:2015-11-10 11:26:57
【问题描述】:

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

我想看看这个立方体的内部结构。经过搜索发现可以使用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

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

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

【问题讨论】:

  • 您使用什么代码来创建原始多维数据集? magic 用所有不同的数值填充数组 (mathworks.com/help/matlab/ref/magic.html)。看起来你处于索引颜色模式,不同的颜色对应幻方中的不同值。
  • 非常感谢@cxw,我在这个问题中使用了Hoki的代码stackoverflow.com/questions/31913149/…。你能告诉我怎么剪吗?另外,我阅读了您提供的魔法文档,但它如何帮助我们执行剪辑?谢谢。

标签: matlab image-processing 3d 2d


【解决方案1】:

回复。第一个问题 - 我不知道用 Hoki 的代码直接分割你的多维数据集的简单方法(但见下文)。 polyxpoly 可能会有所帮助,但仍需要投影到切片平面上。

回复。第二个问题 - slice 正在切割“体积数据”,这意味着像密度这样的东西,在体积中的每个点都有一个值。 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 应该会使立方体的内部透明。 (也未测试!)

【讨论】:

  • 谢谢@cxw,你能告诉我这是一个单独的代码还是应该添加到Hoki代码的末尾?还有,2D矩阵中间的作用是什么,为什么有些点设置为1?谢谢。
  • 感谢提问,实际上当我尝试代码时出现此错误,使用 repmat 时出错。输入参数过多。你知道为什么会这样吗?谢谢。
  • 对不起!试试[1,1,8][10,10,10](带方括号)。你有哪个版本的 Matlab 或 octave?
  • 非常感谢,我用的是 MATLAB 2012。我会试试的。
猜你喜欢
  • 2021-07-02
  • 2015-10-28
  • 1970-01-01
  • 2011-08-25
  • 1970-01-01
  • 1970-01-01
  • 2013-04-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多