自动白平衡--灰度世界算法(Gray World Algorithm)

自动白平衡–灰度世界算法(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=gainRRB=gainBBG=gainGG

这种算法简单快速,但是当图像场景颜色并不丰富时,尤其出现大块单色物体时,该算法常会失效。
由于灰度世界算法是基于灰度世界的假设,当图片中没有足够丰富的色彩来近似理想情况时,灰度世界算法的白平衡效果就差强人意。

对于上式,计算中可能会存在溢出(>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],那么RGB1RGB2之间存在这如下转换关系:
[ 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=kr000kg000kbR1G1B1
其中 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算法



下面的是我的公众号二维码图片,按需关注。
图注:幼儿园的学霸

猜你喜欢

转载自blog.csdn.net/leonardohaig/article/details/109697886