刚性配准与非刚性配准

前言

"配准"这个词其实应用的场景很多,例如在AR设备上进行定位需要用到的图像配准,需要提前存储图像的特征信息,然后用AR设备的摄像头实时计算图像特征并进行匹配,配准成功后进行跟踪。

本文所说的"配准",是应用于三维点云或者mesh之中的,在我看过的文献中,"配准"(registration)和"对齐"(alignment)这两个词都用于描述这个意思。

根据物体本身是否发生形变,可以分为刚性配准非刚性配准:刚性配准所有顶点共用一个变换矩阵,非刚性配准则不是。

刚性配准

假设两个点云分别用 source : X = { x 1 , . . . , x m } \text{source}:\mathbf{X}=\{\mathbf{x}_1,...,\mathbf{x}_m\} source:X={x1,...,xm} 和 target : Y = { y 1 , . . . , y n } \text{target}:\mathbf{Y}=\{\mathbf{y}1,...,\mathbf{y}n\} target:Y={y1,...,yn} 表示,刚性配准的目标就是要找到最优的刚性变换 T T T,使得 T ( X ) T(\mathbf{X}) T(X) 和 Y \mathbf{Y} Y 尽可能重合。用最优化的形式表述为:
min ⁡ R , t 1 m ∑ i = 1 m ∣ ∣ R x i + t − y ( x i ) ∣ ∣ 2 \min
{\mathbf{R},\mathbf{t}}{\frac{1}{m}\sum
{i=1}^m || \mathbf{R}\mathbf{x}_i+\mathbf{t}-\mathbf{y}(\mathbf{x}_i) ||^2} R,tminm1i=1∑m∣∣Rxi+t−y(xi)∣∣2

其中 y ( x i ) \mathbf{y}(\mathbf{x}_i) y(xi) 为target中对应的顶点。

求解这个最优化问题最常用的方法就是迭代最近点算法(Iterative Closest Point, ICP),按照最优化形式分解为两个步骤:

  1. 最近点查找:对于 X \mathbf{X} X 中的每个顶点 x \mathbf{x} x,查找 Y \mathbf{Y} Y 中最近的顶点 y ( x ) \mathbf{y}(\mathbf{x}) y(x) 作为对应点;
  2. SVD求解最优变换:首先各自减去质心 x ^ = x − x ‾ \mathbf{\hat{x}}=\mathbf{x}-\mathbf{\overline{x}} x^=x−x, y ^ = y ( x ) − y ( x ) ‾ \mathbf{\hat{y}}=\mathbf{y}(\mathbf{x})-\overline{\mathbf{y}(\mathbf{x})} y^=y(x)−y(x) ,令 W = ∑ x ^ i y ^ i T \mathbf{W}=\sum{\mathbf{\hat{x}_i}\mathbf{\hat{y}_i}^T} W=∑x^iy^iT ,然后奇异值分解 W = U D V T \mathbf{W}=\mathbf{U}\mathbf{D}\mathbf{V}^T W=UDVT,则最优变换为 R ∗ = V U T \mathbf{R}^*=\mathbf{V}\mathbf{U}^T R∗=VUT, t ∗ = y ‾ − R ∗ x ‾ \mathbf{t}^*=\mathbf{\overline{y}}-\mathbf{R}^*\mathbf{\overline{x}} t∗=y−R∗x 。

最近点查找往往需要耗费很多时间,常见的可以用kd-tree进行加速;在确定顶点对应关系后,最优变换就存在闭合形式的解。ICP算法就是首先确定一个初始解 R 0 , t 0 \mathbf{R}_0,\mathbf{t}_0 R0,t0,然后不断地迭代进行上面两个步骤,直至满足收敛条件。初始解例如可以人为在两个点云上标注4对对应点,然后计算得到,收敛条件可以是变换矩阵的增量小于某个阈值等等。

为了优化ICP算法的效果和速度,还有很多变种,例如:

  • 采样点集进行匹配;
  • 点对进行加权;
  • 拒绝某些特殊点对,例如距离太远的;
  • 点到点的距离,变为点到切平面的距离;

实际上从更根本的角度来看,刚性配准就是最小化一个度量函数
min ⁡ T E ( T ( X ) , Y ) \min_{T}{E(T(\mathbf{X}),\mathbf{Y})} TminE(T(X),Y)

按照我的经验,度量函数 E E E 设置为点云的 chamfer distance,直接进行迭代优化(例如在Pytorch框架下反向传播优化)也能取得不错的配准效果。

非刚性配准

相对于刚性配准,非刚性配准的点云或者mesh是可以产生形变的。变形模板(template, source)用 X = { x 1 , . . . , x m } \mathbf{X}=\{\mathbf{x}_1,...,\mathbf{x}_m\} X={x1,...,xm} 表示,配准目标(target)用 Y = { y 1 , . . . , y n } \mathbf{Y}=\{\mathbf{y}_1,...,\mathbf{y}_n\} Y={y1,...,yn} 表示,变形后的曲面用 X ^ = { x ^ 1 , . . . , x ^ m } \hat{\mathbf{X}}=\{\hat{\mathbf{x}}_1,...,\hat{\mathbf{x}}m\} X^={x^1,...,x^m} 表示。如果我们用 f Θ ( X ) f{\Theta}(\mathbf{X}) fΘ(X) 来表示对模板的变形,那么 Θ \Theta Θ 就是我们待优化的参数。一般来说参数量越大,就说明模板变形的自由度越大(一般也配准得越准确),但同时优化难度和开销也越高。

基于"优化"的非刚性配准可以表示如下:
Minimize Θ E ( f Θ ( X ) , Y ) \mathop{\text{Minimize}}\limits_{\Theta} \quad E(f_{\Theta}(\mathbf{X}),\mathbf{Y}) ΘMinimizeE(fΘ(X),Y)

其中 E E E 表示评估两个曲面相似程度的度量函数。

在非刚性配准中,模板会发生形变,因此我们不仅希望变形后模板和目标尽可能对齐,还希望变形后的模板保持一定的形态特点(举个极端例子,模板缩成一个顶点,可能从"对齐"的度量来看是一个最优解),因此往往度量函数会包括正则化的度量。即在非刚性配准中度量函数一般为
E = E align + α E reg E=E_{\text{align}}+\alpha E_{\text{reg}} E=Ealign+αEreg

其中 E align E_{\text{align}} Ealign 是对常见的非刚性配准中"形变场"(deformation field)的度量,常见的形变场的表示方式有:

  • 直接以变形后的顶点坐标 X ^ \hat{\mathbf{X}} X^ 作为优化参数;
  • 每个顶点单独做仿射变换;
  • 采样少部分顶点做仿射变换,其它顶点做采样顶点的加权变换
  • ......

而 E reg E_{\text{reg}} Ereg 则可以有很多,例如光滑度度量、位置约束、局部形状约束、参数正则化等等。

更多关于非刚性配准的总结,可以参考《A Survey of Non-Rigid 3D Registration》

相关推荐
ttod_qzstudio10 天前
Unity中Mesh重叠顶点合并参考及其应用
unity·图形学
Ian102524 天前
《Learn Three.js》学习(3)光源
前端·javascript·学习·webgl·图形学·三维·三维光源
哈市雪花1 个月前
图像处理 之 凸包和最小外围轮廓生成
图像处理·人工智能·图形学·最小外围轮廓·最小外包
新手小白勇闯新世界2 个月前
论文阅读(一种基于球面投影和特征提取的岩石点云快速配准算法)
论文阅读·点云·配准·icp·特征提取
zaizai10072 个月前
WebGL编程指南 - 颜色与纹理续
图形学
zaizai10072 个月前
WebGL编程指南 - 绘制和变换三角形
图形学
zaizai10072 个月前
WebGL编程指南 - 入门续
图形学
闲人编程3 个月前
使用Python实现图形学的阴影贴图算法
python·算法·图形学·贴图·阴影贴图
闲人编程3 个月前
使用Python实现图形学的纹理映射算法
开发语言·python·算法·图形学·纹理映射
闲人编程3 个月前
使用Python实现图形学的环境映射算法
开发语言·python·算法·图形学·环境映射