一種效果很好的自動白平衡技術(WhiteBalance)
白平衡是圖像處理的一個極重要概念。所謂白平衡(英文名稱為White Balance),就是對白色物體的還原。當我們用肉眼觀看這大千世界時,在不同的光線下,對相同的顏色的感覺基本是相同的,比如在早晨旭日初升時,我們看一個白色的物體,感到它是白的;而我們在夜晚昏暗的燈光下,看到的白色物體,感到它仍然是白的。這是由於人類從出生以后的成長過程中,人的大腦已經對不同光線下的物體的彩色還原有了適應性。但是,作為拍攝設備,如數碼相機,可沒有人眼的適應性,在不同的光線下,由於CCD輸出的不平衡性,造成數碼相機彩色還原失真。一般情況下,我們習慣性地認為太陽光是白色的,已知直射日光的色溫是5200K左右,白熾燈的色溫是3000K左右。用傳統相機的日光片拍攝時,白熾燈光由於色溫太低,所以偏黃偏紅。所以通常現場光線的色溫低於相機設定的色溫時,往往偏黃偏紅,現場光線的色溫高於相機設定時,就會偏藍。
為了解決不同色溫下,引起的白色漂移現象。由於白色對色溫變化的響應最大,通常用白色來作為調整的基色。通常的白平衡技術有:自動白平衡、鎢光白平衡、熒光白平衡、室內白平衡、手動調節。本文僅介紹其中的一種自動白平衡。
白平衡算法通常分為兩步:白色點的檢測,白色點的調整。本方法采用一個動態的閥值來檢測白色點。詳細算法過程為:
1. 把圖像w*h從RGB空間轉換到YCrCb空間。
2. 選擇參考白色點:
a. 把圖像分成3*4個塊(塊數可選)。
b. 對每個塊,分別計算Cr,Cb的平均值Mr,Mb。
c. 對每個塊,根據Mr,Mb,分別計算Cr,Cb的方差Dr,Db。
d. 判定每個塊的近白區域(near-white region)。
判別表達式為:Cb(i, j) − (Mb + Db × sign(Mb )) < 1.5× Db && Cr(i, j) − (1.5×Mr + Dr × sign(Mr )) < 1.5× Dr
設一個“參考白色點”的亮度矩陣RL,大小為w*h。
若符合判別式,則作為“參考白色點”,並把該點(i,j)的亮度(Y分量)值賦給RL(i,j);
若不符合,則該點的RL(i,j)值為0。
3. 選取參考“參考白色點”中最大的10%的亮度(Y分量)值,並選取其中的最小值Lu_min.
4. 調整RL,若RL(i,j)<Lu_min, RL(i,j)=0; 否則,RL(i,j)=1;
5. 分別把R,G,B與RL相乘,得到R2,G2,B2。 分別計算R2,G2,B2的平均值,Rav,Gav,Bav;
6. 得到調整增益: Ymax=double(max(max(Y)))/15;
Rgain=Ymax/Rav;
Ggain=Ymax/Gav;
Bgain=Ymax/Bav;
7. 調整原圖像:Ro= R*Rgain; Go= G*Ggain; Bo= B*Bgain;
代碼如下:
1 function autoWhiteBalanceTest 2 clear all; 3 close all; 4 clc; 5 6 im=imread('13.jpg'); 7 im2=im; 8 im1=rgb2ycbcr(im);%將圖片的RGB值轉換成YCbCr值% 9 Lu=im1(:,:,1); 10 Cb=im1(:,:,2); 11 Cr=im1(:,:,3); 12 [x y z]=size(im); 13 tst=zeros(x,y); 14 15 %計算Cb、Cr的均值Mb、Mr% 16 Mb=mean(mean(Cb)); 17 Mr=mean(mean(Cr)); 18 19 %計算Cb、Cr的均方差% 20 Db=sum(sum(Cb-Mb))/(x*y); 21 Dr=sum(sum(Cr-Mr))/(x*y); 22 23 %根據閥值的要求提取出near-white區域的像素點% 24 cnt=1; 25 for i=1:x 26 for j=1:y 27 b1=Cb(i,j)-(Mb+Db*sign(Mb)); 28 b2=Cr(i,j)-(1.5*Mr+Dr*sign(Mr)); 29 if (b1<abs(1.5*Db) & b2<abs(1.5*Dr)) 30 Ciny(cnt)=Lu(i,j); 31 tst(i,j)=Lu(i,j); 32 cnt=cnt+1; 33 end 34 end 35 end 36 cnt=cnt-1; 37 iy=sort(Ciny,'descend');%將提取出的像素點從亮度值大的點到小的點依次排列% 38 nn=round(cnt/10); 39 Ciny2(1:nn)=iy(1:nn);%提取出near-white區域中10%的亮度值較大的像素點做參考白點% 40 41 %提取出參考白點的RGB三信道的值% 42 mn=min(Ciny2); 43 for i=1:x 44 for j=1:y 45 if tst(i,j)<mn 46 tst(i,j)=0; 47 else 48 tst(i,j)=1; 49 end 50 end 51 end 52 53 R=im(:,:,1); 54 G=im(:,:,2); 55 B=im(:,:,3); 56 R=double(R).*tst; 57 G=double(G).*tst; 58 B=double(B).*tst; 59 60 %計算參考白點的RGB的均值% 61 Rav=mean(mean(R)); 62 Gav=mean(mean(G)); 63 Bav=mean(mean(B)); 64 Ymax=double(max(max(Lu)))/15;%計算出圖片的亮度的最大值% 65 66 %計算出RGB三信道的增益% 67 Rgain=Ymax/Rav; 68 Ggain=Ymax/Gav; 69 Bgain=Ymax/Bav; 70 71 %通過增益調整圖片的RGB三信道% 72 im(:,:,1)=im(:,:,1)*Rgain; 73 im(:,:,2)=im(:,:,2)*Ggain; 74 im(:,:,3)=im(:,:,3)*Bgain; 75 76 %顯示圖片% 77 figure,imshow(im2),title('原圖'); 78 figure,imshow(im),title('白平衡后的效果圖');
參考地址:http://www.cnblogs.com/haar/articles/1392227.html
http://www.cnblogs.com/tiandsp/archive/2012/05/01/2477897.html