3A算法——自动白平衡算法

        本文介绍了3A算法中的自动白平衡算法,参考诸多大神的文章,由于整理时间较晚,未完全记得参考的原文链接,如有版权权限问题,望联系进行更正,谢谢!

        图像信号处理算法(Image Signal Process,ISP),对图像传感器输出的原始图像进行处理,得到较好的场景还原效果。

其中,3A算法包括:AWB(自动白平衡)、AE(自动曝光)、AF(自动对焦)。这里先分析自动白平衡算法。

        人眼在观察物体的时候,可以根据不同光源的性质调整被观察到的物体颜色。而相机在不同色温的光源下拍摄到的图像会产生偏色。相机的自动白平衡就是通过改变RGB感光电路信号的放大比例,让受环境光影响的图像颜色保持和物体真实的颜色一致。

        1、白平衡的本质是使白色物体在任何光源下都显示白色。

        2、一般的算法通过调节白平衡增益, 使拍摄画面的颜色接近物体真实的颜色, 增益调节的根据是环境光源的色温。

        3、AWB算法的步骤:估计环境光色温,计算增益并调节。

        4、估计环境光色温算法有:灰度世界算法、完美反射算法、动态阈值算法。

        5、增益调节最简单的方式, 通过求取图像的平均颜色分量对应的增益,然后, 对整副图的RGB分量进行调整 。

       (1)灰度世界算法基本原理:对于一幅图像,当有足够的色彩变化时,可认为它的RGB分量均值倾向于相等R平均=G平均=B平均,图像呈现为灰色,公式为:

                                                                     

                                                                    

                                                                   G'=G*(K/G平均)

                                                                  

        其中,R平均、G平均、B平均是白平衡之前三个分量各自的平均值,R、G、B是白平衡之前像素点的值,R’、 G’、 B’是白平衡后所得像素点的值。

        该算法的优点是简单快捷,能应用于一般场景的处理,但是当图片颜色比较单一或者单一色块的面积较大时,灰度世界法不成立,处理结果会出现偏差。

        (a)Matlab代码:

%% 灰度世界法

clear all

close all

clc

% 输入图像(存在颜色偏差的原始图像)

imageInput=imread('Test.jpg');

% 分离各个通道

imageR=imageInput(:,:,1);    

imageG=imageInput(:,:,2);   

imageB=imageInput(:,:,3);

% 求RGB分量的均值

R=mean(mean(imageR));       

G=mean(mean(imageG));       

B=mean(mean(imageB));

% 计算各分量的增益

RGB=(R+G+B)/3;  

kR=RGB/R;   

kG=RGB/G;               

kB=RGB/B;

% 计算各通道变换后的灰度值

imageR=imageR*kR;            

imageG=imageG*kG;           

imageB=imageB*kB;

% 合并成三通道图像

% imageOutput(:,:,1)=imageR;   

% imageOutput(:,:,2)=imageG;  

% imageOutput(:,:,3)=imageB;

imageOutput=cat(3,imageR,imageG,imageB);

% 输出图像(自动白平衡校正后-灰度世界法)

% figure;imshow(imageInput); title('原始图像');  

% figure;imshow(imageOutput);title('白平衡后图像'); 

figure;imshow([imageInput imageOutput]);


        (b)opencv代码:

// 自动白平衡算法(灰度世界法)

#include <opencv2\highgui\highgui.hpp>

#include <imgproc\imgproc.hpp>

using namespace cv;

using namespace std;

int main()

{

     Mat imageInput = imread("Test.jpg");

     if (!imageInput.empty())

     {

          vector<Mat> imageRGB;

          // 分离各个通道

          split(imageSource, imageRGB);


          // 求RGB分量的均值(opencv中排列顺序是B,G,R)

          double R, G,
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值