0

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

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

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

4

3 回答 3

0

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

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

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

于 2012-04-11T14:07:13.907 回答
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- 我无法弄清楚如何做到这一点。你有小费吗?

于 2012-04-16T16:36:35.987 回答
0

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

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

要将 surf 函数设置为使用灰度绘图,请使用:

surf(matrix3d);
colormap(gray);

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

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

于 2012-04-11T11:45:02.377 回答