天天看點

OpenCV 圖像白平衡算法(相機自動白平衡)

彩色相機内部有三個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;
 } 原      

始圖像一,整體圖像偏綠色:

白平衡校正後,天空的藍色和樹葉的綠色都得到了很好的還原: