关于行进立方体算法的说明
Clarification on Marching Cubes Algorithm
关于Marching Cubes,我对它的算法和实现有一些疑问。我已经阅读了关于 Marching Cubes 的优秀 Paul Bourke 文章以及网站上可用的源代码,但是,在理解以及如何以我自己的方式实现算法方面,我仍然遇到了一些问题。题目如下:
网格单元大小 - 我了解到网格单元大小会影响生成的 3D 模型的质量。例如,如果我有一堆大小为 (200*200*200) 的 X 射线图像集,那么,将由 2 个相邻的图像切片构建一个网格单元板。因此,平板中的网格单元总数将为 (200-1)*(200-1),每个网格单元角对应于图像的像素 value/density。这个对吗??此外,我们如何为网格单元实现不同的大小??
体素大小 - 我已经阅读了 Marching Cubes 的一些参考资料,但我似乎无法找到算法中如何处理体素大小。如果我错了,请纠正我,在我的例子中,相邻图像层之间的间隙大小为 100 万;因此,我如何处理 Marching Cubes 算法中的那些,还是死胡同?是否按照 Gridcell 的大小来处理? (假设:一个像素在其 xy 坐标中的大小为 19 微米,而 gap/z 的长度为 25.4 micron/1 密耳)
网格单元角的坐标(立方体的顶点坐标)-我试图通过图像集维度(200*200)的嵌套循环来分配索引为 i j k 的网格单元角的坐标*200)。这个对吗??有没有更快的方法呢??
注意:我已经看到 MC 在 VTK 中的实现,但我很难理解它,因为它依赖于其他一些 VTK 类。
很多问题。我将尝试提供一些指示。 200^3 的第一个是 ct 的一个非常小的数据集! 1024^3 呢? :)
行进立方体是为规则网格构建的。因此,数据是在立方体顶点还是在中心定义并不重要:只需移动立方体大小的一半!如果您有不规则数据,请使用其他方法或先重新采样到规则网格。
您似乎还遗漏了 "marching" 部分:我们的想法是找到一个表面和洪水从那里填充的立方体。全在外面或全在里面的立方体停止搜索。这样,您的巨大规则网格中的大多数立方体甚至都不需要查看。
缩放到实际单位应该是最后一步。将输入音量视为标准化为 1x1x1。然后将输出顶点缩放到物理单位。你拥有的数据就是你拥有的数据。任何重采样都应该在重建或过滤之前完成。它在几何阶段没有地位。
我不确定我是否理解最后一个问题,但对于进一步处理来说真正重要的一件事是创建一个连接的索引网格。一个重要的技巧是只保留前一个 slice/line/neighbor 的一种哈希值 table。所以你可以快速查找已经创建的顶点并重用它们的索引。结果应该是具有唯一顶点的连接网格。然后您可以将其用于任何类型的几何处理。
关于Marching Cubes,我对它的算法和实现有一些疑问。我已经阅读了关于 Marching Cubes 的优秀 Paul Bourke 文章以及网站上可用的源代码,但是,在理解以及如何以我自己的方式实现算法方面,我仍然遇到了一些问题。题目如下:
网格单元大小 - 我了解到网格单元大小会影响生成的 3D 模型的质量。例如,如果我有一堆大小为 (200*200*200) 的 X 射线图像集,那么,将由 2 个相邻的图像切片构建一个网格单元板。因此,平板中的网格单元总数将为 (200-1)*(200-1),每个网格单元角对应于图像的像素 value/density。这个对吗??此外,我们如何为网格单元实现不同的大小??
体素大小 - 我已经阅读了 Marching Cubes 的一些参考资料,但我似乎无法找到算法中如何处理体素大小。如果我错了,请纠正我,在我的例子中,相邻图像层之间的间隙大小为 100 万;因此,我如何处理 Marching Cubes 算法中的那些,还是死胡同?是否按照 Gridcell 的大小来处理? (假设:一个像素在其 xy 坐标中的大小为 19 微米,而 gap/z 的长度为 25.4 micron/1 密耳)
网格单元角的坐标(立方体的顶点坐标)-我试图通过图像集维度(200*200)的嵌套循环来分配索引为 i j k 的网格单元角的坐标*200)。这个对吗??有没有更快的方法呢??
注意:我已经看到 MC 在 VTK 中的实现,但我很难理解它,因为它依赖于其他一些 VTK 类。
很多问题。我将尝试提供一些指示。 200^3 的第一个是 ct 的一个非常小的数据集! 1024^3 呢? :)
行进立方体是为规则网格构建的。因此,数据是在立方体顶点还是在中心定义并不重要:只需移动立方体大小的一半!如果您有不规则数据,请使用其他方法或先重新采样到规则网格。
您似乎还遗漏了 "marching" 部分:我们的想法是找到一个表面和洪水从那里填充的立方体。全在外面或全在里面的立方体停止搜索。这样,您的巨大规则网格中的大多数立方体甚至都不需要查看。
缩放到实际单位应该是最后一步。将输入音量视为标准化为 1x1x1。然后将输出顶点缩放到物理单位。你拥有的数据就是你拥有的数据。任何重采样都应该在重建或过滤之前完成。它在几何阶段没有地位。
我不确定我是否理解最后一个问题,但对于进一步处理来说真正重要的一件事是创建一个连接的索引网格。一个重要的技巧是只保留前一个 slice/line/neighbor 的一种哈希值 table。所以你可以快速查找已经创建的顶点并重用它们的索引。结果应该是具有唯一顶点的连接网格。然后您可以将其用于任何类型的几何处理。