【一種基於暗通道優先的快速自動白平衡演算法】改進思路
最近搜尋了一下自動白平衡演算法的相關文章,歸納起來一種有四種:
1. 灰度世界法
2. 完美對映法
3. 自動閾值法
4. 暗通道優先的演算法: 這是篇論文,從文中的結論來看,該方法比上面3種要好一些。後面會給出論文的相關連結。
下面介紹第4中演算法的原理及改進方法
演算法描述:
定義g(x,y)是由影象感測器獲取的一幅影象,f(x,y)是真實光照的影象,則感測器的成像模型我們可以定義為
g(x,y)=f(x,y)t(x,y)+A(1−t(x,y)), | (1) |
式中: (x,y)是影象中對應畫素的座標,t
(2)
式中:R(x,y),G(x,y),B(x,y)代表偏色影象中對應(x,y)點的r,g,b通道的值。
根據暗通道的先驗知識可以得到:
(3)
式中Ω(x,y)是(x,y)畫素對應的一個鄰域。對於一個小的鄰域來說,光照透射率t(x,y)是恆定的,可以得到:
(4)
式中:gc(x,y)表示g(x,y)鄰域中r
(5)
從式(2)、式(5)可以得到,影象中白色區域或者高飽和度區域的光線透射率較低,本文提出的演算法就是根據以上特性來計算影象中白色區域。但是如果影象中存在比較強的光源或者高飽和度的區域,這些區域就會被錯誤檢測為白色區域,最終導致結果出現較大偏差。為了解決這個問題,本文設定一個閾值來去除高飽和度區域。
式中:T(x,y)是對應的白色區域閾值變換之後的二值影象,K為本文設定的一個變換閥值。t1為平均透射率,如式(7):
(7)
圖 1(a)中紅色框的區域由於室外強光的照射,在畫素級別上是非常接近白色的,如果將其當作正常白色區域來計算,結果會出現較大的偏差。圖 1(d)是本文的方法提取到的白色區域。
為了得到可靠的閾值K,本文從測試資料集中隨機選擇了200幅含有較多高飽和區域的影象做統計實驗,最終K的值選擇為230,即大於230認為是過飽和區域。圖 2中的曲線是本文演算法中選擇不同的K值得到的平均誤差和最小誤差,可以看出,在K= 230時,最小誤差和平均誤差均最小。當K< 200時,很多真實的白色點被排除掉,導致找到較少白色點,最終誤差較大;當K= 255時,即不限制飽和區域,從圖 2中的曲線以看出,限制K= 230比不限制K值誤差降低了約26%。
得到白色區域後,使用白色區域的均值來計算r,g,b三個通道的校正增益:
(8)
接下來可以根據計算的增益來校正影象,如果直接校正影象的話可能導致影象亮度發生較大的變化。這就需要對增益做歸一化處理。
CIE-XYZ顏色空間能夠很好地反映色度特性,因此本文使用CIE-XYZ顏色空間相對於Y來對R,G,B做歸一化處理,根據CIE-XYZ空間定義可以得到Y通道的增益為
(9)
通過Y通道的增益,用下面的公式來校正影象:
(10)
式中:fw為校正後的影象,WY為Y通道校正增益,Wr,g,b為r,g,b三個通道的校正增益。
在實際使用中,白平衡演算法多數是在嵌入式系統上執行的,比如監控相機、工業照相機等。為降低功耗,這些裝置往往都使用較低主頻的ARM、DSP或者其他架構的嵌入式CPU來實現。這就需要白平衡演算法具有較高的效率且較少的資源佔用。為了提高演算法效率,減少記憶體資源佔用,在不影響效果的情況下對影象進行了取樣處理。經實驗證明,在1/16下采樣時,對最終的結果不會產生較大影響。本文在第3章對不同下采樣下的誤差及耗時進行了比較。
演算法改進:
在上面的演算法中, 只有在求閾值區域T(x,y)時使用到了光透率 t(x,y),即用t(x,y) < t1進行判斷作為閾值選擇的一個條件。 其中t1是光透率t(x,y)的平均值。既然這樣,我們可以定義
(11)
其平均值為
(12)
那麼T(x,y)的計算公式變為:
(13)
這樣一來,我們就沒有必要再去求全域性光照強度A了,公式(11)替代公式(5)後,也去掉了除法器。無論在硬體實現或軟體計算中都節省了時間和資源。
改進後的思考:
正如前面所述,演算法改進後的確變的簡單了,在沒有了光透率之後, 那麼它的原理是什麼呢?
我覺得可以這樣理解:
除去K的判斷條件後,影象中某一畫素點的最小分量如果大於整個影象畫素的最小分量的平均值,那麼該點就是所求的白色區域了。實際上就是在暗通道影象(比如上面的圖(b)) 中, 亮度大於平均亮度的點即可以作為白色區域了。
注:原論文連結:http://www.oejournal.org/mv_html/j00001/2018-01/A180213000011_WEB.htm
百度文庫和其他網站好像是要錢的,開源的只找到上面一個。論文的原作者是王飛,王偉,不知道他們後面是否對演算法進行了優化,我在網上暫時沒有找到。