加入星計劃,您可以享受以下權益:

  • 創(chuàng)作內容快速變現(xiàn)
  • 行業(yè)影響力擴散
  • 作品版權保護
  • 300W+ 專業(yè)用戶
  • 1.5W+ 優(yōu)質創(chuàng)作者
  • 5000+ 長期合作伙伴
立即加入
  • 正文
    • 1 什么叫白平衡
    • 2 色溫是什么?
    • 3 常見的色溫
    • 4 白平衡算法
  • 相關推薦
  • 電子產(chǎn)業(yè)圖譜
申請入駐 產(chǎn)業(yè)圖譜

白平衡初探

2020/07/22
173
閱讀需 11 分鐘
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

1 什么叫白平衡

什么是白平衡呢?白平衡的英文為 White Balance,其基本概念是“不管在任何光源下,都能將白色物體還原為白色”,對在特定光源下拍攝時出現(xiàn)的偏色現(xiàn)象,通過加強對應的補色來進行補償。相機的白平衡設定可以校準色溫的偏差,在拍攝時我們可以大膽地調整白平衡來達到想要的畫面效果。

白平衡,字面上的理解是白色的平衡。白平衡是描述顯示器中紅、綠、藍三基色混合生成后白色精確度的一項指標。白平衡是電視攝像領域一個非常重要的概念,通過它可以解決色彩還原和色調處理的一系列問題。白平衡是隨著電子影像再現(xiàn)色彩真實而產(chǎn)生的,在專業(yè)攝像領域白平衡應用的較早。家用電子產(chǎn)品(家用攝像機、數(shù)碼照相機)中也廣泛地使用,然而技術的發(fā)展使得白平衡調整變得越來越簡單容易,但許多使用者還不甚了解白平衡的工作原理,理解上存在諸多誤區(qū)。它是實現(xiàn)攝像機圖像能精確反映被攝物的色彩狀況,有手動白平衡和自動白平衡等方式。許多人在使用數(shù)碼攝像機拍攝的時候都會遇到這樣的問題:在日光燈的房間里拍攝的影像會顯得發(fā)綠,在室內鎢絲燈光下拍攝出來的景物就會偏黃,而在日光陰影處拍攝到的照片則莫名其妙地偏藍,其原因就在于白平衡的設置上。

在我們使用的相機上,都可以設定白平衡,大多數(shù)的人都設定成自動白平衡,這個方式簡單又方便,大部分情況下也可以滿足日常拍攝的需求。相機會分析我們拍攝場景的光線環(huán)境,并且盡力還原白色,光的色調是通過色溫來實現(xiàn)的,色溫會告訴相機這些光是暖色調還是冷色調。在我們使用的相機上,都可以設定白平衡,大多數(shù)的人都設定成自動白平衡,這個方式簡單又方便,大部分情況下也可以滿足日常拍攝的需求。相機會分析我們拍攝場景的光線環(huán)境,并且盡力還原白色,光的色調是通過色溫來實現(xiàn)的,色溫會告訴相機這些光是暖色調還是冷色調。

2 色溫是什么?

色溫說的是光線的溫度,比如暖光或者冷光。色溫的測量單位是開爾文,表示為 K,也就是我們平常經(jīng)常再說色溫的時候,見到的比如 5000k, 4500k 這個概念。

? 1)冷光,色溫高,偏藍

? 2)暖光,色溫低,偏紅

現(xiàn)在我們是不是大概明白色溫的意思了。色溫其實并不難懂,上圖當中色溫從高到低,顏色也由偏藍的冷光到偏黃的暖光。

3 常見的色溫

有一些常見的場景的色溫,我們需要比較熟悉,這樣可以幫助我們快速的判斷我們的拍攝場景,選擇合適的色溫。

  • 陰天的下午或陰天:6000-7000K

  • 直接正午的陽光:5200-5500K

  • 白色熒光燈:4000K

  • 白熾燈:2800K

  • 蠟燭:1800K

4 白平衡算法

1)原始的灰度世界算法  

灰度世界算法(Gray World)是以灰度世界假設為基礎的,該假設認為對于一幅有著大量色彩變化的圖像, R、 G、 B 三個分量的平均值趨于同一個灰度 K。一般有兩種方法來確定該灰度。

(1)直接給定為固定值, 取其各通道最大值的一半,即取為 127 或 128;

(2)令 K = (Raver+Gaver+Baver)/3,其中 Raver,Gaver,Baver 分別表示紅、 綠、 藍三個通道的平均值。

算法的第二步是分別計算各通道的增益:

? Kr=K/Raver;

? ? Kg=K/Gaver;

? ? Kb=K/Baver;?

算法第三步為根據(jù) Von Kries 對角模型,對于圖像中的每個像素 R、G、B,計算其結果值:

? ? Rnew = R * Kr;?

? ? Gnew = G * Kg;?

? ? Bnew = B * Kb;?

?對于上式,計算中可能會存在溢出(>255,不會出現(xiàn)小于 0 的)現(xiàn)象,處理方式有兩種。

? ? ?a、 直接將像素設置為 255,這可能會造成圖像整體偏白。

? ? b、 計算所有 Rnew、Gnew、Bnew 的最大值,然后利用該最大值將將計算后數(shù)據(jù)重新線性映射到[0,255]內。實踐證明這種方式將會使圖像整體偏暗,建議采用第一種方案。

Matlab 實現(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('自動白平衡圖像');

2)完美反射算法

原理:完美全反射理論 perfect Reflector 假設圖像上最亮點就是白點,并以此白點為參考對圖像進行自動白平衡,最亮點定義為 R+G+B 的最大值,具體編碼步驟如下:?

(1)計算每個像素的 RGB 之和,并保存到一臨時內存塊中。

(2)按 R+G+B 值的大小計算出其前 10%或其他 Ratio 的白色參考點的的閾值 T。

(3)遍歷圖像中的每個點,計算其中 R+G+B 值大于 T 的所有點的 RGB 分量的累積和的平均值。

(4)對每個點將像素量化到[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)計算每個像素的 RGB 之和,并保存到一臨時內存塊中。

RGBsum=R+G+B;

%(2)按 R+G+B 值的大小計算出其前 10%或其他 Ratio 的白色參考點的的閾值 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)動態(tài)閾值法

(1). ?把圖像 w*h 從 RGB 空間轉換到 YCrCb 空間。

(2). ?選擇參考白色點:

? a. 把圖像分成寬高比為 4:3 個塊(塊數(shù)可選)。

? b. 對每個塊,分別計算 Cr,Cb 的平均值 Mr,Mb。

? c. 對每個塊,根據(jù) Mr,Mb,用下面公式分別計算 Cr,Cb 的方差 Dr,Db。

? d. 判定每個塊的近白區(qū)域(near-white region)。

判別表達式為:

設一個“參考白色點”的亮度矩陣 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)))/5;

? ??Rgain=Ymax/Rav;

? ? Ggain=Ymax/Gav;

? ? Bgain=Ymax/Bav;

(7). ?調整原圖像:

? ?Ro= R*Rgain;?

? ?Go= G*Ggain;?

? ?Bo= B*Bgain;

?
?

Matlab:

clear all;?

close all;

clc;

I=imread('test1.jpg');

im1=rgb2ycbcr(I);%將圖片的 RGB 值轉換成 YCbCr 值%

Lu=im1(:,:,1);

Cb=im1(:,:,2);

Cr=im1(:,:,3);

[H, W, L]=size(I);

tst=zeros(H,W);

%計算 Cb、Cr 的均值 Mb、Mr%

Mb=mean(mean(Cb));

Mr=mean(mean(Cr));

%計算 Cb、Cr 的均方差%

Db=sum(sum(Cb-Mb))/(H*W);

Dr=sum(sum(Cr-Mr))/(H*W);

%根據(jù)閥值的要求提取出 near-white 區(qū)域的像素點%

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');%將提取出的像素點從亮度值大的點到小的點依次排列%?

nn=round(cnt/10);

Ciny2(1:nn)=iy(1:nn);%提取出 near-white 區(qū)域中 10%的亮度值較大的像素點做參考白點%

%提取出參考白點的 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;

%計算參考白點的 RGB 的均值%

Rav=mean(mean(R));

Gav=mean(mean(G));

Bav=mean(mean(B));

Ymax=double(max(max(Lu)))/15;%計算出圖片的亮度的最大值%

%計算出 RGB 三信道的增益%

Rgain=Ymax/Rav;

Ggain=Ymax/Gav;

Bgain=Ymax/Bav;

%通過增益調整圖片的 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('動態(tài)閾值法');

相關推薦

電子產(chǎn)業(yè)圖譜

lee
lee

從數(shù)字出發(fā),走進圖像世界,聆聽音頻的美妙旋律。從電路出發(fā),實現(xiàn)美妙的算法,展示代碼的美奐。從知識到實現(xiàn),歡迎大家關注公眾號FPGA開源工作室。