彩色相機内部有三個CCD電子耦合元件,分别用來感受紅綠藍三中顔色的光線,預設情況下,三個顔色的感光電路信号的放大比例是1:1:1的。在理想的拍攝環境下,純白色的RGB分量按照1:1:1的比例放大之後,得到的是沒有偏色的白色,當在非理想的環境光條件下,白色成像出來的效果會偏向環境光的顔色,而不是純白色。
相機的自動白平衡就是要通過改變RGB感光電路信号的放大比例,讓受環境光影響的白色還原成純白色,保證在各種光線條件下,成像色彩跟物體真實的色彩保持一緻。
常用的一種自動白平衡算法是灰階世界法,它假設對于一副色彩豐富的圖像,圖像上RGB三個分量的平均值趨于同一個灰階值,一般取這個灰階值的大小為RGB三分量的平均值。
以下是OpenCV實作的灰階世界法:
#include <highgui/highgui.hpp>
#include <imgproc/imgproc.hpp>
using namespace cv;
int main()
{
Mat imageSource = imread("02.jpg");
imshow("原始圖像", imageSource);
vector<Mat> imageRGB;
//RGB三通道分離
split(imageSource, imageRGB);
//求原始圖像的RGB分量的均值
double R, G, B;
B = mean(imageRGB[0])[0];
G = mean(imageRGB[1])[0];
R = mean(imageRGB[2])[0];
//需要調整的RGB分量的增益
double KR, KG, KB;
KB = (R + G + B) / (3 * B);
KG = (R + G + B) / (3 * G);
KR = (R + G + B) / (3 * R);
//調整RGB三個通道各自的值
imageRGB[0] = imageRGB[0] * KB;
imageRGB[1] = imageRGB[1] * KG;
imageRGB[2] = imageRGB[2] * KR;
//RGB三通道圖像合并
merge(imageRGB, imageSource);
imshow("白平衡調整後", imageSource);
waitKey();
return 0;
} 原
始圖像一,整體圖像偏綠色:
白平衡校正後,天空的藍色和樹葉的綠色都得到了很好的還原: