MC算法的优点:生成网格的质量好,具有很高的可并行性。
移动立方体算法的主要思想是在三维离散数据场中通过线性差值来逼近等值面。
体元是在三维图像中由相邻的八个体素点组成的正方体方格,体元中顶点值有三种情况:高于、等于或者低于。
若顶点的数据值大于等值面的值,则定义该顶点位于等值面之内。若小于则位于等值面之外。这样我们就可以知道,若一个体元内有的顶点大于等值面有的小于等值面,则等值面必经过此体元。
此处参考文章:
移动立方体(Marching Cubes,MC)算法
若等值面经过体元,则有256种剖分方式,一共有15中基本构型。
每一种体元状态中都含有若干三个面片,体元中三角面片顶点的具体位置需要根据等值面的值和所在边的两个顶点的值进行线性插值计算得到。通过遍历所有体元,找出其中的三角面片并将它们组合起来就可以构成最后的三角网格表面数据(Mesh)。
我的疑惑:剖分方式什么是256种?如何为三维模型确定一个等值面呢?如何得到网格三角形来进行曲面重建呢?
1,剖分方式什么是256种?
我们将包含体数据内容的体素点称为实点,而其外的背景体素点都称作虚点。这样一个三维图像就是由各种实点和虚点组成的点阵。从单个体元的角度出发,体元的8个体素点每个都可能是实点或虚点,那么一个体元一共有2的8次方即256种可能的情况。MC算法的核心思想就是利用这256种可以枚举的情况来进行体元内的等值三角面片抽取。
2,如何为三维模型确定一个等值面呢?
等值面是指空间中的一个曲面,在该曲面上函数F(x, y, z)的值等于某一给定值Ft,即等值面是由所有点S = {(x, y, z):F(x, y, z) = Ft}组成的一个曲面。这个等值面能够表征图像虚实部分的边界。点表示像素值为250的像素,绿点表像素值为0的点。结合等高线的思想,可以将250的区域想象成一片海拔为250的高原,而0的区域是海拔为0的平原。则等值线为128的线就必然处在每个红点和绿点之间。相当于在一个由0过渡到250的坡上。实际上,值为1~249的等值线也都基本处在红点和绿点之间的位置。那么只要求出这些值中其中一个值的等值线,相当于就获得了250像素与0像素在几何意义上的边界。
但是在三维点云数据中又是如何确定等值面呢?
先看实体元,虚体元和边界体元的概念。
若一个体元8个体素全是虚的,或者全是实的,我们把这些体元叫做虚体元和实体元;而若一个体元中既有实点也有虚点,这样的体元我们称其为边界体元。
在三维图像中想求出介于实点和虚点之间的表面,就要在他们的边界,也就是边界体元设法求出虚实体素之间的等值面。MC算法的另外一大思想就是使用三角片去拟合等值面。因为一个体元相对于图像是一个极小的局部,所以穿过该体元等值面就可以近似由小三角形片来拟合。例如下面的体元配置,我们就可以认为等值面的一部分就是以这样的方式穿过体元。
我的理解:
现有一点云数据集组成的三维模型,对空间划分很多体元(极小正方体)。每个体元有八个体素点,若一个体元内部包含有点云的数据点,则该体元的8个体素点为实点,否则全为虚点。但是由于一个体素点是被八个点云所共享的,所以就会出现有的体元里的8个体素点,有的是实点有的是虚点,利用这种边界体元分界面来拟合等值面。
3.如何根据等值面得到网格三角形来进行曲面重建呢?
上面提到了根据虚实点一个体元可能有256种配置,那么每一种体元配置中的等值面都可由若干三角形片组成。因为三角片分布情况是有限种类的,前人制作一个表来表示所有256种配置的三角形情况,如下面这个体元配置:我们将体元的体素点和边都进行标号。组成等值面的三角形的三个顶点一定是穿过体元的边的,所以可以用三条边的索引来表示一个三角形。实点为1,2,3,6,则其字节形式来表示8个体素的虚实情况为01001110,转为十进制为78。其等值面由4个三角形T1、T2、T3、T4组成。其中T1的顶点所在的边是e3,e11,e6。
所以可以得到该点云配置的三角形表为:
此处参考文章:
图像数据到网格数据-1——MarchingCubes算法
总结起来,PCL中移动立方体算法的操作步骤为:
1)对三维点云模型划分好体元及相应的体素点,我觉得这里可以根据最小包围盒来划分体元
2)遍历所有体元,根据该体元内部是否有点云数据点,分为实体元(相应的体素点全为实点),虚体元,边界体元(有实有虚)
3)对于边界体元,根据建立好的体元配置的三角形表确定三角形片
4)组合所有的三角形片形成点云模型的三角形重建模型。
一句话总结:遍历所有的体元,找出其中的三角片最后集合起来组成图像中实点表面的三角网格(Mesh)。