自动白平衡--灰度世界算法(Gray World Algorithm)
自动白平衡–灰度世界算法(Gray World Algorithm)微信公众号:幼儿园的学霸目录文章目录自动白平衡--灰度世界算法(Gray World Algorithm)目录引言灰度世界算法原理opencv实现参考资料引言人的视觉系统具有颜色恒常性(Color Constancy),能从变化的光照环境和成像条件下获取物体表面颜色的不变特性,但成像设备不具有这样的调节功能,如彩色相机内部有三个C
自动白平衡–灰度世界算法(Gray World Algorithm)
微信公众号:幼儿园的学霸
目录
引言
人的视觉系统具有颜色恒常性(Color Constancy),能从变化的光照环境和成像条件下获取物体表面颜色的不变特性,但成像设备不具有这样的调节功能,如彩色相机内部有三个CCD电子耦合元件,分别用来感受红绿蓝三种颜色的光线,默认情况下,三个颜色的感光电路信号的放大比例是1:1:1的。在理想的拍摄环境下,纯白色的RGB分量按照1:1:1的比例放大之后,得到的是没有偏色的白色,当在非理想的环境光条件下,白色成像出来的效果会偏向环境光的颜色,而不是纯白色。也就是说,不同的光照环境会导致采集的图像颜色与真实颜色存在一定程度的偏差,需要选择合适的颜色平衡(校正)算法,消除光照环境对颜色显现的影响。让受环境光影响的白色还原成纯白色,保证在各种光线条件下,成像色彩跟物体真实的色彩保持一致。灰度世界算法是最常用平衡算法。
灰度世界算法原理
灰度世界算法以灰度世界假设为基础,该假设认为:对于一幅有着大量色彩变化的图像,其R,G,B
三个色彩分量的平均值趋于同一灰度值 K
。 从物理意义上讲,灰色世界法假设自然界景物对于光线的平均反射的均值在总体上是个定值,这个定值近似地为“灰色”。 颜色平衡算法将这一假设强制应用于待处理图像,可以从图像中消除环境光的影响,获得原始场景图像。
算法步骤如下:
-
1.确定
K
值.一般有2种方法确定K
值,
1).K
取固定值,如最亮灰度值的一般,针对0-255图像,可以取128
2).计算图像R,G,B
三个通道的平均值 R ˉ , G ˉ , B ˉ \bar{R},\bar{G},\bar{B} Rˉ,Gˉ,Bˉ,取 K = R ˉ + G ˉ + B ˉ 3 K=\frac{\bar{R}+\bar{G}+\bar{B}}{3} K=3Rˉ+Gˉ+Bˉ -
2.计算
R,G,B
三个通道的增益系数:
{ g a i n R = K R ˉ g a i n B = K B ˉ g a i n G = K G ˉ \begin{cases} gain_R=\frac{K}{\bar{R}} \\ gain_B=\frac{K}{\bar{B}} \\ gain_G=\frac{K}{\bar{G}} \end{cases} ⎩⎪⎨⎪⎧gainR=RˉKgainB=BˉKgainG=GˉK -
3.根据Von Kries对角模型,对于图像中的每个像素的像素值
R,G,B
,计算其调整后的值:
{ R ′ = g a i n R ∗ R B ′ = g a i n B ∗ B G ′ = g a i n G ∗ G \begin{cases} R^{'}=gain_R * R \\ B^{'}=gain_B * B \\ G^{'}=gain_G * G \end{cases} ⎩⎪⎨⎪⎧R′=gainR∗RB′=gainB∗BG′=gainG∗G
这种算法简单快速,但是当图像场景颜色并不丰富时,尤其出现大块单色物体时,该算法常会失效。
由于灰度世界算法是基于灰度世界的假设,当图片中没有足够丰富的色彩来近似理想情况时,灰度世界算法的白平衡效果就差强人意。
对于上式,计算中可能会存在溢出(>255,不会出现小于0的)现象,处理方式有两种:
1)直接将像素设置为255,这可能会造成图像整体偏白。
2)计算所有Rnew、Gnew、Bnew
的最大值,然后利用该最大值将将计算后数据重新线性映射到[0,255]
内。实践证明这种方式将会使图像整体偏暗,有资料建议采用第一种方案。
Von Kries提出,可用一个对角矩阵变换来描述两种光照条件下同一物体表面颜色之间的关系。该理论认为,对于同一个观察者而言,假设在光源A下面,一个物体的RGB值为 R G B 1 = [ R 1 , G 1 , B 1 ] RGB_1=[R_1,G_1,B_1] RGB1=[R1,G1,B1],如果在光源B下面同一个物体的RGB值为 R G B 2 = [ R 2 , G 2 , B 2 ] RGB_2=[R_2,G_2,B_2] RGB2=[R2,G2,B2],那么
RGB1
与RGB2
之间存在这如下转换关系:
[ R 2 G 2 B 2 ] = [ k r 0 0 0 k g 0 0 0 k b ] ∗ [ R 1 G 1 B 1 ] \begin{bmatrix} R_2 \\ G_2 \\ B_2 \end{bmatrix} = \begin{bmatrix} k_r & 0 & 0 \\ 0 & k_g & 0 \\ 0 & 0 & k_b \end{bmatrix} * \begin{bmatrix} R_1 \\ G_1 \\ B_1 \end{bmatrix} ⎣⎡R2G2B2⎦⎤=⎣⎡kr000kg000kb⎦⎤∗⎣⎡R1G1B1⎦⎤
其中 k r , k g , k b k_r,k_g,k_b kr,kg,kb分别为R,G,B
三个通道的校正系数
相关 比尔-朗伯特定律
opencv实现
代码实现如下:
//自动白平衡灰度世界算法
void GrayWorldAlgorithm(const cv::Mat& src,cv::Mat& dst)
{
assert(3==src.channels());
//求BGR分量均值
auto mean = cv::mean(src);
//需要调整的BGR分量的增益
float gain_B(0),gain_G(0),gain_R(0);
float K = (mean[0]+mean[1]+mean[2])/3.0f;
gain_B = K/mean[0];
gain_G = K/mean[1];
gain_R = K/mean[2];
std::vector<cv::Mat> channels;
cv::split(src,channels);
//调整三个通道各自的值
channels[0] = channels[0]*gain_B;
channels[1] = channels[1]*gain_G;
channels[2] = channels[2]*gain_R;
//通道合并
cv::merge(channels,dst);
}
在opencv_contrib模块中包含有各种白平衡算法,其位于
cv::cv::xphoto::WhiteBalancer
下面,实现原理和上方代码一致,但是其采用位运算符以提高计算效率.除此之外,该模块还包含有其他白平衡算法,感兴趣的可以进行研究.
下面为一幅图像经过灰度世界自动白平衡算法后的结果:
参考资料
1.灰度世界算法(Gray World Algorithm)
2.ISP基础(06):AWB算法
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)