Marching Cubes算法的澄清

4
关于Marching Cubes算法和实现,我有一些疑问。我已经阅读了Paul Bourke关于Marching Cubes的优秀文章以及网站上提供的源代码,但在理解和如何按照自己的方式实现该算法方面仍然遇到了一些问题。以下是我的问题:
  • 网格单元大小 - 我已经了解到网格单元大小会影响生成的3D模型的质量。例如,如果我有一个尺寸为(200*200*200)的X光图像堆栈,那么将从两个相邻的图像切片构建一个网格单元板块。因此,在每个网格单元板块中,总共的网格单元数将是(200-1)*(200-1),每个网格单元的角落都对应于图像的像素值/密度。这正确吗?此外,我们如何为网格单元实现不同的大小?

  • 体素大小 - 我已经阅读了几篇关于Marching Cubes的参考文献,但似乎找不到如何处理体素大小的算法。如果我错了,请纠正我,对于我的情况,相邻图像层之间的间隔大小为1毫米;因此,在Marching Cubes算法中如何处理它们,还是死路一条?它是否被视为网格单元的大小?(假设:其xy坐标中一个像素的大小为19微米,而间隔/z的长度为25.4微米/1毫米)

  • 网格单元角落的坐标(立方体的顶点坐标) - 我正在尝试通过图像集维度(200*200*200)的嵌套循环来分配具有索引i j k的网格单元角落的坐标。这正确吗?有没有更快的方法?

注意:我已经看过VTK中MC的实现,但对我来说很难理解,因为它依赖于其他VTK类。

1个回答

5

有很多问题。我将尝试给出一些指针。首先,对于ct来说,200^3是一个相当小的数据集!1024^3呢?:)

Marching cubes是为规则网格设计的。因此,数据是在立方体顶点还是中心定义的并不重要:只需将其移动半个立方体大小即可!如果您有不规则数据,请使用其他方法或先将其重新采样到规则网格。

您似乎也错过了“Marching”的部分:想法是找到一个具有表面的立方体,然后从那里开始泛洪填充。全部在外部或全部在内部的立方体会停止搜索。这样,在您巨大的规则网格中的大多数立方体甚至不需要查看。

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

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


嗨,你好,给定的图像尺寸非常小,但实际上,我会有一个大小约为2000 * 2000 * 201的图像集。关于网格单元,八个角是否由相邻切片的像素值组成(来自n切片的2个像素+来自n + 1切片的2个像素)? - vincent911001
非常感谢您的建议,它确实解决了我一些疑惑。非常感谢。 - vincent911001
@vincent911001:不用担心切片大小。你的立方体始终是x,y,z - x+1,y+1,z+1。因此,在(x,y)-(x+1,y+1)处从切片z中获取4个值,在(x,y)-(x+1,y+1)处从切片z+1中获取4个值即可得到你的立方体。任何缩放都应该是后处理或预处理。 - starmole
嗨,starmole,感谢您清晰的描述,确实有所帮助。顺便问一下,网格单元的顶点是使用循环计数器索引创建的吗(例如:用于循环整个体积的i、j、k)? - vincent911001
我的意思是,如果您为第一个立方体创建了顶点,则相邻的立方体应重用它们(索引网格)。一次只做一个立方体。但在边缘(x,y,z)-(x + dx,y + dy,z + dz)处创建新的顶点之前,请先在哈希表中查找它 - 如果存在,请输出该索引。如果没有,请添加它。这样,您就可以得到一个连接的网格,很容易处理。 - starmole
显示剩余6条评论

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