通过局部/全局优化的快速纹理映射调整 | HyperPlane

通过局部/全局优化的快速纹理映射调整

W. Li, H. Gong, and R. Yang, “Fast Texture Mapping Adjustment via Local/Global Optimization,” IEEE Transactions on Visualization and Computer Graphics, pp. 1–1, 2018.

问题:给定一系列已经标定的图像的情况下将纹理映射到三角mesh上。
传统方法使用模型参数化的投影纹理映射,本文提出了一种图像空间纹理优化方案,目的是减少可视裂缝或者在纹理或深度边界处的错误alignment。该方案开始于边界上的有效局部纹理调整,然后使用全局矫正步骤来调整由局部运动带来的纹理畸变。

方法主要分为两步,第一步确定mesh的每个三角网格对应的图像,第二步通过两种错误align的情况给出局部约束进行优化。

重点是使用已经标定的输入图像在重建的曲面模型打上纹理。基本方法是将曲面投影到每一个视角来还原颜色。如果标定和曲面几何精度都非常高的话这样的方法可以得到很精确的结果哦,但是对于消费级传感器来说很难。
为了缓减错误align的纹理裂缝,可以混合裂缝附近的几张图像,这类方法的区别就在于如何生成混合使用的权重。混合可以移除sharp裂缝,但是在overlap的地方错误align的话会导致重影和模糊。
和混合的方法不同,将模型曲面投影到图像上并且将纹理问题公式化为图像缝合(stitching)问题。

Overview

需要解决的问题是使用一系列已经标定的图像给3D模型打上纹理。具体一点来说,给定一个有mm个三角网格的mesh {F1,F2,,Fm}\{ F_1, F_2, \dots, F_m \}nn张输入图像{I1,I2,,In}\{ I_1, I_2, \dots, I_n \}。目标是对于每一个三角网格FiF_i都计算一个纹理坐标Ti={li,ti}T_i = \{ l_i, t_i \},其中li{1n}l_i \in \{ 1 \dots n \}指定源图像,tiR6t_i \in \mathbb{R}^6是被选择源图像空间中的UV坐标。通过结合输入图像的标定矩阵,TiT_i可以有多种选择。
该方法展示了一个最优化{T1,T2Tm}\{ T_1, T_2 \dots T_m \}的框架。这个框架有两个过程(stage)。首先选择TiT_i对应的源图像,这个选择基于一系列条件,比如可视顶点的个数、视角和平滑约束。第二个过程是优化纹理坐标tit_i
对扫描目标进行纹理映射的公共问题是纹理的错误alignment。错误有两种形式(文中图2),一种是不同输入图像的邻接三角形,另一种是在深度边界上。但是错误的alignment也没事,总是可以通过转移该三角网格的纹理坐标来修复。

预处理

直接将所有的图像给到图像标签过程计算量太大,由于每个三角网格可能有数百上千个潜在的标签可以选择。该方法使用对每个图像中可视三角网格进行计数的简单贪婪方法,如果新的可视三角网格在阈值之上就将这个图像选进源图像集。
另外一个需要考虑的因素是模型的分辨率。如果模型上的一个三角网格在图像上只占非常小的部分,比如只占几个像素,优化过程会变得特别慢而且很难收敛。对于稠密的模型,使用边界坍塌(collapse)方法简化输入模型到一个合适的密度。简化过程是可追踪且可逆的(traceable and reversible)。简化后模型中的纹理坐标可以传播到原始模型中。

图像标签

每一个三角网格都可以由输入图像集中多个视角看到,首先对每个三角网格选择最好的图像源lil_i。这个选择问题的一个简单的解可以基于三角网格曲面法线和与之关联的每个图像视角之间的夹角决定。具体而言,将三角网格FiF_i的源图像写为IliI_{l_i},其中lil_i是标签(label)。最优的标签集L={l1,l2ln}\mathcal{L} = \{ l_1, l_2 \dots l_n\}由该costfuction最小化得到:

E(L)=iM(Edata(li)+λjNFiEsmooth(li,lj))E(\mathcal{L}) = \sum_{i \in M} \left( E_{data}(l_i) + \lambda \sum_{j \in \mathcal{N}_{F_i}} E_{smooth} (l_i, l_j) \right)

数据项使用了两个主要因素:FiF_i对应图像空间的分辨率和三角网格法线和视角方向夹角。公式化为:

Edata(li)=d(Fi,Ili)a(Fi,Ili)E_{data}(l_i) = -d(F_i, I_{l_i})a(F_i, I_{l_i})

其中d(Fi,Ili)d(F_i, I_{l_i})是三角网格FiF_iIliI_{l_i}上的投影到其投影中心的平均距离,这是FiF_iIliI_{l_i}上投影尺寸的估计(这个是我自己理解的,原文的句子说的感觉有歧义)。a(Fi,Ili)a(F_i, I_{l_i})表示三角网格法线和视线方向的夹角。
第二项为平滑项,其中NFi\mathcal{N}_{F_i}为三角网格FiF_i的一圈(1-ring)领域。成对的平滑代价使用Potts Model Esmooth(li,lj)=[lilj]E_{smooth}(l_i, l_j) = [l_i \neq l_j]定义。
这个costfunction可以使用图割方法求解。具体的数据项和平滑有多种选择,可以具体参看引文[7][8][9]。

图像空间优化

在给图像打上标签之后,三角网格的纹理坐标可以通过将它的顶点投影到选择的源图像上获得。这个简单的过程可能会导致可视纹理的错误alignment/裂缝。因此需要一些调整策略,由投影的纹理坐标系开始,增加一些约束去除这些裂缝。目标是在每一个图像基上去优化纹理坐标以满足所有的约束。
过程分为两步:第一步是局部阶段,这一步中对所选择的三角网格计算约束的纹理坐标。第二步是全局阶段,这一步中调整一张图像中所有的纹理坐标和原始的投影纹理坐标尽可能满足所有的约束。

局部优化

两种错误的alignment,第一种是两个源图像之间的,为此增加的约束为图像间约束(inter-image constraint);第二种是单个图像内的,为此增加的约束为图像内约束(intra-image constraint)。

图像间约束

领域三角网格中有不同源图像的三角网格是添加图像间约束的目标。该约束被设计为最小化两个输入图像沿着公共边内容的误匹配。定义为:

Eedge(Fi,Fj)=FiFjM(ϕFili(x),ϕFjlj(x))dxE_{edge}(F_i, F_j) = \int _{F_i \cap F_j} \mathcal{M}(\phi^{l_i}_{F_i}(x), \phi^{l_j}_{F_j}(x)) dx

其中ϕFili\phi^{l_i}_{F_i}FiF_i投影到IliI_{l_i}上的操作符,M(.,.)\mathcal{M}(.,.)是距离测度。当FiF_iFjF_j投影到同一张图像上的时候Eedge(Fi,Fj)E_{edge}(F_i, F_j)应该为00。定义距离测度为颜色差值和梯度差值的和:

M(xi,xj)=αIli(xi)Ilj(xj)+(1α)Gli(xi)Glj(xj)\mathcal{M}(x_i, x_j) = \alpha \lVert I_{l_i} (x_i) - I_{l_j} (x_j) \rVert + (1 - \alpha) \lVert G_{l_i}(x_i) - G_{l_j}(x_j) \rVert

其中xix_ixjx_j分别是对应三角网格FiF_iFjF_j公共边界上3D点在图像lil_iljl_j上的2D纹理坐标。
为了得到可见的匹配裂缝,寻找合适的纹理坐标转移(Δxi,Δxj)(\Delta x_i, \Delta x_j)最小化Eedge(Fi,Fj)E_{edge}(F_i, F_j)。因此目标函数为:

Eopt=κFiFjM(ϕFili(x)+Δxi,ϕFjlj(x)+Δxj)dxE_{opt} = \kappa \int_{F_i \cap F_j} \mathcal{M}(\phi^{l_i}_{F_i}(x) + \Delta x_i, \phi^{l_j}_{F_j}(x) + \Delta x_j) dx

其中κ\kappa是纹理移动指标,用来惩罚颜色空间噪声造成的不必要的移动和沿着边界同样的平移。定义为:

κ=(1+Δxi2)(1+Δxj2)\kappa = (1 + \lVert \Delta x_i \rVert ^2)(1 + \lVert \Delta x_j \rVert ^2)

在优化之后,设x~i=xi+Δxi\tilde{x}_i = x_i+ \Delta x_i为原始纹理坐标xix_i的图像间约束,并且设ω~=ΔEopt/Eopt\tilde{\omega} = \Delta E_{opt} / E_{opt}为对应约束权重。

图像内约束

图像内的错误alignment由深度边界和颜色边界不一致造成。首先确认潜在的图像内错误alignment,通过在颜色图像和将3D模型投影到图像上得到的同步深度映射上进行边界检测。对应任意一个三角网格满足(1)有至少一个边界在深度边界上 并且(2)和颜色边界很近(20个像素内),将起标记为使用图像内约束的候选。
将在深度边界上的三角网格边于图像空间中两个端点的2D纹理坐标记为p0p_0p1p_1。沿着p0p1\overrightarrow{p_0 p_1}的法线移动这两个端点,知道与颜色边界相交,此时记新的纹理坐标为p~0\tilde{p}_0p~1\tilde{p}_1。因此p~0\tilde{p}_0p~1\tilde{p}_1分别为p0p_0p1p_1构造了图像内约束。对应的权重被设为与距离逆相关:

ω~=exp((p~0p02+p~1p12)/2ø2)\tilde{\omega} = \exp (- (\lVert \tilde{p}_0 - p_0 \rVert ^2 + \lVert \tilde{p}_1 - p_1 \rVert ^2) / 2 \text{\o} ^2)

ø\text{\o}为权重因子。

全局优化

全局优化一次在一张图像上进行,所有的纹理坐标记为T={t1,t2,,tn}T = \{ t_1, t_2, \dots, t_n \}。全局阶段的costfunction为:

E(T~)=λ2LT~ρF2+kCk(T~,Tk)E(\tilde{T}) = \frac{\lambda}{2} \lVert \mathbf{L} \tilde{T} - \rho \rVert ^2_F + \sum _k C_k (\tilde{T}, T_k)

其中L\mathbf{L}为使用余切权重的拉普拉斯矩阵,ρ=2(T)\rho = \nabla ^2(T)为原始投影纹理坐标系梯度的散度。第一项要求T~\tilde{T}需要和原始的TT相近。λ\lambda是自己定义的参数因子。
第二项是增加的约束。下标kk被用来区别约束不同的类型。一般情况下,约束的形式为:

Ck(T~,Tk)=ωk2AkSkT~BkTkF2C_k(\tilde{T}, T_k) = \frac{\omega _k}{2} \lVert \mathbf{A_k S_k} \tilde{T} - \mathbf{B_k} T_k \rVert ^2_F

TkT_k为辅助变量,表示在当前约束下的期望纹理坐标,上文中的x~\tilde{x}或者p~\tilde{p}并不是所有的纹理坐标都有约束。对于没有约束的kkTkT_k一个为00Ak\mathbf{A_k}Bk\mathbf{B_k}TkT_k的权重矩阵,每一次迭代都由前文中对应的ω~\tilde{\omega}更新为当前计算的TkT_k提供可信度。Sk\mathbf{S_k}为选择矩阵,是一个对角阵,当对应TkT_k中的纹理坐标非00时对角元素为11,其它情况为00ωk\omega _k是平衡不同约束的非负权重。
一个细节是纹理坐标是以一个三角网格为基础计算的,因此一个顶点可能有几个不同的纹理坐标。为了保证一个输入图像内的纹理连续,增加了约束保证同一个顶点的纹理坐标相等。

颜色混合

图像边界之间的颜色不同还是可以看出来的,使用局部泊松混合进行全局颜色调整。

总结

文章符号有些混乱因此总结一下。在全局优化的costfunction中,kk有两个值,分布代表两种局部约束(图像间约束和图像内约束);Bk\mathbf{B_k}为其中一种约束下的权重组成的矩阵;TkT_k为对应约束下的局部优化后的值,如果对应约束跟这个三角网格没有关系,那么TkT_k中对应的值置为00,同时将Sk\mathbf{S_k}中对应的对角元素置为00;没有想通Ak\mathbf{A_k}Bk\mathbf{B_k}的区别在哪里。