• hdr_plus学习笔记


      概论

      hdr_plus是google search于2016发布的一篇论文,全名为“Burst photography for high dynamic range and low-light imaging on mobile cameras",它提出了一整套图像处理的算法来实现移动设备上非常快速的画质增强。这套算法在诞生之时非常的轰动,特别是暗光效果拔群,在同时代安卓手机中难逢敌手。这套算法内置于google自产的手机app(google camera)上,我大学时代用过两部google自产的手机,因此第一时间见识到了它的威力。随后google还在不断进行迭代修改,时至今日,当其他安卓手机发布之后,安卓开发者们还会试图将搭载于pixel上的google camera移植过来,因为这套算法实在过于强大,在几乎所有能兼容的手机上都会看到立竿见影的成片质量改善。

      神往已久之后,最近终于拜读了这篇论文。大学时代接触过数字图像处理,但是时间已久,再加上当时开课不甚上心,因此这篇论文的许多细节并没有能力一一明晰。在此尽力将整个处理过程记录下来,以便日后要用。

      不同与一般的hdr算法,hdrplus并没有采用多张不同曝光值的照片进行合成,它用的是多张相同曝光值的照片,并且快门速度和曝光量选择偏暗,就是说速度选择高,曝光量低。更快的快门速度带来更低的抖动模糊,而更低的曝光量能有效抑制过曝,也就是照片中的高光溢出,并且更低的iso带来更少的噪点。但是这两个选择都会带来一个问题,暗处曝光不足,google采取了一系列措施来解决这个问题。

      我认为采取多张相同曝光的照片进行合成是hdrplus之所以能被称为plus的重要原因之一。

      google对他们技术的介绍是这样的:一种图像处理流水线,它能够捕获、校准和合并一系列连拍来降低图像噪音并增加动态范围。其中提到的第一个特点就是没有使用hdr中常用的多重曝光,相同曝光的多张图片能让对齐过程更加健壮,并且设置较低的曝光参数来避免高光部分过曝。第二个特点是从bayer raw frame而非由手机上的isp输出的demosaicked RGB frame开始处理,raw image的图像有更深的位宽并且可以自定义色调映射和空间去噪。第三个改进是提出了一种新的以FFT为基础的校准算法和一种2D/3D混合的维纳滤波器(Wiener filter)。这种新的算法和滤波器在去噪和融合图像中发挥了至关重要的作用。在1200万像素的相机上生成一张照片耗时4s,当然经过几年的改进,如今搭载在最新一代pixel上的google camera又已经进化多次了,时间大大缩短。

      当今移动设备上的摄影的情况有一句话可以提现,叫“强光无弱机”。也就是说,真正考验移动设备成像能力的是暗光场景。标准的处理方法是提高感光度(iso),这样会增加噪点。或者延长曝光时间,那样又会引起抖动,既包括相机的抖动,也包括被摄场景中的抖动。令人惊讶的是,在白天的摄影中也会出现光线不足(局部),这种情况一般在高动态范围摄影中出现。解决方法有很多,这里重点提一下几个典型的。第一个就是多重曝光,不同曝光时长的照片合成很容易产生鬼影。另外一个是在相邻的scanline上调整曝光时间可以减少鬼影的产生,但是会牺牲图像的细节并增加去马赛克的难度。

      获得连续成像的照片并利用动态范围压缩合成新图像并非新技术,但是部署在移动设备上实现商用却非常困难。在设计中google遵循了以下几个原则让整个算法成功地部署。

      第一,快速。整个过程必须在数秒之内完成。既保证了用户体验,也对整个算法的资源占用进行了限制。

      第二,自动。系统不需要任何手动输入的参数或者其他人工干预。整个算法封装严密,对于用户来说是无感知的。

      第三,自然。成像必须忠实于场景。在高动态范围场景中需要限制本地色彩映射以防出现卡通化的图像。在低光照场景中不能让图像过亮从而失真亦或是产生太多的噪点。

      第四,克制。我们的算法要能够作为用户的默认模式。(这一点非常好,时至今日,20200217,还有很多手机厂商将hdr设置为额外的一种模式)。默认模式的意思是它不能产生任何鬼影或者虚像,也不能比传统成像的效果差。在一些极端条件下无法工作时,它要能退化成传统的成像模式。

      正是基于克制的出发点,我们发现最可靠的实现方式是连续以相同曝光时间获得一系列图像(高速等曝光连拍)。在选择曝光时间的时候,google刻意选择会欠曝的时间。另外,同样基于“克制”的出发点,算法选取一帧作为参考帧,同时选出其他可选帧中确信能与参考帧匹配的部分,再与参考帧进行合成。这种保守的合成也许会让最终结果中的一部分的噪声更多,但是这种现象很少见。

      在校准合成之后,会先生成一帧中间帧,它有更高的动态范围,与输入帧相比噪点更低。这样一来,仅仅通过舍弃low-order bits就能得到高质量(albeit underexposed)图像。但是既然目标是得到自然的图像(即使是在高对比度的场景下),我们谨慎地牺牲了全局对比度而保存了局部对比度,并没有简单的增强阴影部分。这个过程叫做“HDR色调映射”(并不是什么新东西),它的效果很像摄影中的“dodging and burning“。

      实际上,google在这之前并未涉足手机摄影,nexus4的相机也就是堪用的级别(扫码器)。在这个领域一直是苹果主宰。在这个算法出来之前,安卓阵营的摄影始终被苹果压制,即使是像三星这样的顶级巨头,也只是在夜景这种场景和苹果互有胜负。也许是google实在看不下去了,亲自下场,当然效果也是立竿见影。毕竟apple和其他安卓厂商都能拿到一样的硬件,打不过只能是软件不行,而比算法实力,google真的还没怕过谁。这点有点像微软,其他pc厂商做2in1十分拉垮之时,微软亲自下水出品surface系列。然而两者结局相异,surface品控始终不甚稳定,而pixel虽然也有这样的问题,但是起码手机摄影这一块,扛起了大旗,拉到了和苹果同一档。

      但是google之所以牛逼,还有一个原因,它们不仅做得很好,还把算法公布,而其他厂商,如苹果三星索尼,都没有这个魄力。

      算法流水线如下:

      首先从stream of raw frame中获得burst of raw frames,这个过车涉及到曝光以及曝光参数控制,然后在全分辨率下进行校准和融合,之后是白平衡,去马赛克,去噪,接着是局部色调映射(曝光融合?),然后去雾,全局色调映射,最后是锐化,色调和饱和度的调节。

  • 相关阅读:
    angularjs事件通信$on,$emit,$broadcast详解
    es6入门7--Set Map数据结构
    ES6函数参数默认值作用域的模拟原理实现与个人的一些推测
    JS判断数组是否包含某元素
    es6入门6--数组拓展运算符,Array.from()基本用法
    js new一个对象的过程,实现一个简单的new方法
    js中的NaN,isNaN与Number.isNaN的区别,如何判断一个值严格等于NaN
    详解 JDK8 新增的日期时间类
    详解 枚举
    详解 动态代理
  • 原文地址:https://www.cnblogs.com/aliothx/p/12321074.html
Copyright © 2020-2023  润新知