索引数据的Matlab三维绘图

索引数据的Matlab三维绘图,matlab,3d,plot,Matlab,3d,Plot,我正在尝试绘制一个非常大的CT数据集的3d视图。我的数据是2000x2000x1000维的3d矩阵。对象被空气包围,在我的矩阵中设置为NaN 我希望能够看到物体表面的灰度值(没有等值面),但我无法在Matlab中解决如何做到这一点。有人能帮我吗 考虑到我正在处理一个巨大的矩阵,而我只对对象的表面感兴趣,有人知道如何减小数据集的大小吗?函数surf(X,Y,Z)允许您绘制三维数据,其中(X,Y)给出X-Y平面中的坐标,而Z给出Z坐标和表面颜色 默认情况下,该函数不会为NaN条目绘制任何内容,因此您

我正在尝试绘制一个非常大的CT数据集的3d视图。我的数据是2000x2000x1000维的3d矩阵。对象被空气包围,在我的矩阵中设置为NaN

我希望能够看到物体表面的灰度值(没有等值面),但我无法在Matlab中解决如何做到这一点。有人能帮我吗

考虑到我正在处理一个巨大的矩阵,而我只对对象的表面感兴趣,有人知道如何减小数据集的大小吗?

函数surf(X,Y,Z)允许您绘制三维数据,其中(X,Y)给出X-Y平面中的坐标,而Z给出Z坐标和表面颜色

默认情况下,该函数不会为NaN条目绘制任何内容,因此您最好使用surf函数

要将surf函数设置为使用灰度打印,请使用:

surf(matrix3d);
colormap(gray);
这将在曲面打印中打印矩阵,并将颜色贴图设置为灰度


此外,根据我对数据的理解,您可能能够消除矩阵中的整个平面线段。例如,如果平面A(1,1:2000,1:1000)在所有条目中均为NaN,则可以删除所有条目(因此条目X=1中的整个Y、Z平面)。然而,这将需要一些重for循环,这可能会超出顶部。这取决于您已经比较了多少数据矩阵,以及每个矩阵需要多少不同的绘图。

我将尝试给您一些想法。我假设没有直接的3D“表面探测器”

因为你们有一个3D矩阵,其中XY平面是CT扫描切片,每个切片都是一个图像,我会试着找到每个切片的边缘,比如说。这将需要一些预处理,比如首先对每个切片图像设置阈值。然后,我可以使用将边数据显示为三维点云或将边数据显示为曲面


我希望这将有助于您实现您的要求。

我成功地实现了它:

function [X,Y,Z,C] = extract_surface(file_name,slice_number,voxel_size)
LT          = imread(file_name);%..READ THE 2D MAP
BW          = im2bw(LT,1);%..THRESHOLD TO BINARY
B           = bwboundaries(BW,8,'noholes');%..FIND THE OUTLINE OF THE IMAGE
X           = B{1}(:,1);%..EXTRACT X AND Y COORDINATES
Y           = B{1}(:,2);
indices     = sub2ind(size(LT),X,Y);%..FIND THE CORRESPONDING LINEAR INDICES
C           = LT(indices);%..NOW READ THE VALUES AT THE OUTLINE POSITION
Z           = ones(size(X))*slice_number;
然后我可以用

figure
scatter3(X,Y,Z,2,C)

现在我唯一能改进的就是让散点图中的所有点与曲面相连@你为此建议的上限是
delaunay3
——我不太明白怎么做。你有小费吗

谢谢,我认为这种方法对我来说很有效。我将尝试使用delaunay3构建边缘数据。我需要解决的另一个挑战是,我的对象是空心的,我只想要外部表面/边缘(这将减少绘制点的数量并加快可视化)。如果我找到了一个好的解决方案,我会四处看看,然后回到线程后接
trisurf(tri,X,Y,Z,C,'EdgeAlpha',0,'FaceColor','interp')
@上限:但是,生成的曲面有伪影,我收到以下消息:“警告:已检测到重复的数据点。某些数据点未映射到三角剖分中的顶点。若要避免此行为,请在调用DELAUNAY之前对数据点调用UNIQUE。”。这大概是因为不同切片中的轮廓在相邻z切片之间的x和y坐标中非常相似。我不能使用UNIQUE,我能做什么?谢谢你的提示。