我想在MATLAB中构建一个3D立方体。我知道任何3D形状的单位都是体素而不是像素。这是我想要做的,
首先,我想构建一个具有给定尺寸x,y和z的立方体。
其次,根据我从不同图像处理教程中理解的内容,此立方体必须由体素(3D像素)组成。我想给每个体素一个初始颜色值,比如灰色。
第三,我想访问每个体素并改变其颜色,但我想区分代表立方体面的体素和代表内部区域的体素。我想通过它的位置x,y,z来轴对每个体素。最后,我们将得到一个具有不同颜色区域的立方体。
我已经搜索了很多但是找不到实现它的好方法,但是这里给出的代码在构建多维数据集的内部区域方面似乎非常接近,
http://www.mathworks.com/matlabcentral/fileexchange/3280-voxel
但我不清楚它是如何执行这个过程的。
有谁能告诉我如何在MATLAB中构建这样的多维数据集?
感谢。
答案 0 :(得分:6)
你想绘制体素!好!让我们看看我们如何做到这一点。
首先:是的,3D形状的单位可能是体素,但它们并不需要。您可以在3D中绘制一个球体而不会出现“块状”#34;因此您不需要根据体素来描述它,就像您不需要用像素来描述正弦波一样能够在屏幕上绘制它。请看下图。 (same happens for cubes)
如果您对绘制体素感兴趣,我通常会建议您使用Matlab的FEX中的vol3D v2。为什么而不是你自己?
因为绘制体素的最佳(仅?)方式实际上是绘制扁平方形曲面,每个立方体为6(see answer here用于执行此操作的函数)。这个平面也会为计算机图形学中的z-fighting创建一些工件。 vol3D实际上只绘制了3个表面,看着你的表面,节省了一半的计算时间,并避免了丑陋的绘图工件。它易于使用,您可以定义每个体素的颜色以及每个体素的alpha(透明度),让您可以看到内部。
使用示例:
% numbers are arbitrary
cube=zeros(11,11,11);
cube(3:9,3:9,3:9)=5; % Create a cube inside the region
% Boring: faces of the cube are a different color.
cube(3:9,3:9,3)=2;
cube(3:9,3:9,9)=2;
cube(3:9,3,3:9)=2;
cube(3:9,9,3:9)=2;
cube(3,3:9,3:9)=2;
cube(9,3:9,3:9)=2;
vold3d('Cdata',cube,'alpha',cube/5)
但是,那仍然看起来很糟糕。因为如果你想看到内部,体素绘图不是最好的选择。不同面孔的Alpha叠加在另一面之上,解决这个问题的唯一方法就是编写高级计算机图形光线追踪算法,相信我,这是一条漫长而艰难的道路。
通常一个人有4D数据,因此数据包含3D位置和每个位置的单个数据。人们可能会认为在这种情况下,你真的想要体素,因为每个体素都有3D +颜色,4D数据。确实!你可以用体素做到这一点,但有时候用其他方式描述它更好。举个例子,让我们看一下这个想要突出显示他/她4D空间(link)区域的人。要查看更大的列表,我建议您查看有关4D可视化技术的my answer in here。
让我们尝试与体素不同的方法。让我们使用前一个多维数据集,并在4D数据值发生变化时创建isosurfaces
。
iso1=isosurface(cube,1);
iso2=isosurface(cube,4);
p1=patch(iso1,'facecolor','r','facealpha',0.3,'linestyle','none');
p2=patch(iso2,'facecolor','g','facealpha',1,'linestyle','none');
% below here is code for it to look "fancy"
isonormals(cube,p1)
view(3);
axis tight
axis equal
axis off
camlight
lighting gouraud
在我看来,这个看起来更好。
自由选择,策划好!