专栏名称: 谷歌开发者
Google中国官方账号。汇集Android, Chrome, Angular等移动和网络开发技术、Google Play和AdMob等开发者成长、优化和变现平台。
目录
相关文章推荐
新浪科技  ·  【#OpenAI遭加拿大五大媒体起诉#,称其 ... ·  昨天  
新浪科技  ·  【#长安汽车拟2026年交付无人配送车#,# ... ·  4 天前  
虎嗅APP  ·  宠物正代替婴儿,成为家庭的宠儿 ·  6 天前  
51好读  ›  专栏  ›  谷歌开发者

PhotoScan:为冲印的照片拍摄无眩光照片

谷歌开发者  · 公众号  · 科技媒体  · 2017-05-08 12:47

正文

文 / Google 研究科学家 Ce Liu、Michael Rubinstein、Mike Krainin 及 Bill Freeman


我们发布了对 PhotoScan 的更新,这个面向 iOS 和 Android 的应用让您通过智能手机就能对冲印的照片进行数字化处理。PhotoScan 的一个关键功能是能够去除冲印照片中的眩光,对冲印的照片进行拍摄通常具有光面效果,会产生反光,就像塑料相册页面或容纳照片的玻璃包覆相框那样。为打造这项功能,我们在开发时采用独特方法将计算机视觉和图像处理技术相结合,可以细致地调整和合并几张略有差异的打印照片,将眩光从底层图像中分离出来。


▲ 左侧:一张普通数字照片的实际冲印效果。右侧:经 PhotoScan 处理后的无眩光数字输出效果

   

拍摄冲印的照片时,以自动方式确定照片的哪些区域是实际拍摄的照片,哪些区域是眩光,是一项具有挑战性的工作。不仅如此,眩光可能往往是照片中的饱和区域,这就使得眩光之下的照片内容无法显现或恢复。但如果我们移动相机对冲印的照片进行若干次拍摄,眩光的位置往往就会发生变化,覆盖的照片区域也会有所差异。我们发现,在大多数情况下都存在这种可能性:至少会有一张照片的所有像素都未被眩光覆盖。尽管在对冲印的照片进行多次拍摄时可能未获得任何无眩光照片,但我们可以通过将不同角度下拍摄的照片合并来去除眩光。难点在于,需要对这些图像进行非常准确的调整,才能获得美观的合并效果,并且这种在手机上进行的处理必须时间很短,才能提供近乎即时的体验。


▲ 左侧:拍摄的输入图像(共 5 张)。右侧:如果我们让拍摄的照片图像稳定下来,就会发现只有眩光在移动,覆盖到照片的不同部分。请注意,没有任何一幅图像是无眩光图像。    


这项技术的灵感来自我们之前在 SIGGRAPH 2015 上发布的成果,当时我们将其称为“无障碍摄影术”。这一成果利用相似原理从视野中去除各种类型的障碍。不过,我们最初提议的算法基于一种生成模型,在这种模型下,主场景和障碍层的运动和外观都是估算的。尽管该模型颇为强大,并能去除各种障碍,但其计算的资源开销过大,无法在智能手机上运行。因此,我们开发了一种更简单的模型,将眩光作为离群值对待,并且只会尝试配准底层无眩光照片。尽管该模型更简单,但任务仍颇具挑战性,因为配准需要非常准确而又稳定。



工作原理

我们从用户移动相机对冲印照片拍摄的一系列照片开始谈起。第一张照片——“基准帧”——定义所需的输出视点。随后用户按照指示再拍摄四帧照片。在额外拍摄的每一帧上,我们都检测到稀疏的特征点(我们计算 Harris 角点上的 ORB 特征),并利用它们来建立单应矩阵,将每个帧都映射到基准帧。


▲ 左侧:基准帧和每个其他帧之间检测到的特征匹配(左侧),以及依据估算的单应矩阵生成的翘曲帧(右侧)。    


尽管这项技术可能看似简单明了,但存在一个局限性:单应矩阵只能对齐平坦图像。但冲印的照片通常并不完全平坦(正如上面显示的示例所示)。因此,我们采用光流法——一种基本计算机视觉运动表示法,用于建立两幅图像之间的逐像素映射——来纠正不平整问题。我们以单应矩阵对齐帧为基础计算“流场”来翘曲图像并进一步优化配准。在下例中,请注意在仅使用单应矩阵配准帧后,左侧照片的角部的轻微“移动”情况。右侧照片显示的是利用光流法优化配准后照片对齐得到优化的效果。


▲ 使用单应矩阵获得的翘曲帧(左侧)与采用光流法做进一步翘曲优化后的翘曲帧(右侧)之间的对比。    


配准上的差异很细微,对最终结果的影响却很大。请注意微小的不重合在结果中呈现为重复图像结构的效果,以及进一步的光流优化对这些伪影的缓解效果。


▲ 采用光流法优化的眩光去除效果(右侧)与不采用光流法优化的眩光去除效果(左侧)之间的对比。在只使用单应矩阵的结果(左侧)中,请注意人物眼睛、鼻子和牙齿周围的伪影,以及织物上重复的茎和花瓣。    


在这里,难点同样是让光流法这种天生的慢速算法能够在手机上非常快速地运行。我们没有按照传统方式计算每个像素处的光流(计算的流矢量数与输入像素数相等),而是用数量更少的控制点表示一个流场,并将图像中每个像素处的运动表示为控制点处运动的函数。具体地讲,我们将每个图像分成平铺而又不重叠的单元格,形成一个粗网格,并将单元格中像素的流动表示为包含它的单元格四角流动的双线性合并。

▲ 网格光流法的网格结构。p 点表示为包含它的单元格四个角点的双线性插值。    


▲ 左侧:在其中一个帧上计算的流场图。右侧:流颜色编码:屏幕方向和大小分别以色调和饱和度表示。    


这可以显著降低待解决问题的严重程度,因为需要计算的流矢量数现在与网格点数相等,而后者通常远小于像素数。这一过程在本质上类似于 Szeliski 和 Coughlan(1997 年)介绍的样条式图像配准。采用这一算法,我们得以在 Pixel 手机上将光流计算时间缩短大约 40 倍!


▲ 单应矩阵配准帧与叠加在(干净)基准帧上的流优化翘曲帧(使用以上流场)之间的翻动图,它显示了计算的流场如何通过将图像部分与基准帧中的相应部分“对齐”来改善配准。    


最后,为了形成无眩光输出,对于已配准帧中的任何给定位置,我们都会检查像素值,然后使用软最小值算法来获得最暗的观测值。更具体地讲,我们通过为靠近(翘曲)图像边界的像素分配较小权重来计算已配准帧上最低亮度的预期值。我们之所以采用这一方法,而不是直接计算各帧的最小值,是因为各帧对应像素的亮度可能略有差异。因此,每像素最小值会因重叠图像边界处的密度骤变而产生明显的接缝。


▲ 已配准帧上的普通最小值(左侧)与软最小值(右侧)的对比。    


该算法可支持各种扫描条件——哑光和光面冲印照片、相册内部或外部照片、杂志封面。

  1. 输入          2. 已配准           3. 无眩光    


为获得最终效果,Google 相册团队开发了一种方法,这种方法可自动检测和裁剪照片区域,并将其校正为正面照。由于透视畸变的缘故,扫描的矩形照片通常在图像上呈现为一个四边形。该方法通过分析图像信号(例如颜色和边缘)计算出原始照片在扫描图像上的确切边界,然后应用几何变换对四边形区域进行校正,使其恢复原始矩形形状,从而生成高质量无眩光的数字版照片。


因此,总的说来,尽管后台的计算量相当大,但在您的手机上这些计算几乎瞬间即可完成!要试用 PhotoScan,请下载该应用的 Android 或 iOS 版。


了解更多细节,查看文内所有链接,请点击文末“阅读原文”。


点击「阅读原文」,查看文内链接