关于Marching Cubes算法的澄清

时间:2015-06-02 02:02:22

标签: c++ algorithm 3d marching-cubes

关于Marching Cubes,我对它的算法和实现有一些疑问。我已经阅读了优秀的Paul Bourke关于Marching Cubes的文章以及网站上的可用源代码,但是,我仍然遇到了一些问题,以及如何以我自己的方式实现算法。问题如下:

  • 网格单元尺寸 - 我已经读过,网格单元尺寸会影响生成的3D模型的质量。例如,如果我有一堆尺寸为(200 * 200 * 200)的X射线图像,那么,将从2个相邻的图像切片构建一块网格单元。因此,平板中的网格单元的总数将是(200-1)*(200-1),其中每个网格单元角对应于图像的像素值/密度。它是否正确??此外,我们如何为gridcell实现不同的大小?

  • 体素大小 - 我已经阅读了Marching Cubes的一些参考资料,我似乎无法找到算法中如何处理体素大小。如果我错了请纠正我,在我的情况下,相邻图像层之间的间隙是1密耳;因此,我如何处理Marching Cubes算法中的那些或者它是一个死胡同?是否像Gridcell一样大小? (假设:xy坐标中一个像素的大小为19微米,而间隙/ z为25.4微米/ 1密耳长)

  • Gridcell角的坐标(立方体的顶点坐标) - 我试图通过图像集尺寸(200 * 200 * 200)的嵌套循环来指定具有索引i j k的gridcells角的坐标。它是否正确??有没有更快的方法呢?

注意:我已经在VTK中看到了MC的实现,但我很难消化它,因为它依赖于其他一些VTK类。

1 个答案:

答案 0 :(得分:4)

很多问题。我将尝试给出一些指示。 200 ^ 3中的第一个是ct非常小的数据集!那么1024 ^ 3呢? :)

为常规网格构建行进多维数据集。所以在立方体顶点或中心定义的数据确实无关紧要:只需将立方体大小的一半移动!如果您有不规则数据,请先使用其他内容或重新采样到常规网格。

你似乎也错过了"行军" part:想法是找到一个带有曲面的立方体,并从那里填充洪水。外部或全部内部的多维数据集将停止搜索。这样,您的巨大规则网格中的大多数立方体甚至不需要被查看。

缩放到真实单位应该是最后一步。将输入音量视为标准化为1x1x1。然后将输出顶点缩放到物理单位。您拥有的数据就是您拥有的数据。任何重新采样都应在重建或过滤之前完成。它在几何阶段没有位置。

我不确定我理解最后一个问题,但对于进一步处理而言,一件非常重要的事情就是创建一个连接的索引网格。一个重要的技巧是保留前一个切片/行/邻居的一种哈希表。因此,您可以快速查找已创建的顶点并重用其索引。结果应该是具有唯一顶点的连接网格。然后,您可以在任何类型的几何处理中使用它。