什么是网格光顺
今天开始一个很重要的话题叫网格去噪。在实际的应用中,我们的数据往往是通过扫描仪或者重建算法得到的,由于设备的误差或者算法的计算误差,往往数据上会带有一些小细节,这些细节往往不是顶点的实际位置,而是经过了一些扰动,这些扰动我们称为噪声,如图1所示。
那么给定图2中左边的含噪声的网格,我们可以通过Denoising把噪声去掉得到右边的网格。Denoising的叫法很多,例如smoothing、filtering、improvement、fairing等。
去噪并不陌生,在图像处理中很常用,图像上的去噪是针对二维图像,而此时我们需要的去噪是针对二维流形,道理都是一样的,本质都是对数据进行操作,只不过数据是二维像素还是流形上的顶点坐标,只不过信号的表现形式复杂一点,编程的数据结构复杂一点。相关的方法其实都是一样的,图像领域有大量的去噪方法,其实都可以迁移到网格曲面的去噪上来。
什么是噪声
那么什么是噪声呢?实际上没有一个非常严格的定义,我们无法确定一个量来准确的描述什么是噪声,只能通过一些经验性的描述,例如高频区域,小的凸起,高曲率部分等,这些方法都不严格,因为我们无法具体量化所谓的“高”。例如噪声的曲率会很高,但是例如方形的顶点处曲率也很高,而这里的顶点我们是想保留的,所以噪声和特征我们往往难以区分。这就有一个问题,即过度去噪往往会把模型的特征抹平了,这样的结果就不是我们想要的,因为它破坏了模型的特征,因此如何在保持特征的前提下去噪是比较难的问题,可以说noise和feature是鸡生蛋、蛋生鸡的问题,对于一些CAD机械零件模型,在去噪的时候难以避免地就会把边角特征给抹平。
图5是wiki上对去噪问题的描述,它的意思是说,给定一个含噪声的数据集,去找一个逼近函数,在保持重要特征的前提下去除噪声。然而这里的“important patterns”也是个很含糊的描述,这也是机器学习领域很头疼的问题。
噪声的数学模型
如果我们把这个问题变成数学模型,我们的输入是含噪声的网格曲面,输出是无噪声的网格曲面,去噪模型即为
这样的问题叫“ill-posed”问题,因为我们不知道和。
在业界有一些方法来解,我们先假定网格顶点的数据及连接关系不变,那么问题简化为求得顶点的新位置,使得噪声减少,这是因为噪声是由顶点扰动造成的,因此我们可以通过扰动或偏移、求得新的位置来实现去噪。那么问题在于,我们的顶点应该沿着哪个方向偏移?这样问题简化后,我们得到了如图7所示的简化模型。
这时候很多人就想到,如果噪声扰动的方向是法向就好了,即沿着曲面的法向去扰动能让问题变得相对简单一些。但是光滑曲面网格的不知道,因此我们仍然不知道法向,我们只能从原网格顶点的法向来做,这至少让问题变得可解,在原定点不断地迭代优化,它的法向会越来越逼近光滑曲面网格的法向,这就是我们前面说的迭代法生成极小曲面的思路。这样我们的新模型就变成了
那么取多少呢?这个就只能依靠经验了。现在的新模型就是让顶点去沿着拉普拉斯算子的向量去移动。
滤波
关于光顺,我们还提到了一种方法叫滤波(filtering),这是在数学分析和微积分中的概念,里面有不少理论的东西可以讲,即两个函数和,它们两个的卷积变成一个新的函数,它等于
图9上的图解释了它的几何意义,例如是一个高斯函数(一个权函数),要对上某一点作卷积,只需要把高斯函数对齐到上,然后将两侧的值与周围两侧的值对应相乘,高斯函数的权重是离顶点越远值就越小,这其实就是把周围的值进行加权,离越近的点权重越大,权由所提供,因此高斯函数就是一种滤波器。准确地说就是:利用一个函数作为权函数对另一个函数周围的点进行加权。卷积的意义就是把周边的值作平均处理,所以滤波的本质上就是在做光滑,不过它也会使特征损失,那么如何设计一个保持特征的滤波是关键。
一个滤波的例子:图10中间的图,点的信号很高,通过加权后使周围的信号过渡光滑。
人们往往喜欢用高斯函数来作为权函数,因为高斯函数有很好的性质,首先它是概率密度函数,积分为1,另外这个函数具有对称性,且跟距离相关,距离越远,权重越小,距离越近,权重越大。
我们刚才讲可以让顶点沿着法向去偏移,拉普拉斯向量是法向的一个很好的近似。在三维中,除了顶点可以滤波,法向也可以滤波,甚至包括曲率、颜色都可以作为滤波对象。值得注意的是,迭代步长的选取非常关键,有可能会造成过度光顺。
顶点滤波
拉普拉斯光滑
对于顶点去噪,我们最熟悉的就是拉普拉斯算子,我们在做极小曲面迭代法的每一步其实都是在做去噪,当噪声全部去掉,就是极小曲面了。
拉普拉斯光滑的方法如图12、13所示,它其实等价于极小化某一点与它的1-邻域上各点的边长的平方和,这在数学上是有证明的。
前面我们说拉普拉斯的关键是要找到一个,这样的问题叫做shrinkage problem,当网格的疏密程度不均时,在同一下,网格较疏的点收缩得很快,网格较密的点收缩得慢一些,这样的结果不是我们所希望的。
因此拉普拉斯光滑有了一些改进,例如Taubin'95提出的方法,在拉普拉斯收缩以后再扩张回去,扩张回去的时候用一个二阶拉普拉斯补回去一些。或者用双拉普拉斯,即一个四阶的拉普拉斯,即。
图16展示了三种拉普拉斯光滑的效果,中间的是一般的拉普拉斯算子,右图是Taubin的方法。
平均曲率滤波
第二个光滑的方法就是在公式中加一个平均曲率,这样使顶点沿着平均曲率流的方向收缩,即使用Cotangent权重。
由于Cotangent权重跟几何相关,因此此时对不均匀网格做光顺时能够产生较好的效果。图19是几种光滑算法效果的比较。
双边滤波
下面介绍一种图像处理中能够保特征的方法,叫双边滤波(Bilateral filtering)。双边滤波是在对顶点周围的点进行卷积做加权平均后再做一个加权,即比较两个相邻值的差异,这个值越大则权重越小,即一个点周围的值如果与该点的值相差很大,则说明这个点可能是特征,例如图20中的蓝色和红色的两张面,对于蓝色面上一点,红色的点与它的值相差特别大,因此就不应该对该点造成很大的影响。这样就有了两次核函数加权,不仅距离有影响,而且值也有影响,值相差越大影响越小,这样就起到了保特征的作用。等式下面的除数只是为了归一化处理。可以看到经过这样的处理后(图21),能够很有效地保持特征去除噪声。当然我们也可以加入更多的考量,比如法向,再做一次滤波就变成了三边滤波(Trilateral filtering)。
该方法同样也可以用于网格处理。我们用二维来演示,如图22,我们有一些点分布在曲线周围(含噪声),我们先关注图中的蓝色点的去噪,我们不知道理想的曲面在哪里,但是我们可以估计出蓝色点的信息。
我们一般会先算出这个点的法向的近似,这个法向估计通常是取这个点周围的数据,然后做一个最佳线性逼近,找出一个平面,这个平面的法向就作为这个点的法向近似,将其他所有点作到这个平面的投影,这个距离度量了切平面的远近,值越大的点对它的影响越小,具体做法还请参见文献。
这一方法会有两个参宿和,通过调参可以得到一个不错的效果,结果如图24,25。
隐式网格滤波
这里介绍另外一种滤波方法,刚才是通过顶点找法向的方法,用周围的点做滤波,就可以得到新的偏移方向。我们也可以使用新的曲面的法向来作估计,我们可以得到图26中最下面的公式,依此来做迭代计算,这样的方法是隐式方法,通过求解稀疏线性方程组来得到结果,这就是我们上节课说的全局极小曲面的求解方法。