自动白平衡AWB

人类视觉系统具有颜色恒昌性特点,一次人类对物体观察不受光源影响。但是sensor在不同光照下,物体呈现的颜色不同,在晴朗的天空下(高色温)会偏蓝,在烛光(低色温)下会偏红。为了消除光源对图像传感器成像的影响,模拟人类视觉系统的颜色恒常性。保证在任何场景下看到的白色是真正的白色。

对于RGB三通道图像,乘以一个对角阵就可以实现白平衡,白平衡计算的核心就是计算Rgain和Bgain,下文中简称RG和BG。

那么如何计算AWB呢,原理很简单:

  1. 在各个色温下(2500~7500)拍几张白纸的照片,假设拍6张,可以称作色温照。
  2. 把色温照进行矫正,具体是对R/G/B通道进行矫正,让偏色的白纸照成白色,并记录各个通道的矫正参数。实际上得到了6组矫正菜蔬(RG, BG)
  3. 上面是做前期工作,可以通过这六组值插值得到一条曲线,只要知道当前场景是什么色温,直接查表(RG,BG)就可以进行矫正了

色温曲线大致长下面这个样子

那么核心问题就是计算图像色温了,色温计算原理并不复杂,但是要做好,还是要细心做好每一步工作,这需要大量的测试,并对算法不断完善。

我们选取一种经典算法,首先说下简单的流程:

1. 首先将一帧数据分成MxN块,假设是25×25,并统计每一块的基本信息(白色像素数量及R/G/B通道的分量的均值)

这里涉及的问题就是白色像素统计,大家知道sensor原始图像是偏色的,这种情况下,统计白色点九只有设置一个颜色范围,只要在范围内,就可以认为是白色像素,范围见下图

统计白色像素个数的用途有两个,一是块中的白色像素太少,可以抛弃掉,二是白色像素太多,多到每一个像素点都是,那也要抛弃掉,因为很可能该区域大片过曝了

2. 我们可以根据上一步的统计值,找出图像中白色块,根据色温曲线判断色温

3. 我们得到图像中所有可能的色温,那么我们需要度胺酸是否是单一光源,或者选取最适合的光源

比如25×25=625个块中,一共找出了100个有效色块,里面又有80个白色块代表了色温4500左右,那当前色温基本就是4500了

大自然绚丽多彩,景色万千,上一步中统计的白色点难免会有错误的地方,我们需要一定的策略来判断出哪个才是真正的白。

通常我们会把提取到的白色快,计算一下到曲线的距离,再设置相应的权重。

那么有哪些经典的AWB算法呢?

方法1:灰度世界法(gray-world assumption)。该方法已经在opencv 的 photo 模块中有封装了

方法2:完美发射法。计算每个像素点的R+G+B的值,统计政府图片R+G+B的直方图分布,统计前10%大的R+G+B的值,以此阈值T来区分白色参考点,来修正颜色值

这两种经典的方法只有在复杂的场景下呈现出比较好的效果。在颜色和物体单一的情况下,白平衡常常失败。容易受到噪声、渐晕、有限动态范围的影响。

方法3:色域界限法。对于各个色彩趋近白色的图元,给较高的权重,原理白色(较饱和的颜色)的图元,权重较低或舍去。

方法4:图框区域分割法。将图像分n块,根据每块的标准差大小,判断权重。标准差越大的,说明颜色越丰富,越符合灰度世界法,给与较大权重。然后用所有块的RGB平均值进行甲醛平均,再套用灰度世界法的白平衡计算公式

方法5:动态阈值法。将图像按照长宽比例分成数块,如3×4块,在YCbCr通道根据灰度世界法筛选出符合的区域,经过一系列白点筛选,来计算白平衡

除此之外,还有一些CNN的方法,效果也比较好(比如iphone11的awb就是cnn做的),甚至可以直接在raw域来做,减轻isp处理负担,是更值得深入探究的。另外,如果条件按允许,还可以考虑上色温传感器,在拍照时直接采集场景色温。

希望能有帮助!

发表评论