论文阅读:Computational Long Exposure Mobile Photography (二)

这篇文章是谷歌发表在 2023 ACM transaction on Graphic 上的一篇文章,介绍如何在手机摄影中实现长曝光的一些拍摄效果。

Abstract

长曝光摄影能拍出令人惊叹的影像,用运动模糊来呈现场景中的移动元素。它通常有两种模式,分别产生前景模糊或背景模糊效果。前景模糊图像通常是用安装在三脚架上的相机拍摄的,描绘的是移动的前景元素(如丝般的流水或光轨)呈现出模糊效果,而背景景观则非常清晰。背景模糊图像(也称为平移摄影)是在相机追踪移动主体时拍摄的,从而得到主体清晰而背景因相对运动而模糊的图像。这两种技术都极具挑战性,并且需要额外的设备和高超的技巧。
本文介绍了一种计算式连拍摄影系统,它运行在手拿式智能手机的相机应用程序中,只需按下快门按钮就能全自动地实现这些效果。我们的方法首先检测并分割出显著主体。我们对多帧画面中的场景运动进行追踪并对齐图像,以保持所需的清晰度并产生具有美感的运动拖影。我们拍摄一组曝光不足的连拍照片,并选择输入帧的子集,无论场景或相机的运动速度如何,这些子集都能产生长度可控的模糊拖影。我们预测帧间运动并合成运动模糊来填补输入帧之间的时间间隙。最后,我们将模糊图像与正常曝光的清晰图像合成,以保证面部或场景中几乎没有移动的区域的清晰度,并生成最终的高分辨率和高动态范围(HDR)照片。我们的系统使原本只有专业人士才能掌握的能力得以普及,让大多数普通摄影爱好者也能使用这种创意风格。

文章太长,分成两部分,第一部分:
Computational Long Exposure Mobile Photography (一)

Frame Selection

我们的系统使用一种帧选择机制,该机制计算运动模糊轨迹长度的估计值,以决定增量帧处理外循环何时应该停止。首先,我们利用对齐求解器计算出的变换将运动特征轨迹转换到基准帧的参考空间,在该空间中它们在空间上与输出图像中相应被跟踪特征的运动模糊轨迹对齐。然后可以计算出每条对齐轨迹的长度,并且我们使用轨迹长度分布的高百分位数作为整体模糊轨迹长度的估计值。最后将这个估计值与一个恒定的目标设置进行比较,以决定是否满足帧选择标准。
我们以图像对角线的百分比来测量轨迹长度,这种度量在很大程度上对图像分辨率或宽高比不敏感。在前景模糊的情况下,我们的标准是第 98 百分位数达到 30% 的目标,为移动最快的物体产生相对较长且平滑的模糊轨迹。在背景模糊的情况下,我们采用第 80 百分位数和 2.8% 的目标,为背景的较大区域产生短模糊轨迹,目的是保持主体清晰度并避免丢失周围场景的背景信息。这些设置是通过对大量输入连拍进行反复试验得出的经验值。

Motion Prediction

一旦输入的低分辨率图像完成对齐,我们就将它们输入到一个运动模糊核预测神经网络中,每次输入一帧对,每次迭代预测一对线条和权重核图。低分辨率核图用于以半分辨率合成运动模糊片段,跨越相应的输入帧。

运动预测模型负责预测沿线段的两个空间积分的参数,这两个空间积分近似于定义在相应时间间隔内通过每个运动模糊输出像素看到的颜色平均的时间积分。我们使用基于 [Brooks 和 Barron 2019] 的模型,并进行了进一步修改,改善了性能和图像质量之间的权衡,使我们能够在移动设备上适应合理的内存和计算预算。

他们的数学公式可预测给定图像对 k 中每个输入帧 i 的权重图 W i W_i Wi W i W_i Wi 有 N = 17 个通道,这些通道用于对沿预测线段的每个相应纹理样本进行加权。我们通过仅预测单个通道来简化该模型,该通道用于对来自每个输入帧的积分结果进行加权。图 2 展示了一个灰度图示例,显示出网络预测在输入图像的各处权重大致相等,除了在遮挡区域,在这些区域权重偏向于两个输入之一的结果。这种简化显著降低了系统复杂性和内存使用量,并使网络能够将更多的能力用于预测线段。

  • 图 6
    在这里插入图片描述
    运动预测模型斜坡函数消融。(a)从单个输入图像对合成的运动模糊移动火车的渲染图。火车前部的运动模糊特写以及相应的输入图像对,上面覆盖了表示预测线段的向量场可视化,分别在(b)和(c)中使用模型 “我们的消融(Ours-abl.)” 和 “我们的(Ours)”,即分别在没有和有斜坡函数的情况下。在图像(b)- 左图中,蓝色箭头表示运动模糊轨迹的整个跨度,红色箭头展示了在模糊轨迹中间最明显的间隙不连续性。

此外,我们消除了由于预测线段端点误差 [Zhang 等人,2016] 所导致的伪影,这些伪影会使线段在跨越的时间间隔末端无法完美衔接,从而在模糊轨迹中间产生非常明显的伪影,如图 6 所示。为避免这一问题,我们通过一个归一化的递减线性斜坡函数 wn 进一步对输入图像纹理样本进行缩放,该函数更倾向于靠近输出像素的样本,并沿着每条预测线段逐渐降低较远样本的权重。对于输入帧对 k,输出像素 (x,y) 的强度为

I k ( x , y ) = ∑ i ∈ k , k + 1 W i ( x , y ) ∑ n = 0 N − 1 w n ∑ n = 0 N − 1 w n I i ( x i n , y i n ) (6) I_{k}(x, y) = \sum_{i\in{k,k+1}} \frac{W_i(x,y)}{\sum_{n=0}^{N-1} w_n} \sum_{n=0}^{N-1} w_n I_{i}(x_{in}, y_{in}) \tag{6} Ik(x,y)=ik,k+1n=0N1wnWi(x,y)n=0N1wnIi(xin,yin)(6)

其中, w n = 1 − n / N w_n = 1 - n/N wn=1n/N, 采样位置定义如下:

x i n = x + ( n N − 1 ) Δ i x ( x , y ) , y i n = y + ( n N − 1 ) Δ i y ( x , y ) x_{in} = x + (\frac{n}{N-1}) \Delta_{i}^{x}(x, y), \quad y_{in} = y + (\frac{n}{N-1}) \Delta_{i}^{y}(x, y) xin=x+(N1n)Δix(x,y),yin=y+(N1n)Δiy(x,y)

我们还对网络架构进行了如下修改。首先,我们将各处的带泄漏修正线性单元(Leaky ReLU)卷积激活函数全部替换为参数化的修正线性单元(ReLU)[He 等人,2015],其中斜率系数是可学习的。接下来,为了避免常见的棋盘格伪影 [Odena 等人,2016],我们将 2 倍重采样层替换为使用平均池化进行下采样,以及双线性上采样后接一个 2×2 卷积。这就得到了在后面分析的标记为 “Ours - large” 的模型。此外,为了改善浮点运算次数、参数数量和感受野之间的平衡,我们进一步将 U - Net 模型拓扑结构减少到仅 3 层,其中每层都使用 1×1 卷积,接着是一个包含 4 个 3×3 卷积层的残差网络(ResNet)块 [He 等人,2016]。这样就得到了一个标记为 “Ours” 的模型,其可学习参数显著减少。
如图 6 所示,斜坡函数 w n w_n wn 对我们所学习的单权重模型有显著益处,因为它使得预测线段在每个输入图像中跨越空间,等同于对整个时间间隔进行积分。当我们的模型在去掉这个项的情况下进行训练,得到 “Ours - abl.” 模型时,网络预测的线段在每一侧大约跨越时间间隔的一半,导致在模糊轨迹中间出现明显的不连续性。更多示例可在后面章节提供的模型比较分析中找到。

Rendering

运动预测网络输出的线条和权重核图由渲染器使用,以合成运动模糊图像。渲染器在 OpenCL 内核中实现,它在移动设备的 GPU 上运行效率非常高,在自适应地对半分辨率输入图像进行纹理采样时利用了硬件纹理单元(纹理样本数量 N 与预测线向量的长度成比例调整)。运动预测和渲染迭代可以每次针对一对输入帧进行,从而产生分段线性运动模糊轨迹。通过使用双线性纹理查找,核图从低分辨率上采样到半分辨率。

样条插值。分段线性运动插值可能会在运动轨迹中引入锯齿状的视觉伪影。为了更平滑地对运动进行插值,我们使用三次埃尔米特样条对帧间推断出的瞬时流 Δ𝑖 进行插值。

通过构建一个与(Δ𝑖⁺ + Δ𝑖⁻)平行的向量𝐻(Δ𝑖⁺, Δ𝑖⁻) 来推断每个像素处的瞬时流量𝛿𝑖,其大小等于 |Δ𝑖⁺| 和 |Δ𝑖⁻| 的调和平均数。上标 “⁺” 和 “⁻” 分别表示时间方向。如果 Δ𝑖⁺和 Δ𝑖⁻与直线路径偏离一个角度𝜃,对于较小的角度偏差(<90°),该向量会进一步按(𝜃/sin𝜃)的比例进行缩放,对于较大的偏差(路径急剧折回的地方),这种调整会逐渐回归到零,以避免出现奇异点。这些校正因子减少了过冲,并使参数样条曲线在中等曲率区域的速度更加稳定。

δ i = H ( Δ i + , Δ i − ) ( θ / sin ⁡ ( θ ) ) × { 1 θ ≤ π / 2 1 − ( 2 θ / π − 1 ) 4 θ > π / 2 (7) \delta_i = H(\Delta_{i}^{+}, \Delta_i^{-})(\theta / \sin(\theta)) \times \left\{\begin{matrix} 1 & \theta \leq \pi/2 \\ 1 - (2\theta/\pi - 1)^{4} & \theta > \pi/2 \end{matrix}\right. \tag{7} δi=H(Δi+,Δi)(θ/sin(θ))×{11(2θ/π1)4θπ/2θ>π/2(7)

对于输出位置(x,y)处图像 I k I_k Ik 在区间 [k…k+1] 上的累积模糊,我们求解一个满足四个约束条件的参数化二维三次样条路径 ρ ( x , y , t ) \rho(x,y,t) ρ(x,y,t)

  • ρ ( x , y , 0 ) = ( x , y ) \rho(x, y, 0) = (x, y) ρ(x,y,0)=(x,y)
  • ρ ( x , y , 1 ) = ( x , y ) + Δ i + ( x , y ) \rho(x, y, 1) = (x, y) + \Delta_i^{+}(x, y) ρ(x,y,1)=(x,y)+Δi+(x,y)
  • ρ ′ ( x , y , 0 ) = δ i ( ρ ( x , y , 0 ) ) \rho'(x, y, 0) = \delta_i(\rho(x, y, 0)) ρ(x,y,0)=δi(ρ(x,y,0))
  • ρ ′ ( x , y , 1 ) = δ i + 1 ( ρ ( x , y , 1 ) ) \rho'(x, y, 1) = \delta_{i+1}(\rho(x, y, 1)) ρ(x,y,1)=δi+1(ρ(x,y,1))

然后,我们通过在参数空间中均匀采样来沿着这条路径累积模糊,并对每个样本的权重进行归一化,以补偿图像空间中的非均匀空间采样,从而确保沿着运动轨迹的空间亮度均匀。在突发序列的端点处,我们通过尝试保持流经这些端点的流的曲率来外推第一帧和最后一帧之外的流。如图 7 所示:如果 “C” 表示突发序列中的最后一帧,那么在 “下一” 帧 D 处的运动轨迹位置是通过将 A 点关于平分 BC 的直线进行反射(构造出 A’)来外推的,然后将 CA’ 的大小限制为 | BC | 以形成 CD。接着,从点 {B,C,D} 推断出 C 处的流。

帧累积, 在实际中,模糊是通过多次遍历进行累积的:每对帧进行两次遍历,其权重在一帧和下一帧之间呈线性下降。对于在帧 I i I_{i} Ii 中位置为 p 的输出像素,通过使用上述的流样条来确定在相对时间 t 下帧 I i I_{i} Ii 中的投影位置 p’,从而累积帧 I i I_{i} Ii I i + 1 I_{i+1} Ii+1 之间的模糊。对于突发序列中的 K 对帧,计算 2K 次这样的遍历(K 次向前,K 次向后)并求和以得到最终的模糊结果。对于每个时间方向:

I ( x , y ) = ∑ i = 0 K − 1 ∑ n = 0 N − 1 I i ( ρ i ( x , y , t n ) ) ∣ ρ i ′ ( x , y , t n ) w n ∣ (8) I(x, y) = \sum_{i=0}^{K-1}\sum_{n=0}^{N-1} I_{i}(\rho_i(x,y,t_n)) \left | \rho_i^{'}(x,y,t_n) w_n \right| \tag{8} I(x,y)=i=0K1n=0N1Ii(ρi(x,y,tn)) ρi(x,y,tn)wn (8)

软伽马色彩空间。非常明亮的高光(例如汽车前灯)往往会使相机传感器饱和,即使在线性色彩空间中进行处理,其模糊的运动轨迹也会变得不真实地暗淡。这种截断是由于输入传感器的有限范围造成的,并且当被截断的输入高光能量分布(即合成地进行运动模糊)在许多输出像素上时,亮度损失会变得明显。

为了解决这个限制,我们在一个有意的非线性色彩空间中处理模糊,在区间 [0…1] 上使用一个可逆的类似伽马的 “软伽马” 函数

这会朝着与线性到 sRGB 色彩转换相反的方向调整亮度曲线,强调高光而不压暗阴影,使得非线性帧能够以可用的保真度存储在 16 位缓冲区中。在创建时,使用 k = 3.0 k=3.0 k=3.0 的值将该函数应用于扭曲下采样的 2 倍缓冲区,并且在累积所有帧的模糊后(通过再次应用 k = 1.0 / 3.0 k=1.0/3.0 k=1.0/3.0)进行反转。

γ s ( v ) = v v + ( 1 − v ) k ≈ v k (9) \gamma_s(v) = \frac{v}{v + (1-v)k} \approx v^{k} \tag{9} γs(v)=v+(1v)kvvk(9)

Compositing

合成的模糊图像以半分辨率计算,以满足设备内存和延迟约束。因此,即使模糊图像中完全对齐的零运动区域,由于以半分辨率计算的结果进行上采样,也会丢失细节。为了保留细节,我们将模糊图像与最大锐度的常规曝光图像进行合成,在我们期望物体清晰的地方。有两类内容需要这种保护:1)静止的场景内容;2)语义上重要且几乎没有移动的主体。

对于第一类,我们生成一个在整个帧对集合中运动非常小的像素的掩码。

  • (1)计算所有帧对中每个像素的最大运动幅度 |𝐹|。
  • (2)计算一个参考运动幅度 |𝐹|_ref,它实际上是 |𝐹| 中所有像素的稳健最大值(即第 99 百分位数)。
  • (3)重新缩放并截断每个像素的运动幅度,使得任何低于𝛼|𝐹|ref 的值被映射为 0,任何高于𝛽|𝐹|ref 的值被映射为 1。我们分别使用 0.16 和 0.32 作为𝛼和𝛽的值。

M f l o w = ∣ F ∣ − α ∣ F ∣ r e f β ∣ F ∣ r e f − α ∣ F ∣ r e f M_{flow} = \frac{|F| - \alpha |F|_{ref}}{\beta |F|_{ref} - \alpha |F|_{ref}} Mflow=βFrefαFrefFαFref

  • (4) 使用清晰图像作为引导应用双边模糊,以确保在 M f l o w M_{flow} Mflow 中的任何边缘对应于真实边缘,并在流场不可靠的地方(例如,像天空这样的均匀或无纹理区域)最小化伪影

第二类更加复杂,它背离了光学运动模糊的物理行为而倾向于美学。例如,如果一个场景中有两个主体以不同的轨迹移动,那么就不可能同时在两者上都清晰对齐。即使是单个主体,由于主体内部的运动(例如,面部表情的变化等)也可能无法对齐。一个主体面部模糊的图像是(不好的)模糊图像。我们的解决方案是重用前面描述的语义面部信号,修改为只包括在对齐的参考帧中具有低平均特征运动的面部。

最终的效果图例:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/58729.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Swift雨燕蜂窝无线通信系统介绍

本文博客链接:jdh99-CSDN博客,作者:jdh,转载请注明. 1. 概述 物联网小无线通信技术众多&#xff0c;其中大多是小范围小规模的无线通信技术&#xff0c;而行业难点是如何做到广覆盖、大容量、低功耗。 针对以上难点&#xff0c;宏讯物联研发了Swift雨燕蜂窝无线通信技术&…

基于双向长短期记忆网络(BiLSTM)的时间序列数据预测,15个输入1个输出,可以更改数据集,MATLAB代码

1. 数据收集与预处理 数据清洗&#xff1a;处理缺失值、异常值等。特征工程&#xff1a;提取有助于预测的特征。数据标准化&#xff1a;将时间序列数据标准化&#xff0c;使其具有零均值和单位方差&#xff0c;有助于模型训练。滑动窗口划分&#xff1a;将时间序列数据划分为多…

VMware Workstation 17.0虚拟机安装Ubuntu Server 22.04.5 LTS并配置SSH与XFTP详细过程

文章目录 一、安装VMware虚拟机二、在虚拟机中安装Ubuntu1、下载镜像文件2、“创建新的虚拟机”操作过程3、首次进入虚拟机的初始化配置 三、连接SSH1、下载XShell软件2、使用XShell连接虚拟机服务器 四、连接XFTP1、下载XFTP软件2、使用XFTP连接虚拟机服务器 一、安装VMware虚…

【Linux】编辑器vim 与 编译器gcc/g++

目录 一、编辑器vim&#xff1a; 1、对vim初步理解&#xff1a; 2、vim的模式&#xff1a; 3、进入与退出&#xff1a; 4、vim命令模式下的指令集&#xff1a; 移动光标&#xff1a; 删除&#xff1a; cv&#xff1a; 撤销&#xff1a; 其他&#xff1a; 5、vim底行模…

【单峰序列】

题目 代码 #include <bits/stdc.h> using namespace std;const int mod 1000000007;//快速幂求2的x次方 long long f(int x) {long long ans 1;long long base 2;while (x) {if (x % 2 1) {ans (ans * base) % mod; }base (base * base) % mod;x / 2; }return an…

开源 AI 智能名片 2+1 链动模式 S2B2C 商城小程序与私域流量圈层

摘要&#xff1a;本文探讨了私域流量圈层的特点以及其在当今时代的重要性&#xff0c;分析了开源 AI 智能名片 21 链动模式 S2B2C 商城小程序源码在私域流量圈层构建中的作用&#xff0c;阐述了产品在圈层时代被标签化的现象&#xff0c;并以实例展示了如何利用该小程序源码打造…

Django+websocket实现一个简单聊天

WebSocket是一种在单个TCP连接上进行全双工通信的协议。它由IETF在2011年定为标准RFC 6455&#xff0c;并由RFC7936补充规范&#xff0c;同时WebSocket API也被W3C定为标准。 1、定义与原理 WebSocket是独立的、创建在TCP上的协议&#xff0c;它使用HTTP/1.1协议的101状态码进…

Unreal5从入门到精通之如何解决在VR项目在头显中卡顿的问题

前言 以前我们使用Unity开发VR,Unity提供了非常便利的插件和工具来做VR。但是由于Unity的渲染效果不如Unreal,现在我们改用Unreal来做VR了,所有的VR相关的配置和操作都要重新学习。 今天就来总结一下,我在开发VR过程中碰到的所有问题。 1.编辑器,以VR运行 默认运行方式…

Python毕业设计选题:基于django+vue的宠物寄养平台的设计与实现

开发语言&#xff1a;Python框架&#xff1a;djangoPython版本&#xff1a;python3.7.7数据库&#xff1a;mysql 5.7数据库工具&#xff1a;Navicat11开发软件&#xff1a;PyCharm 系统展示 1. 前台系统功能模块 系统首页界面 用户注册界面 用户登录界面 宠物商城界面 宠物店…

第三届北京国际水利科技博览会将于25年3月在国家会议中心召开

由中国农业节水和农村供水技术协会、北京水利学会、振威国际会展集团等单位联合主办的第三届北京国际水利科技博览会暨供水技术与设备展&#xff08;北京水利展&#xff09;将于2025年3月31日至4月2日在北京•国家会议中心举办&#xff01; 博览会以“新制造、新服务、新业态”…

使用web.dev提供的工具实现浏览器消息推送服务

文章目录 前言实现工具和效果实现原理实现过程前端接收用户订阅请求将用户订阅信息更新到后端后端实现接收并保存订阅信息的接口后端实现消息推送的逻辑前言 对于电商独立站来说,新品上架或者促销活动上线及时通知到用户是很重要的,通知的渠道有很多,其中就包括浏览器消息推…

掌握AI Prompt的艺术:如何有效引导智能助手

开头叙述&#xff1a; 在人工智能的世界里&#xff0c;Prompt&#xff08;提示&#xff09;是沟通人类意图与机器理解之间的桥梁。它不仅是一串简单的文字&#xff0c;而是一把钥匙&#xff0c;能够解锁AI模型的潜力&#xff0c;引导它们执行复杂的任务。本文将探讨Prompt的重…

深度学习优化器【学习率调整和梯度修正,Optimizer】

文章目录 一、学习率调整1 余弦退火&#xff08;1&#xff09;Warm up&#xff08;2&#xff09;Cosine Anneal 2 AdaGrad3 RMSprop算法4 AdaDelta算法 二、梯度估计修正1 动量法2 Nesterov加速梯度3 Adam修正的原因 4 AdamW 三、总结参考资料 在当今快速发展的人工智能领域&am…

运算符重载详解,日期类型的实现

一、运算符重载 当运算符被⽤于类类型的对象时&#xff0c;C语⾔允许我们通过运算符重载的形式指定新的含义。C规定类类型对象使⽤运算符时&#xff0c;必须转换成调⽤对应运算符重载&#xff0c;若没有对应的运算符重载&#xff0c;则会编译报错。 类中含有多种变量&#xff0…

什么是FUSE用户态文件系统

零. 文件系统 1. 为什么要有文件系统 文件系统是操作系统中管理文件和目录的一种机制。它提供了组织、存储、检索和更新文件的方法&#xff0c;主要如下&#xff1a; 数据组织&#xff1a;文件系统将数据组织成文件和目录&#xff0c;使用户能够更方便地管理和查找文件。每个…

HarmonyOS 5.0应用开发——音频播放组件的封装

【高心星出品】 文章目录 音频播放组件的封装开发步骤封装类代码测试代码 音频播放组件的封装 鸿蒙中提供了AVPlayer来实现音频播放的功能&#xff0c;播放的全流程包含&#xff1a;创建AVPlayer&#xff0c;设置播放资源&#xff0c;设置播放参数&#xff08;音量/倍速/焦点模…

KPRCB结构之ReadySummary和DispatcherReadyListHead

ReadySummary: Uint4B DispatcherReadyListHead : [32] _LIST_ENTRY 请参考 _KTHREAD *__fastcall KiSelectReadyThread(ULONG LowPriority, _KPRCB *Prcb)

【染色时间】

题目 代码 #include <bits/stdc.h> using namespace std; #define x first #define y second typedef pair<int,int> PII; const int N 510; int dx[] {0,0,-1,1}, dy[] {-1,1,0,0}; int d[N][N], w[N][N]; int n, m; void bfs() {memset(d, 0x3f, sizeof d);q…

Apache Dubbo (RPC框架)

本文参考官方文档&#xff1a;Apache Dubbo 1. Dubbo 简介与核心功能 Apache Dubbo 是一个高性能、轻量级的开源Java RPC框架&#xff0c;用于快速开发高性能的服务。它提供了服务的注册、发现、调用、监控等核心功能&#xff0c;以及负载均衡、流量控制、服务降级等高级功能。…

利用钉钉与金蝶云星空进行付款单自动化集成

钉钉数据集成到金蝶云星空&#xff1a;付款申请单下推生成付款单的技术实现 在企业日常运营中&#xff0c;数据的高效流转和准确处理是业务顺利进行的关键。本文将分享一个具体的系统对接集成案例&#xff1a;如何将钉钉平台上的付款申请单&#xff0c;通过轻易云数据集成平台…