白平衡之灰度世界算法與鏡面算法
一、引言
色彩是人眼的對可視光的一種感知。對於不透明的物體而言,人眼所形成的色彩感知取決於光照光譜分布、物體表面光的反射性和人眼(或者其它光信號接收器)的光敏特性。在光信號接收器的光敏特性保持不變,物體也保持不變的情況下,人眼對該物體的色彩感知就取決於光照的光譜分布。由於人眼視覺的色彩恆常性,當環境光發生變化的時候,我們人類的視覺系統具有某種調節能力,可以讓我們的大腦還原物體表面的不變特征,但是對於像照相機這樣的光信號接收器,它只能如實地記錄所接收到的光信號,因此在不同光源下所得到的圖像在我們人類看起來會有色彩的偏差,下圖所展示就是由於光源的不同造成同一物體色差不同的例子。

為了能夠讓照相機等成像設備可以具有類似於人眼的視覺調節能力,在不同的光照情況下,使所獲取的圖像顏色保持一致,對所獲得圖像所做的處理就叫做白平衡。在專業的攝像領域,相機可以通過調節自身光敏器件對可見光中不同顏色單色光的敏感性來實現對圖像的白平衡,以達到攝影師所想要的效果。對於已經獲取的圖像,如果因為光照原因出現色彩的偏差的話,我們有時候也寄希望於通過現有圖像來得到圖像獲取時的光照信息,基於這些信息來對圖像進行調整以獲得在某種標准光源下的圖像,於是就產生了很多白平衡的算法,其中灰度世界算法和鏡面法是較為常用白平衡算法。
二、基本原理——Von Kries色適應理論
Von Kries提出,可用一個對角矩陣變換來描述兩種光照條件下同一物體表面顏色之間的關系[1]。該理論認為,對於同一個觀察者而言,假設在光源A下面,一個物體的RGB值為RGB1=[R1,G1,B1],如果在光源B下面同一個物體的RGB值為RGB2=[R2,G2,B2],那么RGB1與RGB2之間存在這如下轉換關系。
RGB2’=[kr,0,0;0,kg,0;0,0,kb]RGB1',其中kr、kg和kb分別為R、G、B三個通道的校正系數。我們接下來將要介紹的灰度世界算法和鏡面法的理論都是建立在這一原理的基礎上的,需要注意的是,這個理論在某些條件下是不適用的。
三、灰度世界算法
3.1算法理論
該理論假設:對於一副有着豐富色彩的圖片,圖像上R、G、B三個通道的平均值應該等於一個被稱為“灰色”的值K[2]。理論中最重要的一點就是“灰色”的定義和選擇問題。有多種方法對理論中的“灰色”進行定義,在此不詳細討論這一點。至於“灰色”的選擇,一種方法是將其定義為各通道最大值的一半,還可以將待處理圖片三個通道均值的均值作為“灰色”值K。當確定了灰色值K之后,將待處理圖片轉換到經典光源下的各個校正系數分別為:kr=K/Rmean,kg=K/Gmean,kb=K/Bmean,其中Rmean,Gmean和Bmean分別為圖像R、G、B通道的均值。
3.2 算法的matlab實現
%白平衡灰度世界算法
clc;
clear;
subplot(1,3,1);
I=imread('WB4.jpg');%可以將圖片路徑換為自己的待校正的圖片路徑
imshow(I);
title('原始圖像');
I=im2double(I);%將8位的RGB圖像轉為double類型的圖像,防止在后面運算各個通道的數值時出現數據損失
%計算圖片各個通道的平均值
Rmean=mean(mean(I(:,:,1)));
Gmean=mean(mean(I(:,:,2)));
Bmean=mean(mean(I(:,:,3)));
%計算標准灰度
k=mean([Rmean,Gmean,Bmean]);
%計算各個通道的增益
k_r=k/Rmean;
k_g=k/Gmean;
k_b=k/Bmean;
%生成新的圖像
inew_r=k_r*I(:,:,1);
inew_g=k_g*I(:,:,2);
inew_b=k_b*I(:,:,3);
%由於新生成的RGB三通道中有可能出超出255的灰度值,需要將新生成的圖像映射到[0,255]這一區間內
%方法1:將各通道中灰度值大於255的像素點的灰度直接設置為255
[M,N]=size(inew_r);
inew_r1=inew_r;
inew_g1=inew_g;
inew_b1=inew_b;
for i=1:M
for j=1:N
if(inew_r1(i,j)>1) inew_r1(i,j)=1;end
if(inew_g1(i,j)>1) inew_g1(i,j)=1;end
if(inew_b1(i,j)>1) inew_b1(i,j)=1;end
end
end
inew=cat(3,inew_r1,inew_g1,inew_b1);
inew=im2uint8(inew);
subplot(1,3,2);
imshow(inew);
title('取最大值');
%方法2:將新生成的各個通道的像素進行歸一化處理
factor_r=max(max(inew_r));
factor_g=max(max(inew_g));
factor_b=max(max(inew_b));
inew_r2=inew_r;
inew_g2=inew_g;
inew_b2=inew_b;
if(factor_r>1) inew_r2=inew_r/factor_r;end
if(factor_g>1) inew_g2=inew_g/factor_g;end
if(factor_b>1) inew_b2=inew_b/factor_b;end
inew=cat(3,inew_r2,inew_g2,inew_b2);
subplot(1,3,3);
imshow(im2uint8(inew));
title('歸一化');
程序運行效果演示如下圖所示。

四、鏡面法(完美反射法)
4.1 算法原理
算法假設:圖像中的“鏡面”可以完全發射光源照射在物體上面的光線。因此,如果圖像中存在一個“鏡面”的話,那么在特定光源下,可以將所獲得的“鏡面”的色彩信息認為是當前光源的信息。在進行校准的時候,我們假設圖片上存在一個可以完全反射光源的“鏡面”,那么在經典光源下圖片中就應該存在一個三刺激值為[255,255,255]純白色像素點(注意:有多種白色點的定義),此時的校准系數可以定義為kr=255/Rmax,kg=255/Gmax,kb=255/Bmax,其中Rmax,Gmax和Bmax分別為圖像R、G、B通道的最大值。
4.2 算法的matlab實現
clc;
clear;
subplot(1,2,1);
I=imread('WB7.jpg');%可以將圖片路徑換為自己的待校正的圖片路徑
imshow(I);
title('原始圖像');
I=im2double(I);%將8位的RGB圖像轉為double類型的圖像,防止在后面運算各個通道的數值時出現數據損失
%求各個通道的最大值
max_r=max(max(I(:,:,1)));
max_g=max(max(I(:,:,2)));
max_b=max(max(I(:,:,3)));
%求各個通道相對於所選定白光的偏移量,我以RGB三刺激值為[255,255,255],在double類型的情況下就是[1,1,1]的白作為所選定的白光
q_r=1/max_r;
q_g=1/max_g;
q_b=1/max_b;
%根據偏移量計算新的RGB矩陣
new_r=I(:,:,1)*q_r;
new_g=I(:,:,2)*q_g;
new_b=I(:,:,3)*q_b;
%拼合三個通道
inew=cat(3,im2uint8(new_r),im2uint8(new_g),im2uint8(new_b));
inew=im2uint8(inew);
subplot(1,2,2);
imshow(inew);
title('鏡面法白平衡');
算法運行效果如下:

總結
灰度世界算法與鏡面法由於簡單、計算量小等優點成為常用的白平衡算法,但是它們也各自有各自的缺點。由於灰度世界算法是基於灰度世界的假設,當圖片中沒有足夠豐富的色彩來近似理想情況時,灰度世界算法的白平衡效果就差強人意。同樣的,如果圖片中不存在一個較為理想的反射鏡面,鏡面法的白平衡效果也不夠好。因此在應用中,會根據使用環境的不同,對算法進行改進,筆者水平有限只介紹了最基本的內容。由於筆者對這兩種算法的理論假設和推理還不能夠完全理解,本篇博客中難免出現錯誤,還請各位大牛指正。
引用
[1]朱貴冬, 沈理, 王今覺. 基於von-Kries色適應的分區顏色校正方法[J]. 計算機工程與科學, 2007, 29(2):50-52.
[2]嚴世珺. 數字圖像白平衡處理算法研究與改進[D]. 上海交通大學, 2008.
版權聲明:本篇博客為作者原創博客,轉載請注明出處。
