本文转载自AI科技大本营(ID:rgznai100),作者:Marc Levoy、Yael Pritch,译者:刘旭坤
【导读】随着智能手机的不断发展成熟,为了寻找差异化的厂商不断增加摄像头的数量。然而,摄像头的数量越多,就代表拍照的质量越好吗?
Google Pixel 手机一直坚持单摄,虽然硬件不算顶尖,但是凭借着强大的算法,Pixel 手机的照相水平非常突出。上个月,Pixel 3发布会的 Keynote 显示其暗光拍照的成像效果甚至完虐 iPhone XS,让人惊叹不已。
近日,Google 又为自己的相机应用增加了“Night Sight”功能(夜视功能),用户无需三脚架和闪光灯就能在夜间拍出锐利干净的照片,并获得了众多评测博主的好评。本文就将为读者介绍弱光条件下拍照的难点以及机器学习在这一问题中的应用。
01.弱光拍摄的难点
大家如果在夜晚拍过照片的话,肯定会发现拍出的照片上有很多噪点,使得照片看起来颜色和亮度都很不均匀。噪点或者叫噪声的来源有两个:散粒噪声和读取噪声。散粒噪声指进入感光元件的光子数量太少造成可观测的光子数量不均。散粒噪声的出现与我们所使用感光元件的质量没有关系,不过智能手机的感光元件太小,所以受散粒噪声影响比普通相机更大。读取噪声则是由将电信号转换成读数时的随机错误造成的。感光元件的质量越好那么读取噪声也就越小。
把所有噪声的来源都考虑进去我们可以得出一个信噪比,信噪比越高则意味着我们拍出的照片质量越好。感光元件大小不变的情况下信噪比和曝光时间成正比,所以看来只要练成铁手就能完美地解决这个问题。然而还是想简单了,就算拍摄者能长时间稳稳地举着手机被拍的对象也没法保持长时间不动。
2014年发布的 HDR+ 功能改善了散粒噪声和读取噪声的问题,不过 HDR+ 的本意如它的名字一样是为了提高照片的动态范围。HDR+ 的原理是连拍很多张照片,然后通过图像识别把多张照片进行叠加成一张照片。每张照片的曝光时间能根据用户手抖的程度和拍摄目标的移动自动调节来保证照片的锐度,这样就在保证锐度的前提下增加了曝光时间,所以照片的信噪比也能提高了。
看起来弱光拍照的问题已经完美解决了,就连拍几十张后合并成一张就行了。然而实际的情况是就算用多张照片合并的方法还是对光照有要求,光照低于一定的标准就算再多拍效果也不好。标示光源亮度的物理量是光通量,它的单位是流明。单位面积接收到的光通量叫做照度,单位是勒克斯。他们之间的关系大家可以参照压力与压强的关系来理解。为了让大家能直观地了解不同勒克斯的概念,下面表中用生活中的场景与勒克斯数值做了对比:
普通的手机相机从30 勒克斯开始就不太行了,如果使用 HDR+ 或者类似合成多张照片的技术大概能降到3 勒克斯但再低也就不行了。我们开发夜视功能的目标是让手机在 0.3 到 3 勒克斯之间不补光只按一次快门也能拍出好照片,而要实现这一目标最重要的手段就是尽可能多地捕获光子。
02.曝光时间限制和模糊问题
延长曝光时间虽然能提高信噪比拍出更干净的照片,但也同时带来了两个问题。Pixel 手机默认的拍摄模式是零快门延迟,意思是说用户一打开相机应用其实相机就开始拍照存储在缓存里了。当用户按下快门的时候手机会提取最新拍摄的 9 至 15 张相片来进行合成,这样就能保证拍到的是用户按快门的那一刻。
用户在拍照时手机会显示预览,为了维持最低 15 帧的显示刷新,HDR+ 能实现的最慢快门速度也只有 66 毫秒。所以为了进一步延长曝光时间,夜视功能改变了拍摄模式。用户使用夜视功能拍照时按下快门后相机才会开始拍摄,所以用户必须维持一小段时间尽量不动。
延长曝光带来的第二个问题是画面模糊。虽然 Pixel 2 和 Pixel 3 配备了光学防抖镜头但最多只能支持到 1/8 秒快门。Pixel 3 为了解决这一问题应用了所谓的动作测量技术,也就是使用光流法来判断画面的移动,然后再动态调整快门速度来让画面尽量清楚。Pixel 1 ?和 Pixel 2 虽然不会默认使用动作测量,不过用户开启夜视模式时它们也会使用动作测量。这样如果用户画面晃动不大的话每张照片的曝光时间最多能到 333 毫秒。这项技术也针对 Pixel 1 和使用了脚架的情况进行了优化。Pixel 1 没有光学防抖,所以快门的时间就稍微短一些而如果手机完全没有移动的话快门时间最高可达一秒。
除了快门时间,应用也会根据情况调整所拍的照片张数来减少用户等待的时间。如果使用三脚架只拍 6 张就可以合成了,若为手持则最多会拍 15 张。所以使用 Pixel 手机拍照,根据相机是前置还是后置、手持稳定性、画面稳定性和亮度的不同,合成前所拍摄的照片在 15 张 1/15 秒快门照片和 6 张 1 秒快门的照片之间。下面的图中我们可以看到一点区别:
左图我们可以看到狗头部的动作。中间图为动作测量关闭状态下拍摄,快门为 73 毫秒,能明显看到模糊。右图为动作测量开启状态下拍摄,快门为 48 毫秒,比关闭动作测量清楚一些。
下面的图是手持和三脚架拍摄的不同效果:
左图为手持拍摄,略微有抖动。拍摄了 15 张快门 333 毫秒的照片进行合成。右图为手机判断无抖动所以拍摄了 6 张快门 1 秒的照片进行合成。
03.对齐与合成
拍摄多张照片进行合成不是什么新鲜的方法,在天文和微距摄影上都有很广泛的应用。虽然原理听起来很容易,但将手持拍摄的照片对齐就很困难。我们从 2010 年就开始进行对齐与合成相关的研究,最早的成果是 iOS 平台一个叫做 Synthcam 的应用。
夜视功能的原理其实和 Synthcam 差不多,但提高了照片的分辨率。Pixel 1 和 2 中使用的 HDR+ 融合算法提高了剔除无效照片的能力,Pixel 3 中使用的超高分辨率变焦技术虽说并不是为减少噪点所开发但客观上也实现了除噪点的效果。这项技术某些条件下效果优于 HDR+ 但对计算能力要求更高,所以没有应用在 Pixel 1 和 Pixel 2 上。
04.其他难题
原理听起来挺简单,但开发夜视功能的过程中还是碰到了不少难题。
|1.弱光条件下自动白平衡失效
自动白平衡的目的是将不同色温条件下拍摄的照片都调整为白光下拍摄的颜色,否则人眼在回看照片时会发现明显的色差。
白平衡在数学上属于不适定问题。比如感光元件判断拍到的雪花是蓝色的,但无法判断雪花到底是真的蓝还是天的蓝色映在雪花上。现在的自动白平衡算法在强光条件下效果不错,但在弱光拍摄时就非常不准了。
为此我们训练了一个模型来判断照片的白平衡是否正常并作出矫正。为了训练这个模型我们使用 Pixel 手机在各种光照条件了拍了很多照片并手工对白平衡进行调整。下图中我们能看到应用模型前后的明显区别。
|2.色调映射
人眼在弱光下是分不清楚颜色的,因为只有不能判断颜色的视杆细胞才能在晚上工作。但人眼看不到并不表示到晚上颜色就没有了,所以夜视功能想超越人眼的极限必须在夜间也能拍出清晰的颜色。
下面这张图就是在夜间通过长时间曝光所拍摄的(注意天空中可以看到星星)。虽然偶尔拍拍这种把晚上拍成白天的效果也不错,但恐怕大家还是想能把晚上拍成晚上。
其实艺术家们很早就发现了让观众感觉所画的是夜间的方法,如下图所示:
画家提高画面的对比度并把阴影部分直接涂黑来营造出夜间的效果。我们也使用了类似的方法,比如使用 S 形色调映射。不过怎么把握其中的度还是挺值得思考的,下面这张用 Pixel 3 拍的照片就非常成功:
05.夜视模式的极限
当照度低于 0.3 勒克斯时手机的自动对焦功能会失效,所以我们在 Pixel 3 的夜视模式增加了两个手动对焦按钮:近和远。近模式的对焦距离约为 1.2 米,远模式则在约 3.6 米处对焦。在远模式下景深是从 1.8 米到无穷远。虽然照度低于 0.3 勒克斯也能拍出好照片,但就必须借助三脚架和第三方应用了。
那么理论上对摄影来说照度能低到什么程度呢?我想当捕捉到的光子会受到读取噪音影响时就差不多了。另外还有其他的噪声来源,比如受温度影响的暗电流,不过我可不建议大家为了降噪点把手机泡到液氮里。就算这些问题全都解决了也会有风吹树摇,超长曝光摄影还是很困难。
06.注意事项
用夜视功能拍照很有趣,如果使用得当的话能够拍出效果非常好的照片。夜视功能在 Pixel 3 上面的效果是最好的,一方面是因为它芯片速度最快,另外自动白平衡算法也是以 Pixel 3 为基础训练的。不过就算用的不是 Pixel 3 夜视功能也能让你在弱光下拍出好照片(预览里的噪点并不会出现在完成的照片上)。文章最后就给大家一些更好地使用夜视功能的注意事项吧: