搜索
 找回密码
 立即注册

简单一步 , 微信登陆

AWB 介绍 原理 和算法

作者:laowai_love | 时间:2017-3-20 18:39:43 | 阅读:23270| 只看该作者
首先介绍一下色温的概念。色温源自普朗克定义的黑体受热辐射,单位是K(kelvin),用于定义光源颜色,热黑体辐射体与光源的色彩相匹配时的开尔文温度就是光源的色温。来看一下色温的大致范围:

                色温曲线
这是一份在XYZ色彩空间的光源色温曲线,可以看到色彩偏红时色温较低,色彩偏蓝则色温较高。一般烛光在1800K,阴天为5000K,晴天为6500K,蓝色天空在10000K以上。在实际场景中,光源的颜色未必刚好在这条色温曲线上,很可能有一些偏差。
AWB要做的事情,是要让白色的物体,在任何色温条件下,都显示成白色,这是sensor色彩校正的第一步。这里先要说明一下人眼就有非常快速和精准的AWB,以至于我们很少察觉到。举例来说,有一张白纸,不论在什么环境下,我们人眼都会认为是白色的,只有在光源色温大幅度且快速切换的一瞬间(例如开灯/关灯),才会感觉到白纸会变色一下,然后马上又变白了。而CMOS sensor拍摄到的图片,受色温的影响很大,而且Sensor 本身对RGB三个分量的敏感度也不一样,因此sensor输出的原始图片和人眼所见差异很大。AWB算法就是要克服sensor本身特性和人眼的不一致,以及解决色温对图像色彩的影响。Sensor输出原本色彩和经过ISP校准后的色彩对比,这里ISP中色彩处理包括AWB和CCM.

  某款Sensor的RGB分量敏感曲线

(上) A 光源

(中) CWF光源

(下) D65光源
某款CMOS sensor原始色彩和ISP处理后的色彩比对
人眼的AWB是根据周围环境和既往的经验来实现的,这里ISP算法也一样需要经验。针对任意一款sensor和lens的组合,我们都需要做一些实验,通过这些实验来获取相关的数据,作为这个组合的经验值。实验需要一个灯箱,灯箱中有不同色温的几种光源可做选择,通常有A光源,CWF,D65等色温从低到高的几种光源,灯箱背景为纯灰色(和白色等价)。用sensor 拍摄不同光源下的灯箱背景或者标准测试灰卡,抓取原始的Bayer pattern图片。
白色和灰色物体,在图像数据中体现为R,G,B三个分量相等,YCbCr domain中Cb和Cr都为128. 我们通常在Bayer pattern domain或者RGB domain中来做AWB算法,那么就是要让白色和灰色物体的R=G=B。我们拍摄到的图片中,这三者是不相等的,我们可以统计出整幅图中平均的两个比例值G/R和G/B,很容易想到,如果对图像中所有的R分量乘以G/R,所有的B分量乘以G/B,那么图像就会变成白色或者灰色。我们可以用G/R和G/B来构建二维空间,观察不同光源条件下这两个数值的分布情况,如下图。

光源在[G/R,G/B]空间的分布图

接下来我们需要在这个二维空间中描述一个闭合空间,这个闭合空间代表了可能是白色(灰色)物体的G/R和G/B的取值范围。在上图中,是用一个非常简单的方法,用几条直线勾勒出一个多边形作为闭合空间。这个闭合空间必须包含大部分光源的情况。也就是说,假设有个白色(灰色)物体,不论在何种常见光源下,统计出来的两个数值都会落在这个闭合空间内。这个闭合空间不能太大也不能太小,太大可能有很多其他颜色被误认为白色,太小则容易找不到白色而不稳定。那么如果确定了闭合空间的形状,在拍摄实际场景时,如果场景中有白色/灰色物体,那么就可以统计出落在闭合空间范围的像素点数,以及这个闭合空间内这些像素的平均G/R和G/B,分别记为R_gain和B_gain,对整幅图像的R分量乘以R_gain,B分量乘以B_gain,就算达到白平衡了,同时可以利用这两个Gain获得近似的色温,这里的逻辑关系并不严密,很可能有些物体并非白色而被误认为白色,所以AWB算法总是存在一定的误判概率。如果图像中没有找到落在闭合空间范围内的像素(或者太少不足以用作参考),那么通常会保持原先的R_gain和B_gain,或者采用灰度世界算法。灰度世界算法是假设Sensor 拍到的画面中所有像素的平均色彩应该是灰的,即R=G=B,于是把整幅图像的所有像素(而不仅仅是闭合空间内)都统计进去,计算出一个全局平均的R_gain和B_gain,由于拍摄内容的不确定性,这两个gain可能偏离真实情况很远(例如拍摄鲜艳的红色),因此需要做最大值和最小值限制,避免出现极端异常情况。相比于前面找白色物体的方法,灰度世界算法相对比较稳定,总是能计算出大概的gain值,缺点是很可能不正确,受大色块影响比较严重。在实际应用中,通常会结合这两种方法的优点,加上额外的限制条件,衍生出更加稳定和有效的AWB算法。


在统计上,为了避免大色块对AWB的影响,通常会对图像进行网格状分割,对每个矩形框内的数据独立统计,如果某个网格的数据偏离闭合空间很远的话,就认为是大色块而不参与AWB gain计算。


AWB的精准性是可以通过Imatest 测试的,要求在各种色温下,拍摄24色卡的最下面6个方块不能有颜色,这个通常很容易达到。

CMOS sensor拍摄的场景可能时时在变化,每次计算AWB得到的Gain会不一致,有时候甚至相差很多,如果实时调整AWB gain的话会让视频画面的色彩有跳跃感,看起来不舒服。为此,通常会做两点,一是AWB gain计算有一个稳定区间,每次计算所得AWB gain后会映射到某个色温C,假设原先的C和当前计算所得的C差异不大(小于某个阈值)的话,就不做调整,也就是说当画面色温变化不大的时候白平衡不变;二是两次色温差异超过阈值,需要调整的话,要采用渐进式慢慢的调整,例如R_gain原本为1.0,调整为2.0,那么每个Frame gain增加0.01,需要100个Frame才能调整到位,以30fps为例,就需要3.3秒时间,这样画面会渐渐的转变过去,看起来比较柔和舒适,没有闪烁的感觉。




收藏
收藏1
分享
分享
点赞
点赞17
反对
反对0
该会员没有填写今日想说内容.
回复

使用道具 举报

大神点评1

沙发#
liugewill 发表于:2017-3-23 16:57:36
好东西,感谢分享。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册
手机版