Matlab 3d索引数据图

时间:2012-04-11 07:32:14

标签: matlab 3d plot

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

我希望能够看到对象表面的灰度值(没有等值面),但我还是不知道如何在Matlab中做到这一点。有人可以帮帮我吗?

鉴于我处理的是一个巨大的矩阵并且我只对对象的表面感兴趣,有没有人知道如何减少数据集的大小?

3 个答案:

答案 0 :(得分:0)

函数surf(X,Y,Z)允许您绘制3d数据,其中(X,Y)给出x-y平面中的坐标,而Z给出z坐标和表面颜色。

默认情况下,该功能不会为NaN条目绘制任何内容,因此您最好使用冲浪功能。

要将冲浪功能设置为使用灰度绘图,请使用:

surf(matrix3d);
colormap(gray);

这将在曲面图中绘制矩阵,并将色彩图设置为灰度。

此外,据我了解您的数据,您可能可以消除矩阵中的整个平面段。例如,如果平面A(1,1:2000,1:1000)在所有条目中都是NaN,则可以消除所有这些条目(因此条目X中的整个Y,Z平面= 1)。然而,这将需要一些重的for循环,这可能在顶部。这取决于您与每个矩阵所需的不同绘图数量相比的数据矩阵数。

答案 1 :(得分:0)

我会尽力给你一些想法。我假设没有直接的3D“表面探测器”。

由于你有一个3D矩阵,其中XY平面是CT扫描切片,每个切片是一个图像,我会尝试用edge找到每个切片的边缘。这将需要一些预处理,如首先对每个切片图像进行阈值处理。然后,我可以使用scatter3将边数据显示为3D点云,或delaunay3将边数据显示为曲面。

我希望这能帮助你实现所要求的目标。

答案 2 :(得分:0)

我设法让它运转起来:

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)

现在我唯一可以改进的是将散点图中的所有这些点与曲面连接起来。 @upperBound你为此建议delaunay3 - 我无法弄清楚如何做到这一点。你有小费吗?