董輝 張斌
光在空氣中傳播時會被“霧”[1?2]反射、吸收和散射.光的強度和顏色會因霧的濃度和光線傳播距離發(fā)生改變.這就造成了圖像質(zhì)量下降,包括圖像模糊,對比度下降,色彩弱化,場景特征減弱.特別是有霧圖像的深度信息被破壞,會影響后續(xù)圖像處理和視覺計算效果.所以,在遙感、航空和水下圖像處理,室外監(jiān)控和目標(biāo)識別應(yīng)用中,去霧處理被廣泛使用.圖像去霧可以消除霧氣干擾和顏色失真,提高對比度和視覺效果.
去霧技術(shù)中主要的挑戰(zhàn)是有霧圖像丟失了原始場景的深度信息,這樣就不能使用大氣散射模型對圖像建模.所以,在去霧處理時,需要使用多幅圖像或附加信息獲得場景的深度信息,實現(xiàn)對有霧圖像建模.當(dāng)前,主要的去霧方法有三類.第一類采用圖像處理方法.包括直方圖均衡[3?4]和Retinex方法[5].基于圖像處理的去霧方法只關(guān)注圖像對比度,飽和度和亮度的提高.這類方法不能得到場景的深度信息、而且會惡化圖像的視覺效果.第二類采用物理模型方法.這類方法使用附加信息、多幅圖像或先驗.使用附加信息的方法包括使用大氣光偏振效應(yīng)[6]和深度信息[7].這兩種附加信息需要使用額外的器件,因而在實際應(yīng)用中不能方便獲得.使用多幅圖像的方法通過采集同一場景不同天氣條件下的多幅圖像實現(xiàn)[8?10].在實際應(yīng)用時,多幅圖像并不能很輕易的獲取.所以,基于假設(shè)[11?13]或先驗[2,14]的方法得到越來越多的應(yīng)用.這種方法首先對霧建模,然后通過逆過程實現(xiàn)去霧.這種方法使用單一有霧圖像實現(xiàn)去霧,效果自然.第三類方法基于機器學(xué)習(xí)[15?18],針對特定大氣條件訓(xùn)練模型.這類方法有較好的去霧效果,但是對非霧氣造成的圖像退化產(chǎn)生不好的影響.當(dāng)前,去霧方法中最簡單有效的是基于暗通道先驗(Dark channel prior,DCP)的方法[2].但這一方法并不能很好地處理天空圖像和光暈現(xiàn)象,而且計算量大.針對該方法的不足,一些后續(xù)工作對其進(jìn)行了補充[19?21].
本文在DCP方法的基礎(chǔ)上引入可變形自適應(yīng)濾波和形態(tài)學(xué)重構(gòu),實現(xiàn)去除光暈現(xiàn)象.采用最優(yōu)化介質(zhì)傳播系數(shù)[22]處理有霧圖像天空區(qū)域.實驗結(jié)果表明本文提出的算法能夠普遍用于不同霧氣條件的圖像去霧.對天空區(qū)域和光暈的去除都有很好的處理效果.而且,該方法采用形態(tài)學(xué)運算,易于并行化和硬件實現(xiàn).
在計算機視覺中,大氣光散射模型為:
其中,E為輻照度,d為光線傳播的距離,λ為光的波長,E0(λ)為光源的照度(d=0),β(λ)為總散射系數(shù),E∞(λ)為大氣光的最大輻照.公式右邊的第一項為入射光線的衰減模型,第二項為大氣光模型.有霧圖像模型[2,14]可以簡化為:
其中,I(x)為觀測圖像,J(x)為場景輻照,A為全局大氣光,t(t(x)=e?βd(x))為透射率.圖1說明式(2)各項在圖像中的意義.圖像去霧的目的就是使用下式恢復(fù)出場景J:
圖1 有霧圖像模型Fig.1 Haze imaging model
去霧中的挑戰(zhàn)是從單幅圖像I中估算出A和t.顯然未知條件大于約束.J不可能直接由式(3)算出.因此,需要使用先驗或假設(shè)提供更多約束.
圖像去霧本質(zhì)上是一個病態(tài)問題,所以需要經(jīng)驗觀測值,多種假設(shè)或先驗知識才能實現(xiàn).Zhu等[11]發(fā)現(xiàn)了顏色衰減先驗.Meng等[23]針對大氣透射函數(shù)提出了內(nèi)在邊界約束.不同于其他方法基于有霧圖像提出假設(shè)或先驗,He等[2]基于無霧圖像的統(tǒng)計特性提出了DCP.DCP基于無霧圖像的一個基本特征:無霧圖像中除天空區(qū)域,至少有一個顏色通道的亮度非常低.DCP提出三條先驗:大氣光值已知,大氣透射率在圖像塊中是常數(shù),J的暗通道亮度趨近于0.任意圖像P的暗通道計算為:min?DC(x)(minCPC).其中,PC為P的彩色通道,?DC(x)為中心點x的鄰域.minC∈(R,G,B)計算每個像素的最小顏色通道值,min?DC(x)計算x鄰域?DC(x)中的最小值.暗通道的計算過程如圖2所示.
圖2 暗通道計算Fig.2 Calculation of dark channel
大氣光值A(chǔ)假設(shè)為已知值,式(2)歸一化為:
其中,C表示R、G、B三個顏色通道.像素x的鄰域?DC(x)中常量透射系數(shù)t表示為(x).式(4)等號兩邊進(jìn)行最小值運算得到:基于無霧圖像的非天空區(qū)域暗通道值趨近于零這一先驗,以及大氣光值非負(fù),式(5)簡化為:
然后圖像場景J(x)可以通過下式計算得到:
這樣,有霧圖像就實現(xiàn)了去霧處理.使用這一方法恢復(fù)出的圖像效果好,計算簡單.但是,在去霧過程中,假設(shè)圖像在每一個像素鄰域中透射率相同.這樣恢復(fù)出的圖像在某一圖像塊中深度不連續(xù)的位置會產(chǎn)生光暈現(xiàn)象.為解決這一問題可以使用導(dǎo)向濾波(Guided image filter,GIF)[20].
通常情況下,基于DCP的去霧方法能夠有效地對單幅有霧圖像去霧.但是,仍存光暈現(xiàn)象和天空區(qū)域彩色失真現(xiàn)象.
1.3.1 光暈現(xiàn)象
像素鄰域大小的選擇在DCP方法中非常關(guān)鍵.在去霧運算中,鄰域越小Jdark(x)的計算結(jié)果誤差越大,恢復(fù)的場景圖像過飽和越明顯.但是,大的鄰域會使得透射率在一個過大的區(qū)域內(nèi)都保持恒定,在鄰域內(nèi)存在深度邊緣時,會產(chǎn)生強的光暈現(xiàn)象,如圖3所示,鄰域越大,去霧后的圖像光暈影響越大.因此,GIF、散射模型[24?25]、混合DCP[26],保邊處理[12,27]和視覺恢復(fù)[28]等技術(shù)被用于解決光暈問題.但是這些技術(shù)都有其自身的限制.散射模型方法需要預(yù)先得到Trimap圖或用戶手動標(biāo)記前景背景.其他方法需要大量的計算和存儲資源.而且,上述方法都是使用固定尺寸的圖像塊對一幅圖像進(jìn)行處理.使用形狀不變的鄰域會破壞圖像塊中深度突變位置的深度信息,造成透射率計算的錯誤.比如使用GIF,大尺寸窗口能夠分散深度邊緣周圍的光暈.但是,去霧后圖像深度邊緣模糊,如圖4所示,窗口越大,光暈越弱,但是葉子和樹枝邊緣的對比度越差.
本文采用自適應(yīng)結(jié)構(gòu)元和形態(tài)學(xué)重構(gòu)計算透射率,為了實現(xiàn)不同深度的保邊濾波,實現(xiàn)在深度近似的結(jié)構(gòu)中完成濾波和細(xì)小紋理消除,同時保持圖像的深度邊緣.同時,因為形態(tài)學(xué)運算的天然并行性,易于并行加速和硬件實現(xiàn).首先使用有霧圖像對每一像素點計算其合適的結(jié)構(gòu)元,然后使用這些結(jié)構(gòu)元完成中值濾波輸出模板圖像.有霧圖像的暗通道圖像作為標(biāo)記圖像.使用標(biāo)記圖像和模板圖像完成形態(tài)學(xué)膨脹重建運算,結(jié)果即為精細(xì)化的暗通道圖像.
1.3.2 顏色失真
DCP中,不同區(qū)域使用同一恒定的大氣光值并不適合,特別是在天空區(qū)域,會產(chǎn)生嚴(yán)重的色彩失真.當(dāng)圖像中像素I大于選定的A時,J(X)=1/t(I?A)+A會得到大于255的數(shù)值,這樣就產(chǎn)生了結(jié)果的上溢,造成恢復(fù)圖像的顏色失真.文獻(xiàn)[2]中,假設(shè)大氣光值大于所有目標(biāo)亮度.但是,當(dāng)目標(biāo)亮度大于AC時,式(7)會計算出錯誤的透射率(x),如圖5所示.為了減少天空區(qū)域的色彩失真,文獻(xiàn)[29]引入啟發(fā)式邊界,假設(shè)地面區(qū)域的透射率只與其距地平線的垂直距離有關(guān),超過地平線的天空區(qū)域透射率置為0.這一方法對于非天空區(qū)域會產(chǎn)生發(fā)黃和偏暗的效果.文獻(xiàn)[30]根據(jù)有霧圖像的統(tǒng)計直方圖自動檢測霧氣程度,然后引入非負(fù)天空區(qū)域補償項,用于調(diào)整天空區(qū)域(x)的初始值.但是這一方法會產(chǎn)生明顯的塊效應(yīng).
圖3 不同鄰域大小對去霧的影響Fig.3 Haze removal results by different patch sizes
本文將文獻(xiàn)[22]中提出的損失函數(shù)用于整幅圖像的透射率計算.該損失函數(shù)包括兩部分:對比度項和信息損失項.通過損失函數(shù)的約束,避免了有霧圖像中亮度大于大氣光值的像素,在去霧處理時發(fā)生溢出.本文提出計算亮通道(R、G、B三通道中的最大值),使用亮通道計算透射率.然后融合由亮通道和重構(gòu)圖分別計算的透射率,得到最終的透射率(x).這樣能夠有效避免天空區(qū)域的色彩失真.
圖4 DCP+GIF方法使用不同大小鄰域的去霧效果Fig.4 Haze removal results by DCP+GIF with different patch sizes
圖5 使用DCP去霧后天空區(qū)域的顏色失真現(xiàn)象Fig.5 Haze removal results with large sky region
圖6 本文去霧算法流程Fig.6 Flowchart of our proposed algorithm
本文提出的算法流程如圖6所示.包括自適應(yīng)濾波,形態(tài)學(xué)重構(gòu)和天空區(qū)域處理:
1)由有霧圖像I的灰度圖計算顯著圖(Salience map,SM)[31].SM作為導(dǎo)向圖計算自適應(yīng)結(jié)構(gòu)元.生成的結(jié)構(gòu)元對最小顏色通道圖像dc1進(jìn)行中值濾波.得到保留了邊緣,抑制了細(xì)節(jié)的結(jié)構(gòu)圖像AF.
2)由I計算最小顏色通道dc1和暗通道dc2.根據(jù)dc2和I計算大氣光值A(chǔ).以dc2為標(biāo)記圖像,AF為模板圖像完成形態(tài)學(xué)膨脹重構(gòu)運算,獲得精細(xì)化暗通道圖像dc3.結(jié)合A計算暗通道透射率tdc.
3)由I計算最大亮通道bc.根據(jù)bc計算亮通道透射率tbc.逐像素比較tdc和tbc,輸出最大值得到最優(yōu)透射率(x).最后,由(x),A和I恢復(fù)出去霧圖像.
去霧處理的中間過程如圖7所示.自適應(yīng)濾波圖、暗通道圖和亮通道圖由I計算得到.暗通道和自適應(yīng)濾波圖完成重構(gòu)運算.使用重構(gòu)圖像計算tdc.亮通道進(jìn)行一次膨脹運算再計算tbc.融合兩種透射率后使用式(8)實現(xiàn)去霧.
透射率t的表達(dá)式為:
其中,β表示散射系數(shù),d(x)表示場景深度.t僅與場景深度有關(guān).令f和g分別表示標(biāo)記圖像和模板圖像,并且f≤g,測地膨脹定義為:
其中,b為結(jié)構(gòu)元(Structure element,SE),⊕表示膨脹運算,∧表示按像素對應(yīng)取最小值.大小為n的測地膨脹定義為:
標(biāo)記圖像f對模板圖像g的膨脹形態(tài)學(xué)重建表示為:
其中,k為迭代次數(shù).當(dāng)?shù)\算達(dá)到穩(wěn)定,即時,迭代停止.膨脹重建能夠在不改變物體形狀的前提下消除標(biāo)記圖像中的細(xì)小結(jié)構(gòu).將形態(tài)學(xué)重建引入透射率的優(yōu)化計算,需要選擇合適的標(biāo)記和模板圖像.AF(Igray)和dc2分別作為模板和標(biāo)記圖像進(jìn)行形態(tài)學(xué)重構(gòu)運算,結(jié)果如圖8所示.與采用GIF的方法比較,采用形態(tài)學(xué)重構(gòu)恢復(fù)的有霧圖像具有更好的對比度和紋理結(jié)構(gòu).但是采用形態(tài)學(xué)重構(gòu)恢復(fù)圖像,在同一場景深度,很難去除細(xì)紋理集中區(qū)域的細(xì)紋理.因此,要提高去霧的效果,需要解決的問題是:保證深度邊緣不被模糊,抑制相近場景深度的密集細(xì)紋理.為此,我們引入了可變形自適應(yīng)濾波.
圖7 本文去霧算法中間過程Fig.7 Flowchart of proposed haze removal procedure
最小顏色通道既有圖像的強邊緣信息,也有細(xì)紋理和噪聲.最優(yōu)的模板圖像應(yīng)該僅包含完整且定位準(zhǔn)確的深度邊緣信息.形態(tài)學(xué)運算中,通常使用開啟和閉合運算去除圖像細(xì)邊緣和噪聲.但是會模糊圖像邊緣.所以,采用自適應(yīng)可變形中值濾波對模板圖像進(jìn)行預(yù)處理,能夠很好地去除噪聲和細(xì)紋理,同時保持準(zhǔn)確的深度邊緣,如圖9所示.
我們采用顯著圖[31]作為導(dǎo)向圖(Pilot)計算可變結(jié)構(gòu)元.SM計算過程如算法1所示.計算出導(dǎo)向圖后,使用算法2,實現(xiàn)對每個像素的自適應(yīng)中值濾波.去霧效果如圖10所示,去霧后的圖像避免了光暈效應(yīng),而且對比度得到了增強.
圖9 自適應(yīng)濾波結(jié)果Fig.9 Adaptive filtering results
圖10 使用自適應(yīng)中值濾波和形態(tài)學(xué)重構(gòu)實現(xiàn)的去霧結(jié)果Fig.10 ADSE filter and morphological reconstruction results
算法1.顯著圖(SM)計算
輸入.灰度圖像I(x).
輸出.顯著圖.
步驟 1.計算I(x)的二維離散傅立葉變換:F[I(x)].
步驟2.計算頻譜幅值A(chǔ),相位譜P和log譜L:A=(F[I(x)]),P=φ(F[I(x)]),L=lg(A).
步驟3.V=hn?L,其中hn為均值濾波模板.
步驟4.計算譜殘差:R=L?V.
步驟 5.計算SM:SM(x)=g(x)?F?1[exp(R+P)]2,g(x)為高斯濾波模板.
算法2.自適應(yīng)中值濾波
輸入.導(dǎo)向圖SM,dc1,結(jié)構(gòu)元限制范圍?(邊長為2r+1的矩形).
輸出.自適應(yīng)中值濾波后的圖像.
步驟1.j=1,循環(huán)步驟2~5.
步驟2.以當(dāng)前像素為中心,選取區(qū)域?,?中每一像素i計算沿不同路徑到中心點的像素值距離,?內(nèi)結(jié)構(gòu)元長度d(x,y)的均值T作為結(jié)構(gòu)元長度上限.
步驟3.比較?內(nèi)各像素點結(jié)構(gòu)元長度d(x,y)與T,若d(x,y)>T,自適應(yīng)SE當(dāng)前位置置0;否則,置1.
步驟4.使用當(dāng)前得到的自適應(yīng)SE對dc1進(jìn)行中值濾波,結(jié)果為輸出圖像當(dāng)前像素的灰度.
步驟 5.j?j+1,移動到下一像素,直到(j=N),結(jié)束循環(huán),其中,N為圖像像素個數(shù).