本文介绍了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,

最低0.47元/天 解锁文章
9223





