拍照时,你是否遇到过这些情况呢?
拍摄的成片暗区过暗,高亮区域过曝
逆光拍摄中,会出现“鬼影”
暗部噪声偏大导致图像出现瑕疵
.......
照片的高光和暗区细节得总是不到完美呈现,这是所有拍摄设备都会出现的问题。那么我们该怎么解决和改善才能拥有愉快和出色的摄影体验呢?答案是:通过RAW HDR(高动态范围)算法技术。
RAW HDR技术:是通过使用传感器直出的raw数据,减少isp(图像信号处理)处理过程中的画质损失,能更好实现影调、噪声和鬼影等方面的优化,有效提升了照片的动态范围和画质效果。照片能够同时保留拍摄场景中的高光和暗部的细节,还原人眼中所能看见的真实场景图,从而给用户带来更高质量的摄影体验。
“
本期的Tech Talk,我们邀请到了小米AI实验室视觉算法团队的工程师——程璞,为大家介绍小米手机中,RAW HDR方案的整体结构和算法原理。
”硬核指数:⭐⭐⭐⭐⭐
趣味指数:⭐⭐⭐
阅读时长:约9分钟
一、什么是HDR
HDR是“High Dynamic Range” (高动态范围)的缩写,其中动态范围是指拍摄场景中最亮点和最暗点的亮度比值。当拍摄场景的动态范围很高时,受限于传感器以及图像编码等因素,照片可能无法呈现所有信息。典型的例子如下图所示,场景中的高光区域可能会过曝,而暗区则可能会出现死黑的现象。两个区域均难以看清细节。
HDR就是通过一定的技术手段,让照片中尽量包含高亮区域和暗区的细节,从而提升照片的画质效果。
在拍摄高动态范围场景时,照片之所以无法呈现场景高亮和暗区的信息,一方面是受限于传感器:真实世界的动态范围是很高的,而传感器能感知的范围是有限的;另一方面则跟图像的编码位数有关,比如8bit的图像能表示的范围是0~255,超过这个范围则会出现过曝等现象。
针对传感器的限制,在拍照时可以使用包围曝光的技术,即通过调整曝光时间、iso等参数同时采集不同亮度范围的图像帧,这样多个图像帧组合在一起就可以包含更多亮度范围的信息。如下图所示,我们可以采集正常曝光图像帧、长曝光图像帧、短曝光图像帧等三帧图像。其中正常曝光帧用来作为参考帧,提供基准亮度;长曝光图像帧可以提供暗区的信息,使得暗区的细节也能在照片中呈现;短曝光帧则可以提供高亮区域的信息,尽量减少照片中的过曝区域。
另外,为了表示整个亮度范围的信息,一般需要使用高比特位数的图像,而我们最终照片的比特位数较低,所以需要通过HDR算法,使得低比特位的图片也能尽可能显示出整个亮度范围的信息和细节,且比较真实自然,从而改善高动态范围场景的拍照体验。
二、RAW HDR方案
>>>> 2.1 整体框架
我们在小米手机中使用的是RAW HDR方案,即使用传感器直出的数据进行HDR的相关处理。
如上图所示,与yuv数据相比,raw数据没有经过isp中去马赛克、色调映射、颜色和对比度调整、降噪和锐化等各种复杂处理,因此raw数据的噪声模型更为简单准确,而且不同曝光的图像之间亮度关系基本是线性的,这就降低了图像降噪、亮度对齐等处理的难度。同时,raw数据的bit位数一般也会高于yuv数据,这样更有利于提升图像的动态范围,并可以设计更为灵活有效的色调映射等算法方案。
当然,raw数据也会给算法处理带来一定的困难。比如,raw数据比较原始,其噪声也会比较大(见下图),需要在HDR算法处理的过程中设计合理的降噪方案;同时,raw数据为bayer格式的,需要去马赛克后才能得到三通道信号,这也会给图像对齐等操作带来一定的困难。
(a)raw数据中的噪声
(b) raw数据为bayer格式
我们RAW HDR方案的整体框架如下图所示。输入中会有多帧正常曝光帧和其他曝光帧。多帧正常曝光帧会经过mfnr(多帧降噪)和单帧降噪等模块,得到一帧去除了噪声的正常曝光帧。其他曝光帧则首先经过单帧降噪模块进行噪声的去除,然后会对齐到正常曝光帧。
经过上述处理的正常曝光帧和其他曝光帧会进入合并模块。该模块会融合不同曝光帧的信息,从而得到高动态范围的图像。这个图像是高比特位的,会经过色调映射模块得到最终的结果。
>>>> 2.2 降噪模块:去除图像中的噪声
▍2.2.1 多帧降噪
多帧降噪模块主要通过融合多帧的信息以去除图像中的噪声。
由于相机和拍摄物体的移动,多帧图像之间需要进行对齐操作。常用的对齐方式有两种。一种是全局对齐,即假设两帧之间的移动满足一种全局变换的对齐方式。这种对齐方案比较简单,但在很多场景下,全局对齐的模型并不能有效建模两帧之间的移动,从而导致欠佳的对齐效果。另一种是局部对齐,该方式会考虑两帧之间的局部移动。典型的局部对齐方案有光流、分块匹配等。局部对齐一般能更好地对两帧间的移动进行建模,但存在对噪声和对齐初值比较敏感等问题。
我们在对多帧进行对齐的过程中会综合使用全局对齐和局部对齐的方法。首先进行基于特征点匹配的全局对齐,然后再进行局部对齐。局部对齐会对图像进行分块,并对各分块进行对齐。这样可以结合两种对齐方案的优点,取得不错的对齐效果。典型结果如下图所示,可以看到,经过对齐后,两帧间的差异得到明显减小。
(a)两帧输入图
(b) 对齐前两帧差异 (c) 对齐后两帧差异
对齐之后我们需要对多帧进行融合。我们采用加权平均的方式实现融合,权重主要取决于对齐后当前帧与参考帧的差异。由于遮挡、算法局限等原因,图像之间无法实现完全的对齐,将权重设为跟差异有关可以避免融合后图像中鬼影的出现。
▍2.2.2 单帧降噪
我们主要使用深度学习的方案进行单帧降噪。与双边滤波、nlm等传统降噪方案相比,深度学习方案一般能实现更好的降噪效果,特别是对噪声比较大的场景。
由于去噪模型是在手机端运行的,在模型设计时需要考虑模型的大小和运行速度等因素。我们采用了一个较小的基于改进unet的模型结构,同时会对模型进行量化加速。通过离线训练,降噪模型可以在保证模型运行速度的前提下,有效去除不同场景的噪声。典型的例子如下图所示。
(a)降噪前 (b) 降噪后
>>>> 2.3 多帧合并模块:融合不同曝光图像的信息
其他曝光帧在经过单帧降噪和对齐(方案与mfnr中的对齐类似)后,会与正常曝光帧进行合并,得到高动态范围的图像。我们使用加权平均的方式实现多帧间的合并。在合并时按照尽量使用过曝时间更长帧的原则来设计权重。
考虑到短曝光帧的噪声往往高于长过曝帧,这样设计权重可以减少合并帧的噪声,也可以缓解参考帧非过曝区域的鬼影问题。对于参考帧过曝的鬼影区域,我们会使用inpainting进行填充。如下图所示,经过多帧合并模块,我们可以得到一帧包含了较大动态范围信息的高比特位图像。
>>>> 2.4 色调映射模块:对亮度范围进行压缩
色调映射的目标是使得低比特位的图片也能尽可能显示出整个亮度范围的信息和细节。常用的色调映射方案主要包括全局色调映射和局部色调映射两种方式。全局色调映射会对图像的所有像素使用一条映射曲线进行变换。该类方案实现简单,但容易导致图像细节的丢失。当场景动态范围越大时,细节丢失的现象就越容易出现。与全局方案不同,局部色调映射在进行变换时会考虑图像的局部信息,可以避免细节丢失等问题的出现,但也可能会引入亮度反转等问题。
我们主要使用多尺度融合的方案以实现色调映射的目标,即通过对多帧合并模块输出的高动态范围图像乘以不同的gain值来模拟不同曝光帧,进而利用多尺度融合算法得到最终的结果。
(a)徕卡经典 (b)徕卡生动
我们实现了对徕卡经典和徕卡生动两种风格的支持,同时使用了AI场景识别、动态提亮、对比度增强等技术,使得最终的照片能够在保证高动态范围的同时实现适宜的明暗对比和自然的亮度过渡。典型场景下的照片如下图所示。通过合理的参数设计和方案优化,整体画质效果得到较大提升。
(a) HDR off图
(b) HDR on图
三、技术未来演进
HDR拍照能够还原拍摄场景中的高光和暗部细节,有效提升照片的动态范围,在大多数手机中已经被广泛使用。相信随着算法、硬件等技术的发展,未来HDR拍照能够带来更好的拍照体验:
实现更高的动态范围,从而可以还原更多亮度范围的细节,呈现更真实的场景。
更加智能化。通过更多地使用AI技术,进一步提升照片质量,并更好地识别场景和物体类别,实现对不同场景的自适应。
更快的处理速度,从而使用户可以更快地拍摄照片。
我们后续将持续改进HDR方案的效果,争取为用户带来更好的高动态范围场景的拍照体验。
你还有哪些希望了解的技术?欢迎在评论区留言,我们将继续邀请工程师就大家关心的话题进行分享。更多硬核知识,请持续关注小米Tech Talk!