一、简单介绍

微分域变形领域最重要的两篇论文分别是:

[1] Yu Y , Zhou K , Xu D , et al. Mesh editing with poisson-based gradient field manipulation[J]. ACM Transactions on Graphics, 2004, 23(3):644. [ciation:679]
[2] Olga Sorkine-Hornung, Daniel Cohen-Or, Yaron Lipman, Marc Alexa, Christian Rössl, Hans-Peter Seidel . Laplacian surface editing[C]. SGP// 2004. [citation:1231]

两篇文章分别以经典的泊松方程和拉普拉斯方程为出发点很好的解决网格编辑的问题,形式上非常漂亮。两篇论文的作者也都是图形学领域非常著名的学者,按Hu老师上课的说法,那是一个风云变幻的时代。图形学界公认最好的期刊是TOG,但你会发现发在SGP上的laplace几乎是发在TOG上poisson的2倍!为什么呢? 那是因为poisson方法在理论上相对于laplace方法过于抽象,因此对于很多人难以理解和实现。

这篇博客重点讲述泊松变形技术,也希望通过开源代码可以帮助到更多的初学者。(如果对你有帮助,请给我star!)
代码地址:https://github.com/Zhengjun-Du/PoissonDeformation

首先我们看一下泊松变形的效果,其中白色部分为固定不动的部分,红色部分为手动交互的部分。

泊松图像增强 泊松变换_poisson


泊松变形交互展示,原地址:(https://www.bilibili.com/video/BV1H54y1Q7dF/)


二、背景工作

泊松变形的背景工作实际上是poisson image editing:

泊松图像增强 泊松变换_deformation_02


简单回顾一下,这篇论文主要实现图像克隆,把一张图像的某个区域拷贝到另一张图像中,实现完美的融合。方法分别利用待求解像素的(上图g区域)laplace算子和源图像梯度场(上图v区域)的散度构建了一个拉普拉斯方程,并以目标图像的边界为约束条件,通过求解线性方程组实现光滑的过渡。

具体过程可以参考:图像的泊松(Poisson)编辑、泊松融合, 文章很详细,通俗易懂。

图像空间,无论是梯度、散度还是laplace算子的计算都非常直观。但拓展到三维空间却不是那么的直观和简明。
因此难点主要体现在三方面:
1、如何定义三角网格上的梯度场和散度?
2、如何定义三角网格的laplace算子?
3、如何通过交互修改散度

三、三角网格梯度场

首先要清楚的是三角网格本身是一个分段线性的表示,它本质上不是一个光滑的曲面,它是由很多三角形平面组合而成的。要定义网格梯度场,首先要定义实值函数。

在每个三角形内部,其实可以通过三角形三个顶点的属性插值得到。如下所示,泊松图像增强 泊松变换_deformation_03分别是三个顶点关联的属性值,泊松图像增强 泊松变换_poisson_04可以通过泊松图像增强 泊松变换_ci_05 的线性插值得到,一般情况下,泊松图像增强 泊松变换_ci_05 分别可以表示为三个小三角形与大三角形的面积之比。

泊松图像增强 泊松变换_变形_07


因为泊松图像增强 泊松变换_ci_05分别表示泊松图像增强 泊松变换_变形_09泊松图像增强 泊松变换_poisson_10的影响,因此这里我们将泊松图像增强 泊松变换_ci_05定义为三个函数:泊松图像增强 泊松变换_ci_12泊松图像增强 泊松变换_ci_13泊松图像增强 泊松变换_泊松图像增强_14, 同时也满足:泊松图像增强 泊松变换_ci_15.

为此,三角网格上任意一点可以表示为:泊松图像增强 泊松变换_变形_16

接下来,可以得到梯度:泊松图像增强 泊松变换_deformation_17

因为:泊松图像增强 泊松变换_ci_15

所以:泊松图像增强 泊松变换_poisson_19

因此, 泊松图像增强 泊松变换_deformation_20

将 (5) 代入 (2) : 泊松图像增强 泊松变换_泊松图像增强_21

那么,问题来了, 泊松图像增强 泊松变换_泊松图像增强_22 下面以泊松图像增强 泊松变换_poisson_23为例讲解。

泊松图像增强 泊松变换_deformation_24


如上左图所示,我们先做一条平行于泊松图像增强 泊松变换_poisson_25的直线泊松图像增强 泊松变换_泊松图像增强_26, 在平行线上取两个点:泊松图像增强 泊松变换_变形_27. 那么有:

泊松图像增强 泊松变换_deformation_28

我们知道:
泊松图像增强 泊松变换_变形_29
其中,泊松图像增强 泊松变换_ci_30表示三角形的面积。 因为泊松图像增强 泊松变换_泊松图像增强_31泊松图像增强 泊松变换_deformation_32同底等高, 所以:泊松图像增强 泊松变换_泊松图像增强_33,因此:
泊松图像增强 泊松变换_泊松图像增强_34

基于这个重要的结论,实际上所有平行于泊松图像增强 泊松变换_变形_27的直线上的泊松图像增强 泊松变换_ci_36均相等。为此,我们可以做出右侧的一个关于泊松图像增强 泊松变换_ci_36的等值线。那么我们就可以知道,泊松图像增强 泊松变换_ci_36梯度方向是垂直于等值线且指向顶点泊松图像增强 泊松变换_poisson_39的。在长度为底边高的线段上从0变化到1.那么,梯度的模长为高的倒数。因此:

泊松图像增强 泊松变换_ci_40

将(7)代入(4)可以得到三角面片的梯度场为:

泊松图像增强 泊松变换_泊松图像增强_41

其中,泊松图像增强 泊松变换_deformation_42表示方向垂直底边指向另一个顶点,泊松图像增强 泊松变换_ci_43表示三角形的面积。

四、梯度场的散度

梯度场在点泊松图像增强 泊松变换_poisson_39处的散度定义如下,它实际上是1-邻域的求和。

泊松图像增强 泊松变换_poisson_45

其中,泊松图像增强 泊松变换_泊松图像增强_46如(7)所示,泊松图像增强 泊松变换_ci_47如(8)所示, 泊松图像增强 泊松变换_deformation_48为三角形的面积,泊松图像增强 泊松变换_poisson_49泊松图像增强 泊松变换_poisson_39关联的三角面片。

五、顶点的laplace算子及线性系统

顶点的laplace算子定义如下左图所示,那么可以写成矩阵的形势,则权重矩阵A定义为:

泊松图像增强 泊松变换_变形_51

可以证明:三角网格顶点的laplace算子等于散度。为此,可以构建如下右图所示的线性方程组。泊松图像增强 泊松变换_泊松图像增强_52表示三角网格在任意顶点的laplace算子,泊松图像增强 泊松变换_poisson_53为顶点的散度。

泊松图像增强 泊松变换_变形_54


在实际的变形过程中,用户通过交互间接修改三角网格的散度,而左侧权重矩阵泊松图像增强 泊松变换_ci_43保持不变,通过求解上述线性方程组求解变形后顶点的坐标。我们注意到:无论是laplace算子还是散度,都只刻画了顶点与one-ring结点的局部关系,因此泊松变形可以保持局部细节。

六、如何修改散度

实际变形中,如下图所示,我们只需要对泊松图像增强 泊松变换_deformation_56(局部控制点)进行旋转、平移等简单的操作来驱动网格变形。那么上面我们提到,变形过程通过修改散度来求解变形后网格顶点的坐标。那么,这里的核心问题就是如何通过操作局部的控制点来修改其它地方三角网格的散度。

泊松图像增强 泊松变换_ci_57


其实方法有很多,我是对每个点设置了形变系数(0,1)之间,红色控制点处设置为1,然后求解调和方程将形变系数光滑过渡到网格的所有顶点。形变系数的核心意义就是,离控制点越近形变越大,离控制点越远,形变越小。然后利用四元数插值,得到所有点的变形矩阵。任意三角面片的三个顶点一旦改变,那么就可以求解新的散度。然后就可以求解线性方程组了。

参考文献

[1] Yu Y , Zhou K , Xu D , et al. Mesh editing with poisson-based gradient field manipulation[J]. ACM Transactions on Graphics, 2004, 23(3):644.
[2] Press C. Polygon Mesh Processing[J]. Crc Press, 2010.
[3] Pérez, Patrick, Gangnet, Michel, Blake, Andrew. Poisson image editing[J]. Acm Transactions on Graphics, 22(3):313
[4] Tong Y , Lombeyda S , Hirani A N , et al. Discrete Multiscale Vector Field Decomposition[J]. ACM Transactions on Graphics, 2003, 22(3):445-452.
[5] Cohenor D. Laplacian surface editing[C]// 2004.