漫谈手机 HDR 实现:从 iPhone 4S 到小米 10 至尊纪念版
Matrix 是少数派的写作社区,我们主张分享真实的产品体验,有实用价值的经验与思考。我们会不定期挑选 Matrix 最优质的文章,展示来自用户的最真实的体验和观点。
文章代表作者个人观点,少数派仅对标题和排版略作修改。
小米在本月中旬推出了其数字系列旗舰的最新产品——小米 10 至尊纪念版。
作为其公司成立 10 周年的纪念产品,它搭载骁龙 865 芯片组,最高可选 LPDDR5 16GB 内存和 UFS 3.1 512GB 存储配置,更搭载了 120Hz 高刷新率屏幕和 120W 有线快充。
其相机模组也颇为可圈可点,本次小米 10 至尊纪念版搭载了一个 4 摄像头模组,它由:
组成。
其中最大的亮点还是要属其主摄,本次使用的主摄 CMOS 来自豪威科技,搭载了两个为高动态场景优化的成像技术,分别是「行交织 HDR」和「双原生 ISO」,凭借这两项技术的加成,小米 10 至尊纪念版一举斩获 DXOMARK 摄影和总分榜首位。
借此机会,我们也可以来刷理一下近十年来手机领域在 HDR 成像方面的发展,我们是如何一步一个脚印走到现在的?
在描述一个场景的时候,动态范围(Dynamic Range)指的是其最亮部与最暗部的亮度比值。
高动态范围的场景(High Dynamic Range Scene)指的是场景里同时存在非常明亮和非常暗淡的部分。
上图就是一个典型的 HDR 场景,其中灯丝非常明亮,但周围没有受到光照的墙面就非常暗淡。
图像传感器所能捕捉的动态范围是有限的,它受到两个因素的限制,一个是满阱容量(Full Well Capacity,FWC),另一个则是它的本底噪声。
满阱容量越大,CMOS 就越不容易饱和。如果场景里明亮的部分释放出太多光子,那么图像传感器就会饱和,超出这个容量的光子无法被捕捉,这些高光信息也就无法被保存下来。
类似地,对于太过暗淡的部分,那些光子的信号强度不够,那么就会淹没在图像传感器的噪声(Noise Floor)中,无法被记录下来。
上图中灯丝周围的细节已经丢失了,呈现出纯白,而周围的墙面则呈现出纯黑色,同样无法辨认细节,这就是传感器动态范围不足的表现。
要想在一张照片里记录尽可能多的明暗细节,就需要尽可能扩大传感器的 FWC,并尽可能地抑制其本底噪声,然而,在手机上,受制于我们所能容纳的传感器尺寸,以及当前可用的技术,传感器能获得的提升是有限的。
因此,工程师们另辟蹊径,通过其他的方法来捕捉这种高动态范围的场景,这就是高动态范围成像技术(HDR Imaging)。
HDR 成像这个概念最早被大众熟知可以追溯到 2011 年发布的 iPhone 4S。
iPhone 4S 是首次引入 HDR 成像的手机之一,它使用的是多帧异曝光 HDR,原理也非常通俗易懂,如果一张图片无法容纳场景所有的动态范围,那么我们多拍几张,让它们的亮部和暗部信息进行接力不就好了?
在上面的示意图中,红色部分表示传感器的本底噪声,淹没在本底噪声中的信息是无法被获取的,但通过多帧接力,我们就可以将它们拼接起来,获得宽广的动态范围。
这种技法一般通过调节曝光时间来获得不同曝光的画面,最终通过多张不同曝光的图片来把整个动态范围包起来,因此也被称作包围曝光(Bracketing)。
这个做法非常简单,效果也不错,但很快我们就发现一个问题,它对运动物体的效果不好。
因为这种多帧异曝光 HDR 需要拍摄多张曝光时间不同的画面,在这个过程中如果出现运动物体,它在每一帧中移动的程度都不同,在不同帧里的位置也不同,在最终合成时就会出现各种各样的问题。
此外,曝光较长的帧也更容易因为手抖而糊片,这种拍摄方式在应对弱光 + 大光比场景下可用性会大幅降低。
为了解决这个问题,Google 的工程师们提出了另一个思路。
Google 的工程师在 Nexus 6/5X/6P 上引入了一种新的 HDR 实现方法,他们认为这种方法较传统的多帧异曝光 HDR 提升很大,所以取名叫 HDR+。
这是一种什么样的方法呢?
Google 的思路是,通过多次拍摄同样曝光的画面,并进行叠加分辨出暗部里哪些是细节,哪些是噪点,从而实现宽广的动态范围。经过几年的发展,手机传感器已经有了长足的进步,其动态范围也比此前来得更大,因此只要保证高光不过曝,就可以从暗部里挖掘出足够的信息。
好处是,为了保证高光不过曝,每一帧的曝光时间都需要设置得比较短,减轻了手抖的影响,此外,由于每一帧曝光时间一致,因此大多数情况下运动物体在每一帧之间也能保持近似的移动幅度。
这意味着堆栈更加方便,HDR 伪像更少,Nexus 系列推动了弱光下高动态范围成像的快速发展,这一思路也至今被所有厂家的夜景模式沿用。
但这个方法是完美的吗?显然不是。
这个方式实现的 HDR 画质上限很高,但代价也很大。
首先是它对算力的需求大,要想达到比较理想的画质,一般需要 7-9 张图片,需要消耗大量算力,在早期手机芯片算力还不够用的时候,拍摄一张 HDR+ 图片往往会有几秒的合成时间,按下快门的同时也无法立即拍摄。
其次,由于对算力需求大,相机模式下的发热和功耗会增大,再者,由于无法零迟滞输出 HDR 图像,这意味着第三方应用没有办法调用它,享受到这一技术带来的高画质图片。
Google 作为玩出这个骚操作的创始人,此后对这一技术进行了深度优化,通过预载按下快门前的图片做出了零快门迟滞的 HDR+(Zero Shutter Lag,ZSL),还专门开发了一颗加速用的 Pixel Visual Core 芯片方便第三方应用调用 HDR+。
但其它厂商就更加保守,绝大多数的厂商只在独立的夜景模式里使用这一思路。夜景拍摄并不是一个高频次实用的功能,等待曝光就需要数秒甚至数十秒的时间,用户们对额外几秒的合成时间和偶尔才感受到的发热也不会太敏感。
在之前我们讲到,受制于手机这个尺寸,使用 CMOS 单帧强吃 HDR 是不现实的,那么只能走多帧的路子,但多帧又会带来合成的问题。
多帧异曝光和多帧同曝光的路子分别被苹果和 Google 走了,那么接下来还有什么可以提升呢?
我们还是要把目光放回软硬件结合上——软件的路走过了,我们可以走硬件的路嘛。
这里介绍三个昙花一现的硬件 HDR 实现,它们都是由上游厂商提供的。
它们分别是合并多重曝光(BME-HDR),空间多重曝光(SME-HDR),以及四拜尔(QuadBayer HDR)。
合并多重曝光,BME-HDR 是将 CMOS 每两行设定为不同的曝光模式,两行短曝光,两行长曝光,最后纵向方向每四行合并成两行,合成出一张横向分辨率保持不变,纵向分辨率减半的 HDR 图像。
也就是说一枚 4000x3000 像素的 1200 万像素的传感器,合成后画面还是有 4000 像素的长边,但是纵向的像素数量会减少到 1500,最终输出 600 万像素的 HDR 照片。
很显然 50% 的分辨率损失实在是太夸张了,这个等效于 1x2 合并(binning)的 BME-HDR(Binned Multiplexed Exposure)用在手机上显然是不现实。
空间多重曝光,SME-HDR(Spatially Multiplexed Exposure)的思路就有所不同,这类定制的传感器上的像素按照一定规律排列,有的像素进行长曝光,有的进行短曝光,最后合成输出 HDR 图像,损失的分辨率轻很多,大概只损失 20%。
1200 万像素的传感器可以输出 960 万像素的 HDR 图像,看着还不错,是吧?
但是,当年可选 SME-HDR 的传感器里有一枚是 IMX378,在 Pixel 上也有用,Pixel 用 HDR+ 的方法实现了不损失分辨率的 HDR 成像,而且效果还比 SME-HDR 更好,于是 SME-HDR 也成为了在普及前就被淘汰的选型。
QB-HDR 是在 QuadBayer 滤镜普及后诞生的一种新式硬件 HDR 实现。
其思路继承自 SME-HDR,同样是让传感器上按照一定规律设置长曝光和短曝光像素,不过这次每一组都会落在一个 2x2 的矩阵里,对角线一组实现长曝光一组实现短曝光。
这个技术曾经短暂地在部分手机上应用过,但是很快因为效果不佳也退出了市场。
数次尝试结果都很一般,硬件 HDR 的出路在何方呢?
让我们重新回到多帧异曝光和多帧同曝光的路线之争上。
多帧异曝光的问题主要出现在应对运动物体无力,容易被手抖影响,而多帧同曝光的画质虽然上限很高,但代价也很大,有没有一种比较折衷的办法,既能较好地应对运动物体,又能较好地节约宝贵的计算资源和电力呢?
答案就是行交织 HDR。
要想理解行交织 HDR,我们要先了解 CMOS 的工作原理,现代手机里应用的都是滚动快门(Rolling Shutter),也就是说它的读取不是所有像素同时读出,而是从上到下一行一行读取。
这次的 OV48C 传感器有着 4800 万像素,是由一个每行 8000 像素,一共 6000 行的像素阵列组成,读取的时候会从最上面一行开始,逐步从顶部读取到底部。
在传统的多帧 HDR 里,每一帧都需要在上一帧完成读取后才能进行。
CMOS 会先进行一次长曝光,然后从上到下完整读取出整个画面的数据,然后再开始中曝光,从上到下读一遍,最后以同样的方式完成短曝光。
换言之两帧之间的时间间隔是曝光时间 + 传感器完整完成读取一帧的时间,在第一行像素被读出后,它需要等待其它的 5999 行像素被读取完才能开始中曝光。
如果我们能让 CMOS 的每一行像素完成读取后,立即开始下一次曝光,不就可以省下等待其它像素完成读取的时间了吗?
我们让 CMOS 完成长曝光后,读取完第一行的同时,第一行像素几乎立即开始中曝光,而无需等待其它的 5999 行像素读取完成,两帧之间的读取间隔被缩短,物体运动带来的伪像得以显著改善。
而在这个时候,其它行也在进行着读取 - 下一次曝光的工作,每一行不同的曝光和读取交替进行,就像纺织里互相穿插的纱线一样,我们就把它称作行交织技术。
这一技术在索尼半导体被称作 DGO-HDR(Digital Overlapping),而豪威称之为 Staggered HDR。
这次小米 10 至尊纪念版就利用了这种技术,不过,小米用的是加强版的行交织 HDR:
小米 10 至尊纪念版采用的 OV48C 主摄搭载了双增益电路(Dual Conversion Gain),现了支持同时读出的双原生 ISO,能同时读出一个更亮的和一个更暗的图片。
利用这一技术搭配行交织 HDR,我们可以得到一种更强的实现:
在第一帧里,我们使用同样的曝光时间,同时读出高增益(High Conversion Gain,HCG)和低增益(Low Conversion Gain,LCG)两帧画面,实现长曝光和中曝光的效果,然后再补充一个短曝光即可,如果光比不是太大,放弃短曝光换取更短的迟滞也是可以的。
这种增强版行交织 HDR 长曝光与中曝光之间完全没有时间差,可以进一步改善对运动物体的拍摄效果。
小米的说法是单帧逐行 HDR 技术,很好地描述了行交织 HDR 带来的优势,就是总耗时接近单帧,显著减少了伪像。
通过搭载具有双原生 ISO 和行交织 HDR 技术的 OV48C 主摄,小米 10 Ultra 成为了少有的 HDR 全能型选手。
在拍摄视频时,可以选用读取速度最高的双原生 ISO HDR,而在拍摄静态影像的时候,根据情况的不同可以针对性地进行选择。
应对运动物体的时候,可以根据光比和物体的运动速度应用双原生 ISO 配合行交织 HDR 实现零快门迟滞的 HDR 成像,而在应对大光比,光照充足的静态场景时,则可以选择最传统的多帧 HDR,在算力和电力开销不大的情况下实现优质的 HDR 效果,如果面对的是最极端的弱光大光比环境,那用户则可以切换到夜景模式,调用多帧同曝光来最大程度地挖掘传感器的潜力。
这是一首软硬件共同奏响的乐章,在我们对手里精妙的设备进行赞叹的同时,也不要忘记这十年来无数工程师们提出的各种 HDR 解决方案,没有一种方案是完美的,只有在恰当的时候选择恰当的方案,才能最好地发挥出机器的潜力。
下一个十年,移动设备上又会涌现出怎样的影像方案呢?我很期待。
> 下载少数派 客户端 、关注 少数派公众号 ,了解更妙的数字生活 🍃
> 想申请成为少数派作者?冲!