Abstract
当相机指向强光源时,生成的照片可能包含镜头眩光伪影。 耀斑以多种形式出现(光晕、条纹、渗色、雾霾等),这种外观的多样性使得去除耀斑变得具有挑战性。 现有的分析解决方案对伪影的几何形状或亮度做出了强有力的假设,因此仅适用于一小部分耀斑。 机器学习技术已在消除其他类型的伪像(例如反射)方面取得了成功,但由于缺乏训练数据,尚未广泛应用于耀斑消除。 为了解决这个问题,我们根据经验或使用波动光学对耀斑的光学原因进行明确建模,并生成耀斑损坏和干净图像的半合成对。 这使我们能够首次训练神经网络来消除镜头眩光。 实验表明,我们的数据合成方法对于准确去除眩光至关重要,并且使用我们的技术训练的模型可以很好地推广到不同场景、照明条件和相机的真实镜头眩光。
1. Introduction
强光源场景的照片通常会出现镜头眩光,这是一种由相机内意外反射和散射引起的明显视觉伪影。 耀斑伪影可能会分散注意力、减少细节并遮挡图像内容。 尽管在光学设计方面付出了巨大努力来最大限度地减少镜头眩光,但即使是很小的光源,在消费类相机成像时仍然会产生大量伪影。
耀斑图案取决于镜头的光学器件、光源的位置、制造缺陷以及日常使用中积累的划痕和灰尘。 镜头眩光根本原因的多样性导致其表现形式的多样性。 如图 1 所示,典型的伪像包括光晕、条纹、亮线、饱和斑点、渗色、雾霾等。 这种多样性使得清除耀斑的问题变得极具挑战性。
强光源照片中经常出现镜头眩光伪影。 它们表现出各种各样的形状和颜色,这使得它们很难用现有的方法去除。
大多数现有的镜头眩光去除方法 [1,3,24] 并没有考虑耀斑形成的物理原理,而是简单地依赖模板匹配或强度阈值来识别和定位伪影。 因此,它们只能检测并可能消除有限类型的耀斑,例如饱和斑点,并且在更复杂的现实场景中效果不佳。
尽管深度神经网络不断涌现,但基于学习的耀斑消除似乎还没有成功的尝试。 是什么让这个问题如此困难?
主要挑战是缺乏训练数据。 收集大量带有或不带有镜头眩光的完美对齐的图像对,往好里说是乏味的,往坏了说是不可能的:相机和场景需要是静态的(考虑到大多数镜头光晕发生在室外并涉及阳光,这是一个特别困难的要求) ),并且需要某种机制来“切换”伪像,而不改变场景的照明。 这可以通过收集在三脚架上拍摄的多对图像来完成,其中摄影师在一张图像中手动将遮挡物放置在光源和相机之间。 但这种方法过于劳力密集,无法生成训练神经网络通常所需的数千或数百万个图像对。 此外,这种方法仅在引起眩光的光源位于相机视野之外时才有效(例如图 7 中的真实场景),这限制了其实用性。
为了克服这一挑战,我们建议生成基于物理原理的半合成数据。 我们进行的关键观察是,镜头眩光是底层图像之上的附加层,并且它是由散射或内反射引起的。 对于散射情况(例如划痕、灰尘、其他缺陷),我们构建了一个波动光学模型,我们证明该模型非常接近现实。 对于镜头元件之间的意外反射,我们采用严格的数据驱动方法,因为商用相机的准确光学模型通常不可用。 通过这种公式,我们能够生成一个大型且多样化的半合成耀斑损坏图像数据集,并与地面真实的无耀斑图像配对。
另一个挑战是消除眩光,同时保持可见光源完好无损。 即使使用我们的半合成数据,这也很困难,因为我们无法在不影响其引起的耀斑的情况下将光源与仅耀斑层分开。 因此,如果训练天真,网络将尝试去除光源和耀斑,从而导致不切实际的输出。 为此,我们提出了一个忽略光源区域的损失函数,以及一个在输出中保留光源的后处理步骤。
为了展示我们的数据集和程序的有效性,我们训练了两个最初为其他任务设计的不同的卷积神经网络。 在训练期间,我们最小化预测的无耀斑图像和残差(即推断的耀斑)的损失函数。 在测试时,网络只需要使用标准相机拍摄的单个 RGB 图像,并且能够消除各种场景中不同类型的眩光。 尽管专门针对半合成数据进行训练,但这两种模型都可以很好地推广到现实世界的图像。 据我们所知,这是第一个从单个图像中消除镜头眩光的通用方法。
我们的代码和数据集可在 https://yi Chengwu.github.io/flare-removal/ 上公开获取。
2. Related work
现有的耀斑消除解决方案分为三类:(a) 旨在减轻耀斑存在的光学设计,(b) 尝试捕获后增强的纯软件方法,以及 (c) 捕获附加信息的硬件-软件解决方案。
Hardware solutions
高端相机的镜头通常采用复杂的光学设计和材料来减少眩光。 由于将每个玻璃元件添加到复合透镜中以提高图像质量,因此光从其表面反射以产生耀斑的可能性也增加了。 一种广泛使用的技术是在镜头元件上涂上抗反射 (AR) 涂层,从而通过相消干涉来减少内反射。 然而,这种涂层的厚度只能针对特定的波长和入射角进行优化,因此不可能是完美的。 此外,在所有光学表面添加增透膜的成本很高,并且可能会妨碍或干扰其他涂层(例如防刮擦和防指纹)。
Computational methods
已经提出了许多后处理技术来消除耀斑。 反卷积已用于消除 X 射线成像 [7, 21] 或 HDR 摄影 [19] 中的眩光。 这些方法主要取决于耀斑的点扩散函数不会随空间变化的假设,但这通常是不正确的。 其他解决方案[1,3,24]采用两阶段过程:根据镜头眩光的独特形状、位置或强度(即通过识别饱和区域)检测镜头眩光,然后使用修复来恢复眩光区域后面的场景 [5]。 这些解决方案仅适用于有限类型的耀斑(例如亮点),并且容易将所有明亮区域错误分类为耀斑。 此外,这些技术将每个像素分类为“耀斑”或“非耀斑”,忽略了大多数镜头耀斑更好地建模为底层场景之上的半透明层的事实。
Hardware–software co-design
研究人员使用计算成像来去除耀斑,其中相机硬件和后处理算法是结合设计的。 塔瓦拉等人[23] 和 Raskar 等人[18]尝试使用结构化遮挡掩模选择性地阻挡引起耀斑的光,并使用直接-间接分离或基于光场的算法恢复无耀斑场景。 虽然优雅,但它们需要特殊的硬件,因此实用性受到限制。
Learning-based image decomposition
虽然不存在基于学习的耀斑去除技术,但最近的许多工作将学习应用于类似的应用,例如反射去除 [6, 15, 27]、雨水去除 [17, 25] 和去噪 [2]。 这些方法试图通过训练神经网络将图像分解为“干净”和“损坏”的部分。 他们的成功在很大程度上依赖于高质量的特定领域的训练数据集,这是这项工作首次尝试解决的问题。
3. Physics of lens flare
理想的相机在对焦时应该将来自点光源的所有光线折射并会聚到传感器上的单个点。 在实践中,真实的镜头会沿着非预期的路径散射和反射光线,从而导致耀斑伪影 [12],如图 2(a) 所示。 散射和反射部分仅构成每条入射光线的一小部分。 因此,尽管耀斑无处不在,但在大多数照片中却难以察觉。 但是,当强光源比场景的其余部分(例如太阳)亮许多数量级时,来自该亮光的一小部分散射和反射光线将导致图像上其他像素处出现可见的伪影。 灰尘和划痕的散射几何形状以及多次反射的几何形状产生了特有的视觉图案。 在较高层次上,耀斑可分为两大类:散射引起的和反射引起的。
相机的目的是将来自点光源的光精确地聚焦在传感器上的一点上(灰色光线)。然而,灰尘和划痕可能会导致散射(模糊光线),导致雾霾和明亮的条纹“放射”。此外,内部反射(橙色光线)可以发生在透镜元件的光学表面之间(只显示一个元件),导致圆盘状或弧形的亮点。这种反射耀斑也可能有色彩,因为抗反射涂层只阻挡某些波长。
Scattering flare散射耀斑
虽然理想的镜片是 100% 折射的,但真正的镜片有许多缺陷,会导致光散射。 散射(或衍射)可能是由于制造缺陷(例如凹痕)或正常磨损(例如灰尘和划痕)造成的。 结果,除了被折射的主光线之外,第二组光线被散射或衍射,而不是遵循其预期路径。 虽然灰尘增加了彩虹般的效果,但划痕会产生看起来从光源放射状“发射”的条纹。 散射还可能降低光源周围区域的对比度,导致外观模糊。
Reflective flare反射光斑
在实际的透镜系统中,每个空气-玻璃界面都会产生少量反射(通常约为 4%)。 经过偶数次反射后,光线可能会击中传感器的非预期位置,形成反射图案。 即使我们假设光恰好反射两次,对于包含 n 个光学元件的镜头模块(现代相机的 n ≈ 5),也有 2n 个光学表面,因此有 n(2n − 1) 个潜在的引起耀斑的组合。 在图像上,这些反射耀斑通常位于连接光源和主点的直线上。 它们对光源的入射角敏感,如图 4(b) 所示,但对绕光轴的旋转不敏感。 耀斑的形状取决于孔径的几何形状、大小和位置,这可能会多次部分阻挡反射,从而导致弧形伪影。 正如第 2 节中提到的。 2、增透膜可用于减少反射——通常将空气-玻璃界面处的反射减少到 1% 以下。 然而,这种涂层的有效性还取决于波长,因此镜头光晕可能会呈现出多种色调(通常是蓝色、紫色或粉色)。 需要注意的是,反射耀斑取决于镜头设计,因此具有相同设计的相机(例如所有 iPhone 12 主摄像头模块)在对同一场景成像时预计会产生类似的反射耀斑。
Challenges in flare removal
不同类型的耀斑通常很难明显地区分或分开。 观察到的耀斑的外观可能会根据光源的属性(例如位置、大小、强度和光谱)和镜头的属性(例如设计和缺陷)而显着变化。 由于这些原因,构建完全基于物理的算法来分析识别和消除每种类型的耀斑是不切实际的,特别是当同一图像中存在多个伪影时。 因此,我们提出了一种数据驱动的方法。
4. Physics-based data generation
与监督环境中的许多视觉问题不同,很难获得耀斑损坏和无耀斑图像对的数据集。 结果,我们建立了一个物理真实的半合成管道。
光的加性本质意味着我们可以将耀斑建模为“理想”图像之上的加性伪影——“理想”光线强度的降低可以忽略不计。 我们将首先解释如何建模和生成散射和反射耀斑,然后使用它们来合成耀斑损坏和无耀斑图像对。
4.1. Scattering flare
Formulation
在薄透镜近似下,光学成像系统可以通过复值光瞳函数 P(u, v) 来表征:一个二维场,描述孔径平面上的每个点 (u, v) 的透镜对振幅的影响 和波长为 λ 的入射波的相位:
这里,A 是孔径函数,是表示入射波振幅衰减的光学特性。在最简单的形式中,孔径为有限半径 r 的相机的孔径函数为
方程中的 φλ 图 1 描述了相移,它取决于波长以及光源的 3D 位置 (x, y, z)。 省略孔径坐标(u,v),φλ可写为:
其中线性项 φS 由入射角决定,散焦项 φDF 取决于点光源的深度 z。 一旦完全指定,方程中的光瞳函数 P 就可以得到。 1 可用于通过傅里叶变换计算点扩散函数(PSF)[8]:
根据定义,它是具有光圈函数A的相机在(x,y,z)处形成的点光源的图像。这就是我们想要的耀斑图像。
Sampling PSFs
为了模拟镜头上的灰尘和划痕,我们在方程式 1 中的简单光圈函数 A 中添加了随机大小和透明度的点和条纹。 2.我们的程序产生的合成孔径示例如图3(a)所示,详细信息包含在附录中。 我们总共生成 125 个不同的光圈。
对于位置(x, y, z)具有单一波长λ的给定点光源,可以确定地计算公式3中的两个相移项。因此,该光源的PSFλ可以通过将A和φλ代入式4来确定。
为了模拟整个可见光谱的光源,我们以5nm的间隔对从380nm到740nm的所有波长λ进行PSFλ采样,从而在PSF的每个像素处获得73向量。然后将全光谱PSF与光谱响应函数SRF(一个3 × 73矩阵)相乘,得出RGB传感器测量的PSF:
式中(s, t)为图像坐标。这产生了一个耀斑图像的光源位于(x, y, z)。
为了构建我们的散射耀斑数据集,我们随机采样孔径函数A,光源的3D位置(x, y, z)和光谱响应函数SRF(详细信息可在附录中找到)。我们进一步应用光学畸变(如枪管和针垫)来增强PSFRGB图像。最终输出的一个示例如图3(b)所示。我们总共生成了2000张这样的图片。
4.2. Reflective flare
反射耀斑组件很难通过渲染技术模拟[10,14],因为它们需要精确的光学特性,而这通常是不可用的。然而,相似设计的镜头具有相似的内部反射路径,因此从相机的一个实例收集的数据通常可以很好地推广到其他类似的实例。
我们在由明亮光源、可编程旋转台和f = 13mm镜头(相当于35mm)的固定光圈智能手机相机组成的实验室环境中捕捉反射耀斑的图像,如图4(a)所示。在捕获期间,设置与环境光绝缘。
相机以编程方式旋转,使光源跟踪(并延伸超出)对角线视野,从−75◦到75◦。我们捕获一个HDR图像每0.15◦,产生1000个样本。然后使用[16]帧插值算法对相邻捕获进行2x插值,得到2000张图像。在训练期间,图像通过随机旋转进一步增强,因为反射耀斑是围绕光轴旋转对称的。
4.3. Synthesizing flare-corrupted images
我们的方法包括三个步骤:1)我们通过随机合成无耀斑的自然图像和耀斑图像来生成训练输入。2)训练卷积神经网络恢复无耀斑场景(其中光源也可能被移除,这是不希望的)。3)预测完成后,将输入光源混合回输出图像。
通过在线性空间(预色调映射的原始空间,其中像素强度是可加的)中将纯耀斑图像F添加到无耀斑的自然图像I0中,生成受耀斑破坏的图像IF,如图5所示。我们还添加了随机高斯噪声,其方差从缩放的卡方分布σ2 ~ 0.01χ2中每个图像采样一次,以覆盖我们期望看到的大范围噪声水平:
无耀斑图像I0是从[27]中的24k Flickr图像中采样的,并通过随机翻转和亮度调整进行增强。由于Flickr图像已经是伽玛编码的,我们通过应用逆伽玛曲线近似线性化它们,其中γ从[1.8,2.2]均匀采样,以解释其确切值未知的事实。
仅耀斑图像F从捕获和模拟数据集中采样。在第6.2节中,我们将说明两者都是必需的。随机仿射变换(例如,缩放,平移,旋转和剪切)和白平衡被应用为额外的增强。随机化的细节见附录。
5. Reconstruction algorithm
给定耀斑损坏的图像IF∈[0,1]512×512×3,我们的目标是训练神经网络f(IF, Θ)来预测无耀斑的图像I0,其中Θ是可训练的网络权重。许多网络架构可能适合我们的任务,我们评估两种流行的网络架构。有关网络架构和我们的培训程序的更多详细信息,请参阅附录。
5.1. Losses
我们只想去除由明亮光源引起的耀斑。但是在我们的数据集中,只有耀斑的图像F同时包含耀斑和光源,因为在捕获或模拟期间物理分离两者是不切实际的。如果我们训练na¨ıvely网络,它会试图在去掉光源的情况下产生幻觉,这不是该模型的预期用途,也是对模型容量的浪费。为了防止模型在光源后面绘制场景,我们在计算损失时忽略饱和像素,并假设它们是由于光源造成的。一般来说,饱和像素是不可恢复的,并且包含很少的场景信息。
具体来说,在计算损失之前,我们用二进制饱和掩码M修改原始网络输出f(IF, Θ)。掩模M对应于输入中频亮度大于阈值的像素(在我们的实验中为0.99)。然后我们应用形态学操作,使小的饱和区域被排除在mm之外,因为它们很可能是场景或耀斑的一部分。对于M内的像素,我们将其替换为地面真值I0,以便这些区域的损失为零:
其中:表示逐元素乘法。
在训练过程中,我们最小化两种损失的总和:图像损失和耀斑损失:
图像损失LI促使预测的无耀斑图像I0在光度和感知上都接近地面真值I0。数据项是RGB值在I0和I0之间的L1损耗。通过预训练的VGG-19网络[22]输入I0和I0来计算感知项。与[27]一样,我们在选定的特征层conv1 2、conv2、conv32、conv4 2和conv5 2上惩罚Φl(I0)和Φl(I0)之间的绝对差异。综上所述,图像损失可表示为:
耀斑损失LF促使预测的耀斑与地真耀斑F相似,并用于减少预测的无耀斑图像中的伪影(第6.2节)。LF的表达式与Eq. 9相同,但将I0和I0分别替换为F和F。其中,预测的耀斑F =网络输入与被屏蔽网络输出的差值:
5.2. Post-processing for light source blending
我们的损失明确地阻止了网络在饱和区域“学习油漆”任何东西,所以它的输出可以是任意的。在实践中,它倾向于去除光源,使其与周围像素更相似,如图6(b)所示。由于这项工作的目标是去除耀斑,而不是光源,因此我们对网络输出进行后处理以添加光源。
一个关键的观察是,引起耀斑的光源在输入图像中可能是饱和的(否则它不会导致可见的耀斑)。因此,它可以很容易地根据强度来识别。为了创建一个渐进的过渡,我们在第5.1节中定义的掩码M的边界处添加羽毛来构造Mf(细节和参数在补充中)。我们使用带羽掩模在线性空间中混合输入和输出图像(如图6(d)所示):
6. Results
为了评估在半合成数据上训练的模型是如何泛化的,我们使用了三种类型的测试数据:(a)具有基础真值的合成图像(第4节),(b)没有基础真值的真实图像,以及(c)具有基础真值的真实图像。为了获得(c),我们在三脚架上捕捉一对图像,在视场外有一个明亮的光源。在一张图像中,明亮的引起耀斑的光线可以进入镜头,产生伪影。在另一幅图像中,我们小心地在光源和相机之间放置了一个遮挡物,也在视野之外(例如,镜头罩),阻挡了同样的光线。
6.1. Comparison with prior work
我们在表1和图7中提供了定量和视觉比较。为了在计算度量时消除光源的影响,根据公式7,将掩膜区域替换为地真像素。
我们评估了最近所有的火炬清除工作[1,3,24]。值得注意的是,他们都没有尝试一般的火炬清除任务。相反,他们使用手工制作的启发式方法来去除耀斑的一个特定子集(例如,眩光斑)。因此,它们对其他工件(如反射和条纹)几乎没有影响,并且导致PSNR和SSIM接近甚至与输入相同。由于雾霾和反射是两种常见的耀斑伪影,我们还在我们的数据上比较了去雾[9]和去反射[27]算法。
对于我们的方法,我们训练了两个变体,一个使用[27]的架构,另一个使用流行的UNet[20]。我们的方法明显优于现有的方法,并证明了我们的管道和数据集的重要性。我们在本文的其余部分使用U-Net变体,因为它的性能更好。
最后,我们还对20名参与者进行了用户研究,其中每个用户都获得了带有镜头光晕的真实图像以及两个预测的无光晕图像:一个来自U-Net,另一个来自5个基线之一。然后,我们要求用户确定哪一个在消除镜头光晕方面做得更好。我们使用来自3组不同的52张图像:由4.2节中相同类型的镜头拍摄的图像,使用其他5个不同焦距的镜头拍摄的图像,以及从[3]拍摄的图像。为了避免偏差,我们在研究的每个实例中对图像进行洗牌。如表2所示,我们的方法在所有3个数据集上的性能都明显优于所有其他方法。即使在Chabert[3]的数据集上,用户也强烈倾向于我们的方法(85%对15%)。不出所料,当在我们的训练集中没有出现的镜头上进行测试时,它的表现略差。
6.2. Ablation study
在本节中,我们将研究过程中的两个关键组件,以演示它们对输出的影响。
Flare loss
由于大多数耀斑比底层场景更亮,我们需要确保网络不会简单地学会使所有明亮区域变暗。我们在耀斑损失LF中明确地模拟了这一点。在图9中,我们显示了使用和不使用LF训练的模型的测试集结果。如果没有低频光,这个网络就会把明亮物体的某些部分移走,即使它们不是耀斑的一部分。
Captured and simulated flare data
在第4节中,我们提到捕获的数据主要考虑了反射耀斑,而模拟数据涵盖了散射情况。为了表明这两个成分都是必要的,我们训练了两个消融模型,每个模型都排除了一个源。正如预期的那样,仅使用捕获数据集或模拟数据集中的耀斑图像训练的模型的性能低于同时使用两种数据集训练的模型,如图10所示。
6.3. Generalization
Across scenes
由于我们的半合成数据集包含不同的耀斑模式和场景,训练后的模型可以很好地泛化各种场景类型。如图8所示,输入图像中包含不同形状、颜色和位置的耀斑,以及不同主体和光照条件的场景。该模型在大多数情况下产生高质量的输出。当输入图像中没有耀斑时,网络正确执行no-op。
Across cameras
如第4.2节所述,我们所有的反射耀斑训练图像都来自一个智能手机相机,焦距f = 13mm。我们还在排除训练的其他相机设计上测试了我们的模型。如图11所示,该模型仍然能够有效地降低镜头光晕,这与表2中用户研究的结果相呼应。
也就是说,模型的泛化程度是有限的。例如,该模型在使用非常不同的镜头拍摄的图像上表现不佳,例如鱼眼(图11,最后一栏)。这对于依赖透镜的反射组件尤其如此,如第4.2节所讨论的。领域适应完全不同的相机设计是一个有趣的途径,为未来的工作。
6.4. High-resolution images
我们的网络是在512 × 512的图像上训练的。将我们的方法应用于更高分辨率输入的最简单的方法是在期望的分辨率下进行训练(例如,2048 × 2048),这在训练和测试时都需要16倍的带宽。
幸运的是,我们可以利用镜头光晕主要是低频伪影这一事实。对于高分辨率图像,我们对输入进行双线性下采样,预测低分辨率的纯耀斑图像,对其进行双线性上采样,使其恢复到全分辨率,并从原始输入中减去它(见图12)。这使得在固定低分辨率下训练的网络可以处理高分辨率图像而不会有明显的质量损失。在Xeon E5 CPU上,当运行512 × 512的推理时,2048 × 2048输入的处理时间从8秒减少到0.55秒。
7. Conclusion
我们介绍了一种新颖的、易于处理的、物理逼真的透镜光晕模型。通过使用原则图像形成模型构建半合成数据生成管道,我们能够训练卷积神经网络从单个耀斑损坏的图像中恢复干净的无耀斑图像,而无需真实的训练数据。我们的方法被证明可以在一系列场景和相机中获得准确的结果。据我们所知,这是第一个通用的镜头光晕去除技术。