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

news2024/11/26 10:37:25

这篇文章是谷歌发表在 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.coloradmin.cn/o/2236321.html

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

相关文章

测试概念以及测试bug

关于测试的概念 什么是需求&#xff1f; 需求分为用户需求和软件需求。 软件需求可以作为开发和测试工作的依据&#xff0c;而用户需求不一定是合理的&#xff0c;这里的不合理有很多的角度&#xff1a;技术角度上&#xff0c;市场需求上&#xff0c;投入成本和收益比噔噔。…

mac m1 docker本地部署canal 监听mysql的binglog日志

mac m1 docker本地部署canal监听mysql的binglog日志(虚拟机同理) 根据黑马视频部署 1.docker 部署mysql 1.docker拉取mysql 镜像 因为m1是arm架构.需要多加一条信息 正常拉取 docker pull mysql:tagm1拉取 5.7的版本. tag需要自己指定版本 docker pull --platform linux/x…

C++之旅——入门

Hello&#xff0c;各位小伙伴们&#xff0c;前几期我们学习了C语言和数据结构&#xff0c;有了一定的基础之后我们来挑战新的语言——C。 目录 一、初识C 1>C发展历史 2>C版本更新 3>C的热度 4>C的学习难度 5>C学习相关书籍 二、第一个C代码 三、C基础 …

Flutter中文字体设置指南:打造个性化的应用体验

在使用Flutter进行开发时&#xff0c;可能会遇到中文字体显示不正常或者字体不符合设计需求的情况。Flutter默认的中文字体往往无法满足某些用户对个性化和美观的需求。今天&#xff0c;我们就来详细探讨如何在Flutter应用中设置中文字体&#xff0c;并结合不同场景提供相应的解…

4.1 软件设计概要

软件设计概要 1、 软件设计的概念和设计质量1.1 软件设计基本任务1.2 设计模型1.3 软件设计特点1.4 设计质量属性1.5 设计指导原则 2、 设计相关八大概念抽象体系结构设计模式模块化信息隐藏功能独立精化重构 3、 四类设计技术概要3.1 数据设计3.2 体系架构设计体系结构组织和细…

MySQL表的增删改查(CRUD2)

美好的一天又开始了&#xff0c;大家今天有没有学习呢&#xff1f;没学的话&#xff0c;开始跟随和博主一起对MYSQL的学习吧&#xff01;&#xff01;&#xff01; 复习&#xff1a; CRUD新增1.新增 insert into 表名 [(列名[&#xff0c;列名,列名...])] values (值[,值,值.…

用接地气的例子趣谈 WWDC 24 全新的 Swift Testing 入门(三)

概述 从 WWDC 24 开始&#xff0c;苹果推出了全新的测试机制&#xff1a;Swift Testing。利用它我们可以大幅度简化之前“老态龙钟”的 XCTest 编码范式&#xff0c;并且使得单元测试更加灵动自由&#xff0c;更符合 Swift 语言的优雅品味。 在这里我们会和大家一起初涉并领略…

【案例】Excel使用宏来批量插入图片

一、场景介绍 我有一个excel文件&#xff0c;需要通过一列的文件名称&#xff0c;按照规则给批量上传图片附件。 原始文件&#xff1a; 成功后文件&#xff1a; 二、实现方法 1. 使用【wps】工具打开Excel文件&#xff0c;将其保存为启用宏的文件。 2.找到编辑宏的【VB编辑器…

Springboot项目报错记录

SpringBoot测试报错&#xff1a;Unable to find a SpringBootConfiguration, you need to use Context 该测试类所在测试包test下的包名和类路径java下的包名不一致导致的 引发以下报错 java.lang.IllegalStateException: Unable to find a SpringBootConfiguration, you need…

RabbitMQ 高级特性——消息分发

文章目录 前言消息分发RabbitMQ 分发机制的应用场景1. 限流2. 负载均衡 前言 当 RabbitMQ 的队列绑定了多个消费者的时候&#xff0c;队列会把消息分发给不同的消费者&#xff0c;每条消息只会发送给订阅列表的一个消费者&#xff0c;但是呢&#xff0c;RabbitMQ 默认是以轮询…

深度学习:bert模型

multi-headed机制 1、通过不同的head得到多个特征表达&#xff0c;一般8个head 2、将所有特征拼接在一起 3、降维&#xff0c;将Z0~Z7连接一个FC全连接实现降维 多层堆叠 位置编码 如何实现位置编码&#xff1f; &#xff08;1&#xff09;为每个时间步添加一个0-1范围内的数…

Vue实战学习(2)(Vue快速入门(快速构建一个局部Vue项目))

目录 一、Vue快速入门。 &#xff08;1&#xff09;快速入门的案例需求。 &#xff08;2&#xff09;原生js解决。 &#xff08;3&#xff09;使用Vue解决。 1、准备一个html页面。且该页面需要引入Vue模块。 2、创建Vue程序的应用实例。 3、准备html元素&#xff08;如div&…

SpringMVC学习记录(三)之响应数据

SpringMVC学习记录&#xff08;三&#xff09;之响应数据 一、页面跳转控制1、快速返回模板视图2、转发和重定向 二、返回JSON数据1、前置准备2、ResponseBody 三、返回静态资源1、静态资源概念2、访问静态资源 /*** TODO: 一个controller的方法是控制层的一个处理器,我们称为h…

Spring WebFlux 核心原理(2-3)

1、Project Reactor 高级 1.1、响应式流的生命周期 要理解多线程的工作原理以及 Reactor 中实现的各种内部优化&#xff0c;首先必须了解 Reactor 中响应式类型的生命周期。 1.1.1、组装时 流生命周期的第一部分是组装时&#xff08;assembly-time&#xff09;。 Reactor 提供…

Python爬虫与Web渗透测试入门指南——初学者防踩雷

目录 Python爬虫与Web渗透测试入门指南一、学习方向和基础知识Python爬虫学习方向Web渗透学习方向 二、具体知识点总结三、学习流程和典型案例案例1&#xff1a;Python爬虫 - 简单网页数据爬取案例2&#xff1a;Web渗透 - SQL注入漏洞检测与利用案例3&#xff1a;Python爬虫 - …

apache-seata-2.1.0 AT模式使用篇(配置简单)

最近在研究seata的AT模式&#xff0c;先在本地搭建了一个演示demo&#xff0c;看看seata是如何使用的。在网上搜的demo&#xff0c;配置相对来说都比较多。我最终搭建的版本&#xff0c;配置较少&#xff0c;所以写篇文章分享下&#xff0c;希望能帮到对seata感兴趣的小伙伴。先…

Java代码与数据库纽带——JDBC

ok&#xff0c;看了题目&#xff0c;就可以知道今天要分享的是JDBC 讲这个这之前&#xff0c;想讲讲之前的。 之前我们操作数据库基本都是通过MySQL客户端&#xff0c;进行编写sql语句来操作的。 但是我们在开发中一般都是通过代码来操控数据库的。 而且在我们日常开发中&a…

navicat pg库安装mysql fdw 外表扩展

在Windows上手动安装mysql_fdw&#xff08;MySQL Foreign Data Wrapper&#xff09;通常涉及一系列步骤&#xff0c;包括下载源码、编译、配置和测试。以下是一个详细的指南&#xff1a; 一、下载mysql_fdw源码 访问mysql_fdw的GitHub发布页面&#xff0c;选择最新版本的源码…

智能提醒助理系列-jdk8升级到21,springboot2.3升级到3.3

本系列文章记录“智能提醒助理”产品建设历程&#xff0c;记录实践经验、巩固知识点、锻炼总结能力。 本篇介绍技术栈升级的过程&#xff0c;遇到的问题和解决方案。 一、需求出发点 智能提醒小程序 当前使用的是jdk8&#xff0c;springboot2.3,升级到jdk21和springboot3.3 学…

雷军-2022.8小米创业思考-11-新零售:用电商思维做新零售,极致的效率+极致的体验。也有弯路,重回极致效率的轨道上。

第十一章 新零售 当我们说到小米模式的时候&#xff0c;其实我们说的是两件东西&#xff1a; 一是小米模式的本质&#xff0c;即高效率的商业模式&#xff1b; 另一件是小米这家公司具象的商业模式&#xff0c;这是小米在实践中摸索、建立的一整套业务模型。 从2015年到202…