从灰度图像的2D切片集创建3D体积

10
我需要使用Matlab从灰度图像集创建一个 3D 体积。该集包含连续和量化的 2D 灰度图像切片。我在 Matlab 中仍然自认为是新手,但这是我目前的想法:
  • 创建一个空间用于 3D 体积。
  • 对每个图像执行所有的预处理操作,以便只获取我们感兴趣的部分。(在本问题中,假设此预处理部分始终完美无误)
  • 遍历图像,将每个像素的 x 和 y 坐标转换到空间中。对于 z 坐标,我们可以根据每个切片之间的距离使用切片编号。如果一个像素与另一个像素相邻,则 3D 点会连接在一起。
  • 重复前两步,直到所有切片都完成。现在,我们将拥有所有像 2D 切片中一样连接的点。

但现在问题来了,如何连接不同切片之间的点,使这些点可以成为一个体积呢?或者在 Matlab 中有更强大的方法吗?非常感谢任何建议。


一个相关的问题:沿着2D图像切片进行插值 - Amro
2个回答

16

第0部分 - 假设


  • 所有2D图像的尺寸相同,因此您的3D体积可以将它们全部放入一个矩形立方体中。
  • 每个2D图像中的大部分像素具有3D空间关系(如果每个2D图像中的像素是随机分布的,则无法可视化很多内容。)

第一部分 - 从2D图像堆栈中可视化3D体积


要从一堆2D图像中可视化或重建3D体积,您可以尝试在Matlab中使用以下工具包。

1 3D CT/MRI图像交互式滑动查看器 http://www.mathworks.com/matlabcentral/fileexchange/29134-3d-ctmri-images-interactive-sliding-viewer

[2] Viewer3D http://www.mathworks.com/matlabcentral/fileexchange/21993-viewer3d

[3] Image3 http://www.mathworks.com/matlabcentral/fileexchange/21881-image3

[4] Surface2Volume http://www.mathworks.com/matlabcentral/fileexchange/8772-surface2volume

[5] SliceOMatic http://www.mathworks.com/matlabcentral/fileexchange/764

请注意,如果您熟悉VTK,则可以尝试使用以下工具: [6] matVTK http://www.cir.meduniwien.ac.at/matvtk/

目前我使用的是[5] SliceOMatic,因为它简单易用。但是在Matlab中,默认情况下渲染3D图形速度较慢。打开openGL可以加快渲染速度。(http://www.mathworks.com/help/techdoc/ref/opengl.html) 或者简单地说,set(gcf,'Renderer','OpenGL')


第二部分 - 在切片之间插值像素


为了在切片之间插值像素,您需要指定一种插值方法(上述工具包中的一些具有此功能/灵活性)。否则,为了让您有一个良好的开端,一些插值的示例是双三次、样条、多项式等(您可以通过搜索谷歌或谷歌/学者来找到更具体的插值方法,以适用于您的问题领域)。
第三部分 - 3D预处理

从您的过程来看,您首先通过处理每个2D图像来处理容积数据。在许多高级算法或真正的3D处理中,您可以首先在3D域中处理容积数据(简单地说,您首先考虑26个或更多邻居)。完成此步骤后,您可以将容积数据简单地输出到一组2D图像堆栈以进行横截面查看,或提供给上述工具包之一进行3D查看,或输出到第三方3D查看应用程序。


我已经在自己的医学影像研究项目中遵循了上述概念,以上发现是基于我在此处记录的研究经验(最新修订)


@GaryTsui,你能列出一些用于切片插值的资源吗?我问这个问题是因为有很多资源与这个特定问题无关。 - SDG

3
MATLAB通常使用3D数组来绘制容积数据。数据点在每个轴上的间距是均匀的。如果在3D数组中有一些站点没有数据,则通常会分配 NaN 值,各种绘图函数通常可以以合理的方式处理这些值(即通常会按照您的意图进行处理)。
如果将切片加载到3D数组中,使得数据在z方向上相邻的点也在数组的第三维中相邻,则应该没问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接