作者HawkWang。文章仅用于学术分享。

很多人咨询我,手机上到底有哪些计算摄影的应用和技术。那么接下来就准备抽空写一系列文章做一下介绍。

今天这一篇我来谈谈“光学变焦”,其实这是一个容易误导人的功能名字。因为在传统上,变焦是通过操作相机镜头上的变焦环来完成的,而在绝大多数手机上显然无法承载这么复杂的机械机构。因此手机上的光学变焦,通常是通过在不同焦距的相机之间切换来达成的。

事实上,同时拥有多种形态的摄像头在中高端手机上几乎已经成为了标配,像我下图列出的小米、华为、苹果的旗舰机,都是这样的,它们都拥有不同焦距的摄像头,当在这些摄像头之间切换时,自然也就能实现变焦的功能。

手机中的计算摄影:光学变焦_变焦

然而,如果仅仅是生硬的在摄像头之间直接切换,势必会导致图像内容的剧烈变化,这和传统相机上的平滑变焦是截然不同的。而今天所谈的手机上的“光学变焦”,则是在一系列计算摄影算法支撑下的极力模仿传统相机的平滑变焦,如下面的动图所示。


在业界,这个功能被称为SAT,全称是Spatial Alignment Transform,空间对齐变换。现在让我们捋一捋,这里面到底有哪些关键点

让我们先看看,手机上不同镜头拍摄同一个目标时,图像的表现。这里我从某个手机上分别用短焦镜头和长焦镜头获取了一对图像(为了让你明显感觉到两个图像的不同,在左图上我特意保留了大的噪声)

手机中的计算摄影:光学变焦_变焦_02

你可以看到,图像的视场角,以及目标在图像中的大小、位置都有很大的变化。如果我们直接在手机界面上切换两个镜头,那么你看到的画面会是这样的:

手机中的计算摄影:光学变焦_相机标定_03

很显然,其中的切换是突兀的。为了让画面的切换不那么突兀,我们可以先前进一小步:对短焦镜头的画面做平滑的数码中心放大,直到目标尺寸和长焦镜头的一致,然后接着继续对长焦镜头的图像平滑放大,像下面一样:


此时,你可以看到整个放大、切换的过程稍微有点平滑的意思了。但画面中美女的位置在两个相机中是不同的,使得在切换瞬间,依然有突兀的变化。于是,我们可以再前进一步,在放大的画面的同时,逐渐的平移画面中感兴趣的目标位置,使得切换瞬间两个图像中我们感兴趣的目标的位置一致,就像下面这样:


这样,是不是更有平滑变焦的感觉了?不过你肯定已经注意到了,虽然我们让模特的脸部在相机切换前后尽可能保持了位置和大小不变,但背景却出现了明显的跳变。这是很容易理解的,因为手机上不同的摄像头位于不同的位置,因此从空间上讲相机之间有平移,还有轻微的旋转。因此简单的平移图像是无法使得画面上每一个像素都对齐的。

手机中的计算摄影:光学变焦_相机标定_04

下面的示意图说明了相机之间的三维旋转关系,这种三维旋转关系比起简单的平移关系更加影响图像在切换时的对齐效果:

手机中的计算摄影:光学变焦_3d_05

如果用几何表达的话,是这样的:

手机中的计算摄影:光学变焦_相机标定_06

观察刚才的动图的切换瞬间的两帧,你可以很明显的看到图像的旋转,尤其是背景部分的旋转:

手机中的计算摄影:光学变焦_相机标定_07

所以我们不仅仅要消弭镜头的平移带来的影响,还需要消除镜头间的旋转带来的影响。最终可以做到在切换时,我们感兴趣的模特的脸部尺度一致,位置不变,而背景部分只有平移关系,而没有旋转感,就像下图一样:

手机中的计算摄影:光学变焦_相机标定_08

现在来梳理一下我们用到了哪些技术和知识点。

  • 相机标定:获取相机及图像的空间关系


手机中的计算摄影:光学变焦_3d_09

正如我在上一篇文章手机中的计算摄影1——人像模式(双摄虚化)中所描述的,双摄像头的相机标定可以获取到两个相机的内参数及外参数,从而指导后续对图像的空间变换:

手机中的计算摄影:光学变焦_相机标定_10


  • 图像的空间变换

我在文章28. 图像扭曲中介绍了图像的空间变换,如下图所示:

手机中的计算摄影:光学变焦_变焦_11

让我们看下面这个场景:

手机中的计算摄影:光学变焦_相机标定_12

那么对应到我们现在讲的功能,我们假设长焦镜头相对短焦镜头的放大倍率是2.0倍,那么整个过程就是这样的了:

手机中的计算摄影:光学变焦_相机标定_13手机中的计算摄影:光学变焦_相机标定_14

这里最关键的是我们提前算出了总的平移量和旋转量,然后将平移量和放大倍率线性关联起来,这样每放大一点,就会相应的旋转一点、平移一点,最终达到在相机的切换点,两张图像的尺度一致、关键目标的位置刚好对齐,且整个画面没有旋转感,就像下面所示:


图像质量平滑过渡

现在我们已经解决了图像主体在空间上的对齐问题,但两个摄像头通常不仅仅在空间位置上有差异,在图像质量上也有明显的区别,你可以看看下面这个视频,很容易观察到在相机切换的瞬间,图像的亮度、颜色等都发生了突变:


于是,我们还需要计算两个相机的图像质量的差异,并在放大过程中逐步平滑的消弭这种差异,就像下面视频所示:

这里面将会用到略微复杂的颜色空间的映射和查找表的构建,从而准确的对输入图像的质量进行变换:

手机中的计算摄影:光学变焦_相机标定_15

以上只是粗略的介绍了SAT功能核心的要点,然而在工程中还有很多细节的问题要处理,例如:

  • 如何处理光学防抖系统工作情况下相机位置的额外变换
  • 如何用最低的功耗,实时的完成上述核心功能
  • 如何在利用系统SOC本身提供的各种图像处理基础能力
  • 如何和系统ISP配合
  • 如何提高量产稳定性和效率

等等,实践过程中我们发现麻烦不断,因此即便我所在团队已经在业界前四的品牌旗舰手机中部署此算法,并且已经做到大部分场景足够满足客户的需求,也还在不断的努力,解决遗漏的问题,并开发新的功能点。例如,将SAT结合上目标检测和跟踪,可以使得你拿起手机后就自动聚焦在最感兴趣的目标上,就像下面的视频所示:


而这里要想做到稳定的跟踪目标,就又涉及到目标检测和跟踪框的空间和时间上的滤波和平滑了,所使用的技术也越来越复杂。

另外,你一定注意到了,我上面演示的视频只是做到了主体切换时不动,但背景还是会有一定的平移,有没有办法做到每一个像素点都不动呢?这是有可能的,如下图所示,同一个倾斜的棋盘格,我们在两个相机之间切换,在图像的任何一点都没有发生跳变,这是用到了我将来会详述的光流技术。

手机中的计算摄影:光学变焦_变焦_16

然而,在手机平台上实时计算高精度光流是一个非常复杂的技术,这里同时还要考虑图像的视差部分的光流无法计算准确,所以这里面还有巨大的坑等着去填。

所以,正如我在前一篇文章里面所描述的,手机上你也许觉得平淡无奇又或者是觉得很新奇的这么一个小功能,却是很多人废寝忘食的成果,而且里面还使用了很精妙的计算摄影学、计算机视觉的技术。

本文写作过程中,获得了好些同事的帮助,在此表示感谢。另外感谢美女模特提供了素材,整个文章的颜值都提升了不少????


手机中的计算摄影:光学变焦_变焦_17