1 什么叫白平衡
什么是白平衡呢?白平衡的英文為 White Balance,其基本概念是“不管在任何光源下,都能將白色物體還原為白色”,對(duì)在特定光源下拍攝時(shí)出現(xiàn)的偏色現(xiàn)象,通過加強(qiáng)對(duì)應(yīng)的補(bǔ)色來進(jìn)行補(bǔ)償。相機(jī)的白平衡設(shè)定可以校準(zhǔn)色溫的偏差,在拍攝時(shí)我們可以大膽地調(diào)整白平衡來達(dá)到想要的畫面效果。
白平衡,字面上的理解是白色的平衡。白平衡是描述顯示器中紅、綠、藍(lán)三基色混合生成后白色精確度的一項(xiàng)指標(biāo)。白平衡是電視攝像領(lǐng)域一個(gè)非常重要的概念,通過它可以解決色彩還原和色調(diào)處理的一系列問題。白平衡是隨著電子影像再現(xiàn)色彩真實(shí)而產(chǎn)生的,在專業(yè)攝像領(lǐng)域白平衡應(yīng)用的較早。家用電子產(chǎn)品(家用攝像機(jī)、數(shù)碼照相機(jī))中也廣泛地使用,然而技術(shù)的發(fā)展使得白平衡調(diào)整變得越來越簡單容易,但許多使用者還不甚了解白平衡的工作原理,理解上存在諸多誤區(qū)。它是實(shí)現(xiàn)攝像機(jī)圖像能精確反映被攝物的色彩狀況,有手動(dòng)白平衡和自動(dòng)白平衡等方式。許多人在使用數(shù)碼攝像機(jī)拍攝的時(shí)候都會(huì)遇到這樣的問題:在日光燈的房間里拍攝的影像會(huì)顯得發(fā)綠,在室內(nèi)鎢絲燈光下拍攝出來的景物就會(huì)偏黃,而在日光陰影處拍攝到的照片則莫名其妙地偏藍(lán),其原因就在于白平衡的設(shè)置上。
在我們使用的相機(jī)上,都可以設(shè)定白平衡,大多數(shù)的人都設(shè)定成自動(dòng)白平衡,這個(gè)方式簡單又方便,大部分情況下也可以滿足日常拍攝的需求。相機(jī)會(huì)分析我們拍攝場景的光線環(huán)境,并且盡力還原白色,光的色調(diào)是通過色溫來實(shí)現(xiàn)的,色溫會(huì)告訴相機(jī)這些光是暖色調(diào)還是冷色調(diào)。在我們使用的相機(jī)上,都可以設(shè)定白平衡,大多數(shù)的人都設(shè)定成自動(dòng)白平衡,這個(gè)方式簡單又方便,大部分情況下也可以滿足日常拍攝的需求。相機(jī)會(huì)分析我們拍攝場景的光線環(huán)境,并且盡力還原白色,光的色調(diào)是通過色溫來實(shí)現(xiàn)的,色溫會(huì)告訴相機(jī)這些光是暖色調(diào)還是冷色調(diào)。
2 色溫是什么?
色溫說的是光線的溫度,比如暖光或者冷光。色溫的測(cè)量單位是開爾文,表示為 K,也就是我們平常經(jīng)常再說色溫的時(shí)候,見到的比如 5000k, 4500k 這個(gè)概念。
? 1)冷光,色溫高,偏藍(lán)
? 2)暖光,色溫低,偏紅
現(xiàn)在我們是不是大概明白色溫的意思了。色溫其實(shí)并不難懂,上圖當(dāng)中色溫從高到低,顏色也由偏藍(lán)的冷光到偏黃的暖光。
3 常見的色溫
有一些常見的場景的色溫,我們需要比較熟悉,這樣可以幫助我們快速的判斷我們的拍攝場景,選擇合適的色溫。
-
陰天的下午或陰天:6000-7000K
-
直接正午的陽光:5200-5500K
-
白色熒光燈:4000K
-
白熾燈:2800K
-
蠟燭:1800K
4 白平衡算法
1)原始的灰度世界算法
灰度世界算法(Gray World)是以灰度世界假設(shè)為基礎(chǔ)的,該假設(shè)認(rèn)為對(duì)于一幅有著大量色彩變化的圖像, R、 G、 B 三個(gè)分量的平均值趨于同一個(gè)灰度 K。一般有兩種方法來確定該灰度。
(1)直接給定為固定值, 取其各通道最大值的一半,即取為 127 或 128;
(2)令 K = (Raver+Gaver+Baver)/3,其中 Raver,Gaver,Baver 分別表示紅、 綠、 藍(lán)三個(gè)通道的平均值。
算法的第二步是分別計(jì)算各通道的增益:
? Kr=K/Raver;
? ? Kg=K/Gaver;
? ? Kb=K/Baver;?
算法第三步為根據(jù) Von Kries 對(duì)角模型,對(duì)于圖像中的每個(gè)像素 R、G、B,計(jì)算其結(jié)果值:
? ? Rnew = R * Kr;?
? ? Gnew = G * Kg;?
? ? Bnew = B * Kb;?
?對(duì)于上式,計(jì)算中可能會(huì)存在溢出(>255,不會(huì)出現(xiàn)小于 0 的)現(xiàn)象,處理方式有兩種。
? ? ?a、 直接將像素設(shè)置為 255,這可能會(huì)造成圖像整體偏白。
? ? b、 計(jì)算所有 Rnew、Gnew、Bnew 的最大值,然后利用該最大值將將計(jì)算后數(shù)據(jù)重新線性映射到[0,255]內(nèi)。實(shí)踐證明這種方式將會(huì)使圖像整體偏暗,建議采用第一種方案。
Matlab 實(shí)現(xiàn): ?
close all
clear all ?
clc ?
I=imread('test1.jpg'); ?
[H,W,L]=size(I);%得到圖像長寬高
Rsum = 0;
Gsum = 0;
Bsum = 0;
Rsum = double(Rsum);
Gsum = double(Gsum);
Bsum = double(Bsum);
for i = 1 : H
for j = 1 :W
Rsum = Rsum + double(I(i,j,1)); ?
Gsum = Gsum + double(I(i,j,2));
Bsum = Bsum + double(I(i,j,3));
end
end ?
Raver = Rsum / (H*W);
Gaver = Gsum / (H*W);
Baver = Bsum / (H*W);
%K=128;%第一種 K 取值方法
K = (Raver+Gaver+Baver)/3;%第二種方法 ?
Rgain = K / Raver;
Ggain = K / Gaver;
Bgain = K / Baver;
Iwb(:,:,1) = I(:,:,1) * Rgain;
Iwb(:,:,2) = I(:,:,2) * Ggain; ?
Iwb(:,:,3) = I(:,:,3) * Bgain; ?
imwrite(Iwb,'Result1.jpg'); ?
figure(1), ?
subplot(121),imshow(I),title('原始圖像'); ?
subplot(122),imshow(Iwb),title('自動(dòng)白平衡圖像');
2)完美反射算法
原理:完美全反射理論 perfect Reflector 假設(shè)圖像上最亮點(diǎn)就是白點(diǎn),并以此白點(diǎn)為參考對(duì)圖像進(jìn)行自動(dòng)白平衡,最亮點(diǎn)定義為 R+G+B 的最大值,具體編碼步驟如下:?
(1)計(jì)算每個(gè)像素的 RGB 之和,并保存到一臨時(shí)內(nèi)存塊中。
(2)按 R+G+B 值的大小計(jì)算出其前 10%或其他 Ratio 的白色參考點(diǎn)的的閾值 T。
(3)遍歷圖像中的每個(gè)點(diǎn),計(jì)算其中 R+G+B 值大于 T 的所有點(diǎn)的 RGB 分量的累積和的平均值。
(4)對(duì)每個(gè)點(diǎn)將像素量化到[0,255]之間。
?
Matlab:
%完美反射算法 --ABW
close all
clear all
clc ?
I=imread('test7.jpg');
I=im2double(I); ?
R=I(:,:,1);
G=I(:,:,2);
B=I(:,:,3);
%(1)計(jì)算每個(gè)像素的 RGB 之和,并保存到一臨時(shí)內(nèi)存塊中。
RGBsum=R+G+B;
%(2)按 R+G+B 值的大小計(jì)算出其前 10%或其他 Ratio 的白色參考點(diǎn)的的閾值 T。
sumsort=sort(RGBsum(:)');
count=round(size(sumsort,2)*0.9);
T=sumsort(count);
index=RGBsum>T;
KR=max(R(:))/mean(R(index));
KG=max(G(:))/mean(G(index));
KB=max(B(:))/mean(B(index));
R1=R*KR;
G1=G*KG;
B1=B*KB;
out=cat(3,R1,G1,B1);
figure(1),
subplot(121),imshow(I),title('原始圖像');
subplot(122),imshow(out),title('完美反射法')
3)動(dòng)態(tài)閾值法
(1). ?把圖像 w*h 從 RGB 空間轉(zhuǎn)換到 YCrCb 空間。
(2). ?選擇參考白色點(diǎn):
? a. 把圖像分成寬高比為 4:3 個(gè)塊(塊數(shù)可選)。
? b. 對(duì)每個(gè)塊,分別計(jì)算 Cr,Cb 的平均值 Mr,Mb。
? c. 對(duì)每個(gè)塊,根據(jù) Mr,Mb,用下面公式分別計(jì)算 Cr,Cb 的方差 Dr,Db。
? d. 判定每個(gè)塊的近白區(qū)域(near-white region)。
判別表達(dá)式為:
設(shè)一個(gè)“參考白色點(diǎn)”的亮度矩陣 RL,大小為 w*h。
若符合判別式,則作為“參考白色點(diǎn)”,并把該點(diǎn)(i,j)的亮度(Y 分量)值賦給 RL(i,j);
?若不符合,則該點(diǎn)的 RL(i,j)值為 0。
(3). ?選取參考“參考白色點(diǎn)”中最大的 10%的亮度(Y 分量)值,并選取其中的最小值 Lu_min.
(4). ?調(diào)整 RL,若 RL(i,j)<Lu_min, ?RL(i,j)=0; 否則,RL(i,j)=1;
(5). 分別把 R,G,B 與 RL 相乘,得到 R2,G2,B2。?分別計(jì)算 R2,G2,B2 的平均值,Rav,Gav,Bav;
(6).? 得到調(diào)整增益:
? ? Ymax=double(max(max(Y)))/5;
? ??Rgain=Ymax/Rav;
? ? Ggain=Ymax/Gav;
? ? Bgain=Ymax/Bav;
(7). ?調(diào)整原圖像:
? ?Ro= R*Rgain;?
? ?Go= G*Ggain;?
? ?Bo= B*Bgain;
?
?
Matlab:
clear all;?
close all;
clc;
I=imread('test1.jpg');
im1=rgb2ycbcr(I);%將圖片的 RGB 值轉(zhuǎn)換成 YCbCr 值%
Lu=im1(:,:,1);
Cb=im1(:,:,2);
Cr=im1(:,:,3);
[H, W, L]=size(I);
tst=zeros(H,W);
%計(jì)算 Cb、Cr 的均值 Mb、Mr%
Mb=mean(mean(Cb));
Mr=mean(mean(Cr));
%計(jì)算 Cb、Cr 的均方差%
Db=sum(sum(Cb-Mb))/(H*W);
Dr=sum(sum(Cr-Mr))/(H*W);
%根據(jù)閥值的要求提取出 near-white 區(qū)域的像素點(diǎn)%
cnt=1;
for i=1:H
for j=1:W
b1=Cb(i,j)-(Mb+Db*sign(Mb));
b2=Cr(i,j)-(1.5*Mr+Dr*sign(Mr));
if (b1<abs(1.5*Db) & b2<abs(1.5*Dr))
Ciny(cnt)=Lu(i,j);
tst(i,j)=Lu(i,j);
cnt=cnt+1;
end
end
end
cnt=cnt-1;
iy=sort(Ciny,'descend');%將提取出的像素點(diǎn)從亮度值大的點(diǎn)到小的點(diǎn)依次排列%?
nn=round(cnt/10);
Ciny2(1:nn)=iy(1:nn);%提取出 near-white 區(qū)域中 10%的亮度值較大的像素點(diǎn)做參考白點(diǎn)%
%提取出參考白點(diǎn)的 RGB 三信道的值%
mn=min(Ciny2);
for i=1:H
for j=1:W?
if tst(i,j)<mn
tst(i,j)=0;
else
tst(i,j)=1;
end
end
end
R=I(:,:,1);
G=I(:,:,2);
B=I(:,:,3);
R=double(R).*tst;
G=double(G).*tst;
B=double(B).*tst;
%計(jì)算參考白點(diǎn)的 RGB 的均值%
Rav=mean(mean(R));
Gav=mean(mean(G));
Bav=mean(mean(B));
Ymax=double(max(max(Lu)))/15;%計(jì)算出圖片的亮度的最大值%
%計(jì)算出 RGB 三信道的增益%
Rgain=Ymax/Rav;
Ggain=Ymax/Gav;
Bgain=Ymax/Bav;
%通過增益調(diào)整圖片的 RGB 三信道%
im(:,:,1)=I(:,:,1)*Rgain;
im(:,:,2)=I(:,:,2)*Ggain;
im(:,:,3)=I(:,:,3)*Bgain;
%顯示圖片%
figure(1),
subplot(121),imshow(I),title('原始圖像');
subplot(122),imshow(im),title('動(dòng)態(tài)閾值法');