我正在尝试绘制一个非常大的CT数据集的三维视图。我的数据是在2000x2000x1000维度的3d矩阵中。物体被空气包围,在我的矩阵中设置为NaN。
我希望能够看到对象表面的灰度值(没有等值面),但我还是不知道如何在Matlab中做到这一点。有人可以帮帮我吗?
鉴于我处理的是一个巨大的矩阵并且我只对对象的表面感兴趣,有没有人知道如何减少数据集的大小?
答案 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
- 我无法弄清楚如何做到这一点。你有小费吗?