天天看點

ISP——AWB(Auto White Balance)ISP——AWB(Auto White Balance)

ISP——AWB(Auto White Balance)

現象

ISP——AWB(Auto White Balance)ISP——AWB(Auto White Balance)

幾個概念

人眼具有顔色恒常性,可以避免光源變化帶來的顔色變化,但是圖像傳感器不具備這種特性,進而造成色偏,白平衡就是需要校正這個顔色的偏差;

  • 顔色恒常性:顔色恒常是指在照度發生變化的條件下人們對物體表面顔色的知覺趨于穩定的心理傾向;
  • 色溫的定義:色溫描述的是具有一定表面溫度的“黑體”(blackbody)的輻射光的光譜特性。簡單的了解就是顔色随溫度的變化規律,比如生鐵就是黑色,加熱會變成橘紅色,繼續加熱到液态會呈現偏白的顔色,這種随溫度而産生的顔色變化就光譜特性。

白平衡校正

  • 手動白平衡:在拍照前通過拍攝一個18度灰的卡片,然後計算出當時環境的白平衡的gain值對後面的圖檔進行校正;
  • 自動白平衡:camera通過自己本身的算法,通過擷取的圖像自動計算出gain值對圖像進行校正的方式。

自動白平衡算法講解

灰階世界法

ISP——AWB(Auto White Balance)ISP——AWB(Auto White Balance)

灰階世界算法基于一個假說:任一幅圖像,當它有足夠的色彩變化,則它的RGB分量的均值會趨于相等。這是一個在自動白平衡方面應用極為廣泛的理論。如上圖一個顔色足夠充足的畫面裡,假說RGB三個通道的均值是相同的。

對此算法的流程如下:

  • 計算各個顔色通道的平均值;
  • 尋找一個參考值K,一般情況選取Gmean;
  • 計算Rgain = Gmean/Rmean, Bgain = Gmean/Bmean;
  • 對圖像中的每個像素都乘以對應的gain值進行校正;

完全反射法

完全反射也是基于一個假說:基于這樣一種假設,一幅圖像中最亮的像素相當于物體有光澤或鏡面上的點,它傳達了很多關于場景照明條件的資訊。如果景物中有純白的部分,那麼就可以直接從這些像素中提取出光源資訊。因為鏡面或有光澤的平面本身不吸收光線,是以其反射的顔色即為光源的真實顔色,這是因為鏡面或有光澤的平面的反射比函數在很長的一段波長範圍内是保持不變的。完美反射法就是利用用這種特性來對圖像進行調整。算法執行時,檢測圖像中亮度最高的像素并且将它作為參考白點。基于這種思想的方法都被稱為是完美反射法,也稱鏡面法。通俗的意思就是整個圖像中最亮的點就是白色或者鏡面反射出來的,那麼最亮的點就是光源的屬性,但是該點本身應該是白點,以此為基礎就可計算出gain值進而進行校正。

具體步驟如下,以紅色通道為例:

ISP——AWB(Auto White Balance)ISP——AWB(Auto White Balance)

灰階世界和完美反射結合法

就是将灰階世界和完美反射算法進行融合,具體公式如下

ISP——AWB(Auto White Balance)ISP——AWB(Auto White Balance)

通過上面的方程組就可以解出 u r u^{r} ur和 v r v^{r} vr 然後對原像素進行校正:

R n e w = u r R o r g 2 + v r R o r g R_{new}=u^{r} R_{org}^{2}+v^{r} R_{org} Rnew​=urRorg2​+vrRorg​

基于模糊邏輯的算法

ISP——AWB(Auto White Balance)ISP——AWB(Auto White Balance)

如圖圓圈表示該顔色本身應該在坐标系中所處的位置,箭頭分别表示随色溫的變化發生的偏移,這個是通過先驗知識得到的,後面再通過這個進行校正。

ISP——AWB(Auto White Balance)ISP——AWB(Auto White Balance)

通過以上兩種方式将圖像分成8塊,然後通過模糊邏輯的方式計算出每個快的一個權重,這個權重和亮度和色度相關,然後通過模糊邏輯方式進行确定。求得權重後就可以計算出整個圖像的權重均值,如下圖10a,黑點表示八個塊的分布,X表示權重後整個圖像的位置。然後目的是要讓權重的這個值往白點上靠,就通過調整增益的方式調試,調整完增益後,每個塊兒的均值又會發生變化,然後又重新計算出每個塊的權重,再通過權重計算出整個圖像的均值,如圖10b,整個圖像的均值已經靠近原點了。然後如果X和白點的差距在一個設定的範圍内則認為完成白平衡,否則繼續調整增益重複上述步驟進行校正。

ISP——AWB(Auto White Balance)ISP——AWB(Auto White Balance)

基于白點的算法

  1. 将RGB顔色空間轉換到YUV空間,轉換公式如下:
ISP——AWB(Auto White Balance)ISP——AWB(Auto White Balance)
  1. 通過限定YUV的區域來判斷是否為白點,如下論文通過四個限制條件倆限制白點,滿足條件的點就是白點,參與後續的計算,否則不是點直接舍棄
    ISP——AWB(Auto White Balance)ISP——AWB(Auto White Balance)
  2. 通過以上四個限制條件找到白點集合後,就可以對白點集合運用GW算法或者其他算法計算gain值進而進行後續的校正;

基于色溫的方法

ISP——AWB(Auto White Balance)ISP——AWB(Auto White Balance)
  1. 通過在不同色溫的環境下拍攝灰卡可以得到上面的兩個曲線,一個是gain值的關系曲線,另一個是R/G與色溫T的關系,那麼如果擷取了一張圖像知道了拍攝的色溫,就可以通過第二張圖擷取R/G的值,然後将這個值代回圖一就能計算出B/G進而獲得R和B的gain值;
  2. 通過一定的技術手段擷取色溫即可,一種方法就是通過加一個色溫傳感器擷取環境色溫,這個努比亞和oppo都有相關的專利提到,這個不是正常的方式不講解。另一種就是通過計算求出T,下面的論文就提供了一種方式
    ISP——AWB(Auto White Balance)ISP——AWB(Auto White Balance)
    該算法通過以下步驟疊代擷取色溫:
    • 定義Tmin=2000K,Tmax=15000K;
    • 判斷Tmax-Tmin是否大于10,如果小如或等于10,那麼久可以直接傳回T,此時T可以去min,man或者二者的均值,如果滿足大于10的條件,則T=(Tmin+Tmax)/2;
    • 通過圖中一些列的公式,通過T就可以計算出一個R’G’B’。這些公式都是通過實驗拟合總結的;
    • 對于原始圖像可以求出各個通道的均值RGB,如果B’/R’>B/R那麼Tmax=T,否則Tmin=T;重複上述步驟即可疊代求出色溫T。

基于邊緣的方法

ISP——AWB(Auto White Balance)ISP——AWB(Auto White Balance)
  1. 先通過一定的手段,比如梯度的方式求出圖像中的邊緣,然後在邊緣各側各取兩個點參與計算;
  2. 通過上述得到的參考點集合,就可以運作灰階世界或者其他的算法求出gain值;

該算法的有點在于,減少的大色塊的幹擾,因為一般認為邊緣就是色塊變化的的分界線,那麼提取邊緣兩側的樣本點就可以滿足顔色充分的條件,那麼就可以運用灰階世界法求出gain.而且有大色塊的時候計算的也是也隻是選取邊緣的幾個點,就可以避免大色塊分量太大造成白平衡異常的問題。

多方法融合法

ISP——AWB(Auto White Balance)ISP——AWB(Auto White Balance)

如圖是一款ISP主要的白平衡tuning的圖檔。每個藍色的框就代表一種色溫,比如9代表2000K,8代表2500K,這個是通過實驗和經驗值确定的。圖中綠色的點就是通過白點算法篩選出來的白點候選點。然後調試的時候就是在不同色溫下拍攝灰卡,然後挪動藍色選框,使其包圍綠點,然後右上角就是估計色溫,調試的時候就是使得這個估計色溫和真實色溫不要相差太多。然後通過标定若幹組色溫之後就确定了該方案的一個色溫曲線。後續在pipeline中通過白點檢測算法篩選出白點,然後根據白點的分布,可以找到大多數白點分布的色溫,那麼該色溫就是目前的色溫,然後通過色溫再按照前面提到的算法就可以計算出一個gain值,然後再和灰階世界算法進行一個blending就可以得到最終ISP中使用的gain值。

代碼實作

用代碼實作GW,PR和QCGP算法,核心代碼如下,完整代碼可以在gitee倉庫中下載下傳,然後該算法也有Python版的在倉庫中

gw.m代碼:

function correctedImg = gw(img)
% gw.m    correct wb with gray world
%   Input:
%       img             org image
%   Output:
%       correctedImg    the corrected image
%   Instructions:
%       author:     wtzhu
%       e-mail:     [email protected]
% Last Modified by wtzhu v1.0 2021-07-30
% Note: 
[height, width, ch] = size(img);
r = img(:,:,1);
g = img(:,:,2);
b = img(:,:,3);

% get the mean of three channels
rMean = double(mean(mean(r)));
gMean = double(mean(mean(g)));
bMean = double(mean(mean(b)));

% get the rGain and bGain based on gMean to make sure that 
% the mean of the three channels are the same value after correcting,;
rGain = gMean / rMean;
bGain = gMean / bMean;

correctedImg = zeros(height, width, ch);
correctedImg(:,:,1) = r * rGain;
correctedImg(:,:,2) = g;
correctedImg(:,:,3) = b * bGain;
% make sure there is no overflow
correctedImg(correctedImg>255) = 255;
correctedImg = uint8(correctedImg);
end
           

pr.m代碼:

function correctedImg = pr(img)
% pr.m    correct wb with perfect reflector
%   Input:
%       img             org image
%   Output:
%       correctedImg    the corrected image
%   Instructions:
%       author:     wtzhu
%       e-mail:     [email protected]
% Last Modified by wtzhu v1.0 2021-07-30
% Note: 
[height, width, ch] = size(img);
r = img(:,:,1);
g = img(:,:,2);
b = img(:,:,3);

rMax = double(max(max(r)));
gMax = double(max(max(g)));
bMax = double(max(max(b)));

rGain = gMax / rMax;
bGain = gMax / bMax;

correctedImg = zeros(height, width, ch);
correctedImg(:,:,1) = r * rGain;
correctedImg(:,:,2) = g;
correctedImg(:,:,3) = b * bGain;
% make sure there is no overflow
correctedImg(correctedImg>255) = 255;
correctedImg = uint8(correctedImg);

end
           

QCGP代碼:

function correctedImg = qcgp(img)
% qcgp.m    correct wb with QCGP
%   Input:
%       img             org image
%   Output:
%       correctedImg    the corrected image
%   Instructions:
%       author:     wtzhu
%       e-mail:     [email protected]
% Last Modified by wtzhu v1.0 2021-07-30
% Note: 
I = double(img);
[height, width, ch] = size(img);
r = I(:,:,1);
g = I(:,:,2);
b = I(:,:,3);

% get the mean and max of three channels
rMean = double(mean(mean(r)));
gMean = double(mean(mean(g)));
bMean = double(mean(mean(b)));

rMax = double(max(max(r)));
gMax = double(max(max(g)));
bMax = double(max(max(b)));

kMean = mean([rMean, gMean, bMean]);
kMax = mean([rMax, gMax, bMax]);

correctedImg = zeros(height, width, ch);

% calculate the coefficient
a = [rMean.*rMean, rMean; rMax.*rMax, rMax];
p = a \ [kMean; kMax];
correctedImg(:,:,1) = p(1) * (r.*r) + p(2) * r;

a = [gMean.*gMean, gMean; gMax.*gMax, gMax];
p = a \ [kMean; kMax];
correctedImg(:,:,2) = p(1) * (g.*g) + p(2) * g;


a = [bMean.*bMean, bMean; bMax.*bMax, bMax];
p = a \ [kMean; kMax];
correctedImg(:,:,3) = p(1) * (b.*b) + p(2) * b;

% make sure there is no overflow
correctedImg(correctedImg>255) = 255;
correctedImg = uint8(correctedImg);
end
           
ISP——AWB(Auto White Balance)ISP——AWB(Auto White Balance)

相關連結

  • zhihu: ISP圖像處理 - 知乎 (zhihu.com)
  • CSDN:ISP圖像處理_wtzhu_13的部落格-CSDN部落格
  • Bilibili:食魚者的個人空間_哔哩哔哩_Bilibili
  • Gitee:ISPAlgorithmStudy: ISP算法學習彙總,主要是論文總結 (gitee.com)

繼續閱讀