当前位置: 首页 > news >正文

【I3D 2024】Deblur-GS: 3D Gaussian Splatting from Camera Motion Blurred Images

文章目录

  • 1. 李群与李代数
  • 2. 相机运动模糊建模
  • 3. 相机运动轨迹近似
    • 3.1. 线性插值
    • 3.2. 三次样条插值
    • 3.3. K 阶贝塞尔曲线插值

1. 李群与李代数

参考博客:视觉 SLAM 十四讲 - 李群与李代数。

2. 相机运动模糊建模

运动模糊产生的原因是:相机在曝光期间捕捉到了移动的物体或自身发生了移动,导致场景中某些像素在成像过程中不是来自单一点,而是多个位置的光线的混合

假设在时间 [t0,t0+T][t_0, t_0 + T][t0,t0+T],我们拍摄了一组图像序列 {Ik}k=1n\{I_k\}_{k = 1}^{n}{Ik}k=1n,则模糊图像可以使用下述公式建模:
Iblur=1T∫t0t0+TIk(x,y)dt≈∑k=1nwk⋅Ik(x,y),∑k=1nwk=1I_{\text{blur}} = \frac{1}{T} \int_{t_0}^{t_0 + T} I_k(x, y) \, dt \approx \sum_{k = 1}^{n} w_k \cdot I_k(x, y), \quad \sum_{k = 1}^n w_k = 1 Iblur=T1t0t0+TIk(x,y)dtk=1nwkIk(x,y),k=1nwk=1真实模糊图很难获取其对应的清晰中间帧。因此,我们通过模拟真实相机在曝光时间内的光线积分过程,对图像序列按时间进行加权平均,得到一张模糊图像,即合成模糊图 = 模拟曝光下图像形成过程

3. 相机运动轨迹近似

相机在曝光期间可沿任意光滑路径移动。为近似这一运动,论文分别采用线性插值三次样条插值K阶贝塞尔曲线进行建模。​

3.1. 线性插值

鉴于快门时间通常较短相机运动的幅度相对较小,线性插值在大多数情况下通常足够适用。假设相机曝光时间为 τ\tauτ,曝光开始时的位姿为 T0\boldsymbol{T}_0T0,曝光结束时的位姿为 T1\boldsymbol{T}_1T1,则时刻 t∈[0,τ]t \in [0, \tau]t[0,τ] 的位姿如下:
Tt=T0⋅exp⁡(tτlog⁡(T0−1⋅T1))\boldsymbol{T}_t = \boldsymbol{T}_0 \cdot \exp(\dfrac{t}{\tau} \log{(\boldsymbol{T}_0^{-1} \cdot \boldsymbol{T}_1)}) Tt=T0exp(τtlog(T01T1))上述公式描述了从初始位姿 T0\boldsymbol{T}_0T0 到目标位姿 T1\boldsymbol{T}_1T1 的平滑插值路径。

SE(3)SE(3)SE(3) 群中,直接对位姿矩阵 T\boldsymbol{T}T 进行欧几里得线性插值(例如,Tt=(1−tτ)T0+tτT1\boldsymbol{T}_t = (1 - \dfrac{t}{\tau}) \boldsymbol{T}_0 + \dfrac{t}{\tau} \boldsymbol{T}_1Tt=(1τt)T0+τtT1)会破坏群结构(例如,旋转矩阵可能不再正交)。为此,​​实际应用中需要​​把​​位姿矩阵转换为李代数​​元素​​,进行线性插值​​后​​,再通过指数映射​​回李群​​,以确保结果始终是有效的位姿矩阵。

首先,计算位姿 T0\boldsymbol{T}_0T0T1\boldsymbol{T}_1T1 的相对位姿为 ΔT=T0−1T1∈SE(3)\Delta \boldsymbol{T} = \boldsymbol{T}_0^{-1} \boldsymbol{T}_1 \in SE(3)ΔT=T01T1SE(3)。值得注意的是,增量变换 ΔT\Delta \boldsymbol{T}ΔT 在相机处于位姿 T0\boldsymbol{T}_0T0 时的局部坐标系中定义,因此新位姿 T1\boldsymbol{T}_1T1 的计算需使用右乘法则T1=T0ΔT\boldsymbol{T}_1 = \boldsymbol{T}_0 \Delta \boldsymbol{T}T1=T0ΔT,参考博客:机器人位姿变换的坐标系相对性:左乘法则与右乘法则解析​。

其次,对 ΔT\Delta \boldsymbol{T}ΔT 取对数映射到李代数元素,即有 ξ=log⁡(ΔT)∈se(3)\boldsymbol{\xi} = \log(\Delta \boldsymbol{T}) \in se(3)ξ=log(ΔT)se(3)

然后,在李代数中进行线性插值。对于任意时间 ttt,线性插值为:ξt=tτξ\boldsymbol{\xi}_t = \dfrac{t}{\tau} \boldsymbol{\xi}ξt=τtξ

最后,将插值结果通过指数映射回李群,即有 exp⁡(ξt)=exp⁡(tτlog⁡(T0−1T1))\exp(\boldsymbol{\xi}_t) = \exp(\dfrac{t}{\tau} \log(\boldsymbol{T}_0^{-1} \boldsymbol{T}_1))exp(ξt)=exp(τtlog(T01T1)),最终的时刻 ttt 的位姿矩阵 Tt\boldsymbol{T}_tTt 为:
Tt=T0⋅exp⁡(tτlog⁡(T0−1⋅T1))\boldsymbol{T}_t = \boldsymbol{T}_0 \cdot \exp(\dfrac{t}{\tau} \log{(\boldsymbol{T}_0^{-1} \cdot \boldsymbol{T}_1)}) Tt=T0exp(τtlog(T01T1))

3.2. 三次样条插值

三次样条插值(Cubic Spline Interpolation)是一种常用的数值插值方法,用于在一组数据点之间构造一条平滑曲线。它的核心思想是:在每两个相邻的数据点之间用一个三次多项式段来拟合,保证整条曲线在每个节点处一阶和二阶导数连续,从而构建一条光滑的整体曲线

给定 n+1n+1n+1 个数据点:
(x0,y0),(x1,y1),⋯,(xn,yn),x0<x1<⋯<xn(x_0, y_0), (x_1, y_1), \cdots, (x_n, y_n), \quad x_0 < x_1 < \cdots < x_n (x0,y0),(x1,y1),,(xn,yn),x0<x1<<xn我们希望在每个区间 [xi,xi+1][x_i, x_{i+1}][xi,xi+1] 上,构造一个三次多项式 Si(x)S_i(x)Si(x)
Si(x)=ai+bi(x−xi)+ci(x−xi)2+di(x−xi)3S_i(x) = a_i + b_i (x - x_i) + c_i (x - x_i)^2 + d_i (x - x_i)^3 Si(x)=ai+bi(xxi)+ci(xxi)2+di(xxi)3使得这 nnn 个多项式段拼接成一条"光滑"的插值曲线。


在论文中 u=tτ∈[0,1]u = \dfrac{t}{\tau} \in [0, 1]u=τt[0,1],相当于上述的 x−xix - x_ixxi,那么三次样条插值可以表述为:
{B~(u)=C[1uu2u3],C=16[600053−31133−20001]T(u(t))=T0∏j=02exp⁡(B~j+1(u(t))⋅Ωj)Ωi=log⁡(Ti−1−1⋅Ti)\begin{cases} \tilde{\boldsymbol{B}}(u) = \boldsymbol{C} \begin{bmatrix} 1 \\ u \\ u^{2} \\ u^{3} \end{bmatrix}, \quad \boldsymbol{C} = \dfrac{1}{6} \begin{bmatrix} 6 & 0 & 0 & 0 \\ 5 & 3 & -3 & 1 \\ 1 & 3 & 3 & -2 \\ 0 & 0 & 0 & 1 \end{bmatrix} \\ \\ \boldsymbol{T}(u(t)) = \boldsymbol{T}_0 \prod_{j = 0}^{2} \exp \left( \tilde{\boldsymbol{B}}_{j+1}(u(t)) \cdot \boldsymbol{\Omega}_j \right) \\ \\ \boldsymbol{\Omega}_i = \log\left(\boldsymbol{T}_{i-1}^{-1} \cdot \boldsymbol{T}_i\right) \end{cases} B~(u)=C1uu2u3,C=616510033003300121T(u(t))=T0j=02exp(B~j+1(u(t))Ωj)Ωi=log(Ti11Ti)其中:

  • T(u(t))\boldsymbol{T}(u(t))T(u(t)) 表示 ttt 时刻的相机位姿的插值结果
  • Ωi\boldsymbol{\Omega}_iΩi 表示位姿 Ti−1\boldsymbol{T}_{i-1}Ti1Ti\boldsymbol{T}_{i}Ti 的相对位姿,并且通过对数映射将李群元素转换到李代数空间

B~(u)=[B~0(u),B~1(u),B~2(u),B~3(u)]T\tilde{\boldsymbol{B}}(u) = \left[ \tilde{B}_{0}(u), \tilde{B}_{1}(u), \tilde{B}_{2}(u), \tilde{B}_{3}(u) \right]^TB~(u)=[B~0(u),B~1(u),B~2(u),B~3(u)]T 为 4 维向量,具体而言:{B~0(u)=1B~1(u)=16(5+3u−3u2+u3)B~2(u)=16(1+3u+3u2−2u3)B~3(u)=16u3\begin{cases} \tilde{B}_{0}(u) = 1 \\ \\ \tilde{B}_{1}(u) = \dfrac{1}{6}(5 + 3u - 3u^{2} + u^{3}) \\ \\ \tilde{B}_{2}(u) = \dfrac{1}{6}(1 + 3u + 3u^{2} - 2u^{3}) \\ \\ \tilde{B}_{3}(u) = \dfrac{1}{6}u^{3} \end{cases} B~0(u)=1B~1(u)=61(5+3u3u2+u3)B~2(u)=61(1+3u+3u22u3)B~3(u)=61u3T(u)\boldsymbol{T}(u)T(u) 的数学表达式如下:T(u)=T0⋅exp⁡(B~1Ω0)⏟T0→T1路径⋅exp⁡(B~2Ω1)⏟T1→T2路径⋅exp⁡(B~3Ω2)⏟T2→T3路径\begin{equation*} \boldsymbol{T}(u) = \boldsymbol{T}_{0} \cdot \underbrace{\exp (\tilde{B}_{1} \boldsymbol{\Omega}_{0})}_{\text{$\boldsymbol{T}_{0} \rightarrow \boldsymbol{T}_{1}$ 路径}} \cdot \underbrace{\exp (\tilde{B}_{2} \boldsymbol{\Omega}_{1})}_{\text{$\boldsymbol{T}_{1} \rightarrow \boldsymbol{T}_{2}$ 路径}} \cdot \underbrace{\exp (\tilde{B}_{3} \boldsymbol{\Omega}_{2})}_{\text{$\boldsymbol{T}_{2} \rightarrow \boldsymbol{T}_{3}$ 路径}} \end{equation*} T(u)=T0T0T1 路径exp(B~1Ω0)T1T2 路径exp(B~2Ω1)T2T3 路径exp(B~3Ω2)其中:
Ω0=log⁡(T0−1T1)Ω1=log⁡(T1−1T2)Ω2=log⁡(T2−1T3)\begin{align*} \boldsymbol{\Omega}_0 &= \log(\boldsymbol{T}_0^{-1}\boldsymbol{T}_1) \\ \boldsymbol{\Omega}_1 &= \log(\boldsymbol{T}_1^{-1}\boldsymbol{T}_2) \\ \boldsymbol{\Omega}_2 &= \log(\boldsymbol{T}_2^{-1}\boldsymbol{T}_3) \end{align*} Ω0Ω1Ω2=log(T01T1)=log(T11T2)=log(T21T3)值得注意的是:B~0\tilde{B}_{0}B~0 无对应运动:因为控制点序列从 T0\boldsymbol{T}_0T0 开始,没有 T−1→T0\boldsymbol{T}_{-1} \rightarrow \boldsymbol{T}_0T1T0 的运动可编码。

3.3. K 阶贝塞尔曲线插值

对于 KKK 阶贝塞尔曲线,我们需要 K+1K + 1K+1 个控制点 Ti(i=1,2,⋯,K+1)\boldsymbol{T}_i \ (i = 1, 2, \cdots, K + 1)Ti (i=1,2,,K+1)

在欧氏空间 Rn\Bbb{R}^nRn 中,KKK 阶 Bézier 曲线为:
x(u)=∑i=0KBiK(u)⋅xi=∑i=0K(Ki)(1−u)K−iui⋅xix(u) = \sum_{i = 0}^{K} B_i^K(u) \cdot x_i = \sum_{i = 0}^{K} \binom{K}{i} (1 - u)^{K - i} u^i \cdot x_i x(u)=i=0KBiK(u)xi=i=0K(iK)(1u)Kiuixi为了将 Bézier 插值推广到 SE(3)SE(3)SE(3),我们需要对每个控制点 Ti∈SE(3)\boldsymbol{T}_i \in SE(3)TiSE(3) 映射到李代数:
ξi=log⁡(Ti)∈se(3)\boldsymbol{\xi}_i = \log(\boldsymbol{T}_i) \in se(3) ξi=log(Ti)se(3)使用 Bézier 权重在李代数空间中构造组合项:
ηi=BiK(u)⋅ξi=(Ki)(1−u)K−iui⋅log⁡(Ti)\boldsymbol{\eta}_i = B_i^K(u) \cdot \boldsymbol{\xi}_i = \binom{K}{i} (1 - u)^{K - i} u^i \cdot \log(\boldsymbol{T}_i) ηi=BiK(u)ξi=(iK)(1u)Kiuilog(Ti)KKK 阶贝塞尔曲线插值的结果为:
η=∑i=0Kηi=∑i=0K(Ki)(1−u)K−iui⋅log⁡(Ti)\boldsymbol{\eta} = \sum_{i = 0}^{K} \boldsymbol{\eta}_i = \sum_{i = 0}^{K} \binom{K}{i} (1 - u)^{K - i} u^i \cdot \log(\boldsymbol{T}_i) η=i=0Kηi=i=0K(iK)(1u)Kiuilog(Ti)将插值结果通过指数映射回 SE(3)SE(3)SE(3) 有:
Tt=exp⁡(η)=exp⁡(∑i=0K(Ki)(1−u)K−iui⋅log⁡(Ti))=∏i=0Kexp⁡((Ki)(1−u)K−iui⋅log⁡(Ti))\boldsymbol{T}_t = \exp(\boldsymbol{\eta}) = \exp \left(\sum_{i = 0}^{K} \binom{K}{i} (1 - u)^{K - i} u^i \cdot \log(\boldsymbol{T}_i)\right) = \prod_{i = 0}^{K} \exp\left( \binom{K}{i} (1 - u)^{K - i} u^i \cdot \log(\boldsymbol{T}_i) \right) Tt=exp(η)=exp(i=0K(iK)(1u)Kiuilog(Ti))=i=0Kexp((iK)(1u)Kiuilog(Ti))值得注意的是:Tt\boldsymbol{T}_tTt 相对于 Ti\boldsymbol{T}_iTi 是可微分的,从而​​可以通过优化 Ti\boldsymbol{T}_iTi 来优化​​其运动模糊效果​​。

http://www.dtcms.com/a/280343.html

相关文章:

  • 记录一条面试sql题目
  • JS中async/await功能介绍和使用演示
  • 普通字符类型和new String有什么区别
  • 使用JS编写动态表格
  • 【env环境】rtthread5.1.0使用fal组件
  • AI的外挂知识库,RAG检索增强生成技术
  • 【PTA数据结构 | C语言版】将表达式树转换成中缀表达式
  • 数仓面试题
  • 2025最新国产用例管理工具评测:Gitee Test、禅道、蓝凌测试、TestOps 哪家更懂研发协同?
  • docker停止所有容器和删除所有镜像
  • 从一道题目(阿里2014 Crackme_2)开启unidbg还原算法入门(转载)
  • 强化学习书籍
  • vscode 打开c++文件注释乱码
  • 分布式存储之Ceph使用指南--部署篇(未完待续)
  • Claude 背后金主亚马逊亲自下场,重磅发布 AI 编程工具 Kiro 现已开启免费试用
  • 【交叉编译报错】fatal: not a git repository (or any of the parent directories): .git
  • 分布式全局唯一ID生成:雪花算法 vs Redis Increment,怎么选?
  • 内存的基础相关知识,什么是内存,内存管理
  • 死锁问题以及读写锁和自旋锁介绍【Linux操作系统】
  • Spring 中 @Component和@Bean注解的区别
  • 为何说分布式 AI 推理已成为下一代计算方式
  • SpringBoot 2.x→3.0升级实战:Jakarta EE兼容性改造清单
  • kotlin布局交互
  • Kotlin聚合方法
  • Python 操作Excel工作表:添加、删除、移动、隐藏
  • 前端安全指南:防御XSS与CSRF攻击
  • 给 Excel 整列空格文字内容加上前缀:像给文字穿衣服一样简单!
  • Excel制作玫瑰图
  • PostgreSQL FATAL: sorry, too many clients already 连接数爆满的处理办法
  • excel 通过openpyxl表格下载和插入图片