本文轉載wzwxiaozheng的白平衡算法,主要包括兩部分:色溫曲線和色溫計算。原文http://blog.csdn.net/wzwxiaozheng/article/details/38434391
1,白平衡算法---色溫曲線
本文大體講解了白平衡的算法流程,適用于想了解和學習白平衡原理的筒子們.
一般情況下要實現AWB算法需要專業的圖像和算法基礎,本文力圖通過多圖的方式,深入淺出,降低初學者理解上的門檻,讓大家都理解到白平衡算法流程.
看到這里還在繼續往下瞄的同學,一定知道了色溫的概念,并且知道sensor原始圖像中的白色如果不經AWB處理,在高色溫(如陰天)下偏藍,低色溫下偏黃,如賓館里的床頭燈(WHY!OTZ) (如下圖).
?
下面這個T恤的圖片非常經典,怎么個經典后續再說,不過大體可以看出有偏黃和偏藍的情況.雖然如此,卻已經是AWB矯正以后的效果.
?
所以,為了眼前的女神白富美在鏡頭里不變成阿凡達和黃臉婆,這時就需要白平衡來工作了.
流程原理很簡單:
1,在各個色溫下(2500~7500)拍幾張白紙照片,假設拍6張(2500,3500…7500),可以稱作色溫照.
2,把色溫照進行矯正,具體是對R/G/B通道進行轎正,讓偏色的白紙照變成白色,并記錄各個通道的矯正參數.
? ?實際上只矯正R和B通道就可以,這樣就得到了6組矯正參數(Rgain,Bgain).
3,上面是做前期工作,愛思考的小明發現,只要知道當前場景是什么色溫,再轎正一下就可以了.事實上也就是如此.
所以,AWB算法的核心就是判斷圖像的色溫,是在白天,晚上,室內,室外,是烈日還是夕陽,還是在陽光下的沙灘上.或者是在臥室里”暖味”的床頭燈下.
之前拍了6張色溫照以及6組矯正參數.可是6夠么,當然不夠, 插值一下可以得到無數個值,我們把點連成線, 得到了一個神奇的曲線------色溫曲線.大概是下面這個樣子.
?
上面提到了三個值(RG,BG,色溫),這應該是個三維的.沒關系,我們再來一條RG跟色溫的曲線,這樣只要知道色溫,就知道RG,知道RG,就知道BG,知道RG,BG就能轎正了,yes!
?
至此,我們的前期工作已經全部做完了, 并得到了AWB的色溫曲線,下一步只要計算得到當前色溫,順藤摸瓜就能得到當前的矯正參數(Rgain,Bgain),那白平衡的工作就作完了.(放心,當然沒這么簡單)
2,色溫計算
本文主要講解了白平衡算法中估算當前場景色溫的流程.
色溫計算的原理并不復雜,但是要做好,還是要細心做好每一步工作,這需要大量的測試,并對算法不斷完善.
首先簡單說一下流程:
1, 取一幀圖像數據,并分成MxN塊,假設是25x25,并統計每一塊的基本信息(,白色像素的數量及R/G/B通道的分量的均值).

2, 根據第1步中的統計值, 找出圖像中所有的白色塊,并根據色溫曲線判斷色溫.
3, 至此,我們得出來了圖像中所有的可能色溫,如果是單一光源的話,可以取色溫最多的,當作當前色溫.
?? 比如25x25=625 個塊中,一共找出了100個有效白色塊, 里面又有80個白色塊代表了色溫4500左右, 那當前色溫基本就是4500.
?? 根據4500色溫得出的Rgain,Bgain來調整當前圖像,就不會差(很多!).

下面我們再詳細講解一下,每一步中需要做的工作:
第1步, 計算每一塊的基本信息.
?? 關于白色像素統計,大家知道sensor原始圖像是偏色的,怎么統計塊中的白色點呢,那只有設置一個顏色范圍,只要在范圍中,就可以認為是白色像素,范圍見下圖:

統計白色像素個數的用處是,1,如果塊中的白色像素太少,可以拋棄掉. 2,如果白色像素太多,多到每一個像素點都是,那也要拋棄掉,因為很可能在該區域過曝了
?? 接著把統計到的白色像素點R/G/B取均值, 并得到該block 的R/G,? B/G值
?? 至此,我們得到了每一塊的白點數目及R/G,B/G的值. (請自動對應第1部分中色溫曲線).
第二步 計算當前色溫
?? 這個比較復雜, 大自然絢麗多彩,景色萬千. 上一步中統計的”白色點”難免會有失誤的地方,比較常見的如黃色皮膚容易被誤判為低色溫下的白點,淡藍色的窗簾,容易被誤判為高色溫下的白點,一張圖中既有白色,也有黃色,也有藍色的時候,是不是感覺情況有點復雜,其它的大家可繼續腦補.
? ?這時我們需要一定的策略來正確的判斷出到哪個才是真的白.
?? 通常我們會把取到的白色塊,計算一下到曲線的距離,再設置相應的權重.話不多說,上個圖大家就都明白了.

假設有上面這樣一幅圖,該圖是在沒有開AWB的前提下截取的,可以看到左邊白色地方略有偏綠,當前色溫是室內白熾燈,大概4000~5000k左右.(請忽略顏色不正的問題,我們在討論白平衡)
下面我們就根據之前的統計信息和測量好的色溫曲線進行白平衡矯正.
首先要找出白區,如下圖:

上面這個圖中的數字標示出了檢測到的白色區域,數字相同的表示一個白區,根據統計信息(白點數,rg/bg值)來區分的.可以看到有誤判的地方,比如色卡左上第二塊的膚色塊.還有最右邊從上面數第二塊也是容易被判斷成低色溫白塊的情況.
針對這種誤判的情況,對不同塊根據統計信息進行權重設置,以求讓誤判的區域對最終結果影響小一些.

上面這個圖標注了權重,基本是根據統計信息中白點數來確定的.可以看到圖中一片白色被標識了高權重.其它情況被標識了低權重. 權重高低一是看塊中白色點數量,二是看rg/bg到色溫曲線的距離.
?? 通過上面兩個圖,大家就可以明顯的找到白色區,并根據曲線來矯正,即使不通過曲線矯正,把白色區的r/g,b/g值向1趨近,讓r=g=b,也會得到非常好的白平衡效果.如下圖所示:

至此,白平衡的基本流程就講完了,有圖有真相,大家一定看著也方便.
總結一下:第一次做白平衡,感覺理論很簡單,不用什么基礎也能看懂.實際算法調試時,可謂差之毫厘,失之千里.總是感覺不由自主就走上歪路.中間參考了大量資料,比如網上有許多基于色溫/灰度世界/白點檢測的白平衡算法,實際個人感覺應該把它們都結合起來,讓算法強壯,健康才是我們想要的.
還記得第一章中開始的那兩張白色T恤的圖么,算了,我再貼一下:

這張圖可以理解為在多光源下的白平衡調整.陰影色溫比陽光下色溫要高一些,如果陽光下是5000k,陰影可能是7000k.有光就有影,它們經常出現在一個鏡頭里,對著其中一個色溫調,另一邊就會偏色.為了整體效果好,要把翹翹板平衡起來,可以加一些策略在里面。