移动立方体(Marching Cubes)算法是面绘制算法中的经典算法,它是W.Lorensen等人于1987年提出的体素级重建算法,也被称为“等值面提取”(Isosurface Extration)算法。
移动立方体算法的主要思想是在三维离散数据场中通过线性差值来逼近等值面。在医学图像分割与重建中,我们通过定义一个阈值来确定这个等值面。首先,确定“体元”(Cell)的概念,这与“体素”(Voxel)相区别。一个体元是由顺序排列的8个像素构成的方格,而每个体素(边界除外)都为8个体元所共享。
则体元中顶点值有三种情况:高于或等于等值表示在表面的内部,低于等值表示在表面的外部。这样,体元的一个顶点有2中可能的状态,则一个体元(8个顶点)就一共有256种状态。根据旋转、映射不变等特性,体元的状态可以被归纳为以下15种基本构型:
也就是说,体元所有的256中状态都可以通过这15种基本构型通过旋转、对称变换等操作获得。其中每一种体元状态中都含有若干三个面片,体元中三角面片顶点的具体位置需要根据等值面的值和所在边的两个顶点的值进行线性插值计算得到。可以对这256种状态制作一个查找表(look up table),便于重建时应用。通过遍历所有体元,找出其中的三角面片并将它们组合起来就可以构成最后的三角网格表面数据(Mesh)。
总结起来,移动立方体算法的操作步骤为:
- 将图像的4个切片读取到内存中;
- 按照体元扫描2个切片;
- 通过将体元的8个顶点值与所取得等值面值相比较,计算立方体的索引;
- 使用索引从查找表中查找边列表;
- 使用每个边缘顶点的灰度值,通过线性插值计算得到三角面片顶点的确切位置;
- 计算每个体元顶点的单位法线,并将法线插值到三角形面片的每个顶点;
- 输出三角形面片的顶点和法线。
参考
[1] Lorensen, W. E. and H. E. Cline(1987). “Marching cubes: A high resolution 3D surface construction algorithm.” Computers & Graphics.
[2] https://www.cnblogs.com/zhizhan/p/3987254.html
[3] https://zhuanlan.zhihu.com/p/48022195
[4] https://www.cnblogs.com/shushen/p/5542131.html
[5] https://baike.baidu.com/item/Marching%20cubes/624285?fr=aladdin