2012-04-11 126 views
0

我想绘制一个非常大的CT数据集的3d视图。我的数据是2000x2000x1000尺寸的3d矩阵。物体被空气包围,在我的矩阵中被设置为NaN。Matlab三维索引数据图

我希望能够看到物体表面的灰度值(无isosurface),但我无法完全解决如何在Matlab中做到这一点。任何人都可以帮助我吗?

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

回答

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为此 - 我不能完全弄清楚如何做到这一点。你有小费吗?

+0

好的,这似乎工作'tri = delaunay(X,Y);'接着是'trisurf(tri,X,Y,Z,C,'EdgeAlpha',0,'FaceColor','interp')'。@upperBound:然而,产生的表面有文物,我得到这样的信息: “警告:检测到重复的数据点 某些数据点不映射到三角测量中的顶点 要避免这种情况,请调用UNIQUE打电话给DELAUNAY之前的数据点。“这大概是因为不同切片中的轮廓在相邻z切片之间的x和y坐标上非常相似。我无法使用UNIQUE,我该怎么办?感谢任何提示。 – 2012-04-25 10:45:35

0

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

默认情况下,该函数不会为NaN条目绘制任何内容,因此您应该非常乐意使用surf功能。

要设置冲浪功能使用一个灰度绘图使用:

surf(matrix3d); 
colormap(gray); 

此图表中的表面图的矩阵,并且将颜色映射为灰度。

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

0

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

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

我希望这会帮助你达到你所要求的。

+0

谢谢,我认为这种方法对我来说可能很好。我会尝试使用delaunay3构造边缘数据。我需要解决的另一个挑战是我的对象是空心的,我只想要外部表面/边缘(这应该减少绘制点的数量并加快可视化)。如果我找到了一个好的解决方案,我将环顾四周并回到线程。 – 2012-04-13 10:08:12