在 MATLAB 中构建 3D 立方体的体素
Constructing voxels of a 3D cube in MATLAB
我想在 MATLAB 中构建一个 3D 立方体。我知道任何 3D 形状的单位都是体素而不是像素。这是我想做的,
首先,我想构造一个具有给定尺寸 x、y 和 z 的立方体。
其次,根据我从不同的图像处理教程中了解到,这个立方体必须由体素(3D像素)组成。我想给每个体素一个初始颜色值,比如灰色。
第三,我想访问每个体素并更改其颜色,但我想区分代表立方体面的体素和代表内部区域的体素。我想通过其位置 x、y、z 轴化每个体素。最后,我们将得到一个具有不同颜色区域的立方体。
我搜索了很多但找不到实现它的好方法,但是这里给出的代码在构造立方体内部区域方面似乎非常接近,
http://www.mathworks.com/matlabcentral/fileexchange/3280-voxel
但我不清楚它是如何执行该过程的。
谁能告诉我如何在 MATLAB 中构建这样一个立方体?
谢谢。
您想绘制体素!好的!让我们看看我们如何做这些事情。
首先:是的,3D 形状的单位可能是体素,但它们不需要是。你可以在 3D 中绘制一个球体而不是 "blocky",因此你不需要用体素来描述它,就像你不需要用像素来描述正弦波来绘制一样它在屏幕上。看下图。 (same happens for cubes)
如果您对绘制体素感兴趣,我通常会推荐您使用来自 Matlab 的 FEX 的 vol3D v2。为什么不是你自己的?
因为绘制体素的最佳(唯一?)方法实际上是绘制平坦的正方形表面,每个立方体 6 个( for function that does that). This flat surfaces will also create some artifacts for something called 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 数据。的确!你可以用体素来做,但有时最好用其他方式来描述它。作为一个例子,让我们看看这个人想要在 his/hers 4D space . To see a bigger list I suggest you look at my answer in here 中突出显示有关 4D 可视化技术的区域。
让我们尝试一种不同于体素方法的方法。让我们使用之前的立方体并在 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
在我看来,这个看起来好多了。
自由选择,好图!
我想在 MATLAB 中构建一个 3D 立方体。我知道任何 3D 形状的单位都是体素而不是像素。这是我想做的,
首先,我想构造一个具有给定尺寸 x、y 和 z 的立方体。
其次,根据我从不同的图像处理教程中了解到,这个立方体必须由体素(3D像素)组成。我想给每个体素一个初始颜色值,比如灰色。
第三,我想访问每个体素并更改其颜色,但我想区分代表立方体面的体素和代表内部区域的体素。我想通过其位置 x、y、z 轴化每个体素。最后,我们将得到一个具有不同颜色区域的立方体。
我搜索了很多但找不到实现它的好方法,但是这里给出的代码在构造立方体内部区域方面似乎非常接近,
http://www.mathworks.com/matlabcentral/fileexchange/3280-voxel
但我不清楚它是如何执行该过程的。
谁能告诉我如何在 MATLAB 中构建这样一个立方体?
谢谢。
您想绘制体素!好的!让我们看看我们如何做这些事情。
首先:是的,3D 形状的单位可能是体素,但它们不需要是。你可以在 3D 中绘制一个球体而不是 "blocky",因此你不需要用体素来描述它,就像你不需要用像素来描述正弦波来绘制一样它在屏幕上。看下图。 (same happens for cubes)
如果您对绘制体素感兴趣,我通常会推荐您使用来自 Matlab 的 FEX 的 vol3D v2。为什么不是你自己的?
因为绘制体素的最佳(唯一?)方法实际上是绘制平坦的正方形表面,每个立方体 6 个(
使用示例:
% 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 数据。的确!你可以用体素来做,但有时最好用其他方式来描述它。作为一个例子,让我们看看这个人想要在 his/hers 4D space
让我们尝试一种不同于体素方法的方法。让我们使用之前的立方体并在 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
在我看来,这个看起来好多了。
自由选择,好图!