问题1:为什么要做白平衡
Camera sensor在不同光源下的对白色的响应是这样的:
CCT -- 10000K -- 比如:艳阳天的阴影下
CCT -- 7000K -- 比如:阴天
CCT --5000K -- 比如:大晴天
CCT --3000K -- 比如:钨丝灯
CCT --2000K -- 比如:烛光
而白色在人眼中总是这样的
所以需要把sensor的RGB响应各自乘以一个数使RGB相等
R‘ = R x R_Gain
G’ = G x G_Gain
B‘ = B x B_Gain
Then R' = G' = B'
这就叫白平衡,所有白平衡的算法就是算这个RGB gain。
问题2: 怎么算出来RGB gain?
我们常在实验室里用这个colour checker算白平衡
取一个灰块,用photoshop量一下RGB均值,以G作归一化
R_Gain = 100/ 120;
B_Gain =100/80;
G_Gain =1;
就算出来白平衡的gain了。
看起来很简单,可是,这是因为我们的大脑知道哪是白/灰色,对于相机来说,这个问题真的好难。
问题3:需要找出来哪是白吗?
最开始研究这些成像问题的人都是搞颜色科学的,他们想问题往往从光学的角度出发,于是有了第一个想法:
灰世界假说----自然世界的平均反射率是均等的。
这句话听起来比较难懂:简言之就是整个世界的色彩平均值是灰的。
所以基于这个假说,就不需要找出来哪是白色的,只需要眉毛胡子一把抓就行:把整幅图像的RGB求均值,就等同于我们在colour checker里选中了灰块,然后就可以算出白平衡增益。
这种方法简单快速,真是棒极了。如果真的用这一个公式能解决白平衡的问题,那就真是太完美了。现实的情况是:遇到大面积单色的场景,比如蓝天,绿草地,这种方法就失效了,于是人们把这些失效的场景称作:灰世界失败。
这路反射理论科学家继续沿着这条思路想出了一个同样简单美妙的方法:完美反射法。
完美反射法的思路是:白色是反射率最高的颜色,所以在直方图上来看:
如果sensor的响应是这样的
直方图上RGB响应最右边的部分就代表着白色的响应。所以把RGB响应的直方图拉齐了,也就实现了白平衡。
完美反射法确实听起来很完美,但是,如果图像里没有白色或者存在比较强的噪声,这个方法就不好用了。
于是人们就换了思路,还是按照人眼的方式来做吧----事实上很多科学发明最后都得求助仿生学。
问题4: 怎么找到白?
最开始的方法就白点/块法,也是从颜色科学的角度去思考如何找到白。在某个色彩空间上,比如YCbCr色彩空间
在一个以0坐标为中心定义的区域内的点,都认为是接近的白点,因为0坐标的色度是0,也就是白色。
把这些点筛选出来作为参考白点求白平衡,就是这种方法的基本思路。
所有白点法的目的就是要筛选出准确的白点,这个筛选区域的定义可就大费周章了。
定大了,就混进来非白色的点。定小了,可能进来的都是噪声。
于是有人受到完美反射法的启发:在亮度维度又加入一个限制条件:因为白色的反射率最高,所以图像中最亮的部分是白色的。
Y >threshold_xxx. 才可以入选。 后来为了抑制噪声的影响,又加入一个限制条件:
Y< 10% x Y_max. 也就是去掉最亮的那部分,防止噪声混进来。
这种方法硬件实现简单,算法也很有效,着实流行了好几年,但是随着数码照相对图像质量要求越来越高,这种白点法精度差的缺陷越来越让大家不满。
于是白点/块法进入了一个新的演进。
问题5: 要校准的算法好还是不校准的算法好?
为了提高白点法的精度,新的基于校准的白点法便应运而生。把sensor在各种光源下对白色的响应记录下来,存在sensor里,在软件运行期,把当前算出的白点,对照着查表,取最近的校准白点,就可以算出正确的白平衡。
如果当前的统计白点落在两个校准点之间,就用两个点的插值。
这种方法简单快速,可以很大的提高白点法的精度。
但是,这种方法还是受到白点法定义选区的限制。
于是新的算法又改进了:干脆不定义白点选区了,采用普选制吧。
把图像划成n x m 个块,每个块算出来B/G, R/G,也就是这个块的颜色。这些
块的颜色离校准曲线越近的,投票权重越大,反之,越小。
红色的块,就是一等公民,拥有最高的投票权重,黄色的块是二等公民,拥有差一些的权重,蓝色的就是三等公民,估计就给个观看投票的权利。
这样,整个投票结果决定最终的白点在哪。
块的等级与其和校准曲线的距离成正比,越近等级越高。有些算法根据大量的同批次
sensor的统计结果,划出高中低等级区。比如
两条红色线之间的,就是高权重区域,红色黄色线之间的区域,就是中权重区,黄色线之外的就是低权重区。
这就跟清朝时候的北京城一样,满族贵族王公大臣人住内城,满族老百姓住外城。其他各民族住城外。
这种等级式校准白点法是现在大部分厂商使用的方法。它的优点来源于校准,缺点也来源于校准。
工程问题往往和成本相关,工程师遇到的情况和科学家的不同就是得同种种不理想的情况打交道。
有些比较差的产线出来的sensor差异性特别大,校准也做得不准,这样就会对这种基于校准的白平衡方法造成很大的麻烦。
这时候大家就会想起那些不用校准方法的好来。所以采用校准法与不校准法的融合,才是最好的解决之道。
任何对人类的仿生学都做不到像人类那么完美,白平衡算法也存在种种不完美,到现在为止,没有一种自动白平衡算法能够解决所有场景的问题。