曾浩洋,張紅英,2
1(西南科技大學(xué) 信息工程學(xué)院,四川 綿陽 621010) 2(特殊環(huán)境機(jī)器人技術(shù)四川省重點(diǎn)實(shí)驗(yàn)室,四川 綿陽 621010)
在一些霧、霾天氣下,天空中存在的大氣粒子在光傳播過程中會發(fā)生散射,使得到的圖像降質(zhì)、模糊不清,嚴(yán)重影響人類視覺觀察和相關(guān)視覺算法的處理效果.圖像去霧能明顯提升圖像的清晰度和復(fù)原由于霧、霾導(dǎo)致的色彩失真,因此對圖像去霧具有很好的應(yīng)用前景.
近年來,國內(nèi)外研究者提出了很多圖像去霧算法,例如Tan[1]等人觀察到有霧的圖片比無霧圖片有著更高的對比度,提出了最大化圖像局部對比度的去霧算法,但該算法恢復(fù)后的圖像易導(dǎo)致色調(diào)發(fā)生偏移;Fattal[2]等人則是設(shè)想光的傳播與物體目標(biāo)表面投影是不相關(guān),進(jìn)而估算出場景物體反射率在推導(dǎo)場景投射率的方法,其算法很大程度上依賴于輸入數(shù)據(jù)的統(tǒng)計(jì)特征,對于霧氣較濃的圖像去霧會導(dǎo)致較大失真;He[3]等人提出基于暗原色先驗(yàn)的單幅圖像去霧技術(shù),并采用軟摳圖技術(shù)精細(xì)化透射率,圖像復(fù)原效果更加自然.但該方法在對含有大面積天空區(qū)域圖像處理時(shí),會產(chǎn)生光暈偽影和色彩失真等狀況,同時(shí)軟摳圖技術(shù)導(dǎo)致整個(gè)算法時(shí)間復(fù)雜度較高.為提高去霧效果和算法效率,許多改進(jìn)的算法被提出[4,5].He[4]等人又提出了使用導(dǎo)向?yàn)V波來替換軟摳圖方法,有效的縮短了算法運(yùn)行時(shí)間.然而它處理一副 400×300 大小的圖像還需要10-20s,仍難以滿足實(shí)時(shí)的需求.刑曉敏等人[5]則是對圖像分割出天空區(qū)域進(jìn)而估算大氣光值,從而改進(jìn)場景透射率,使得復(fù)原的圖像真是自然,但是分割算法均過于復(fù)雜,消耗時(shí)間過長,不能滿足實(shí)時(shí)需要;劉哲[6]等人提出使用改進(jìn)的雙邊濾波代替軟摳圖算法,使用暗通道圖和原圖最亮值的均值做大氣光值.雖然有效的降低了濾波的時(shí)間復(fù)雜度,但在大氣光值方面又增加了計(jì)算,且又是在CPU上運(yùn)行,同樣不能達(dá)到實(shí)時(shí)處理的要求.
隨著CUDA 和OPENCL等并行架構(gòu)的使用,GPU 已不僅僅是只用來對圖像顯示加速,更多的是把GPU當(dāng)做一種協(xié)處理器對數(shù)據(jù)的計(jì)算進(jìn)行加速,目前很多領(lǐng)域的算法已使用GPU加速且得到了較為滿意的效果.Xue[7]等人基于CUDA并行處理可以有效的提高算法效率,其實(shí)驗(yàn)結(jié)果表明,處理
1024×767大小的圖片僅需要200ms,然而仍不能達(dá)到實(shí)時(shí)的效果.本文在Xue的方法基礎(chǔ)上,提出了一種基于天空分割并使用導(dǎo)向?yàn)V波優(yōu)化透射率的去霧方法.該方法能夠很好的對含有天空區(qū)域的圖像去霧,結(jié)合CUDA并行處理 ,針對高清圖像基本做到了實(shí)時(shí)去霧.
在霧天取景時(shí),天空中的一些成分會對取像造成影響,如:空氣中微小粒子的散射現(xiàn)象,會導(dǎo)致從物體反射的入射光產(chǎn)生衰減;大氣粒子產(chǎn)生的散射作用,會使自然光一起參與圖像成像,造成霧天的取像整體偏向于灰白色.在圖像處理領(lǐng)域中,多采用如下模型來描述霧天圖像成像的物理模型[7].
I(x)=J(x)t(x)+A(1-t(x))
(1)
其中:I(x)為觀測點(diǎn)收到的光強(qiáng),J(x)是場景點(diǎn)反射出去的光強(qiáng),t(x)為光線傳播圖,t(x)=e-βd(x),d(x)為觀測點(diǎn)距場景點(diǎn)的間隔,β為大氣光的散射系數(shù),β在可見光范圍內(nèi)視作常數(shù),J(x)t(x)項(xiàng)即為場景反射(發(fā)射)光衰減模型;A是大氣光值,A(1-t(x))項(xiàng)即為大氣光成像模型.
暗原色先驗(yàn)算法[3,4]的基本思想是對多幅無霧圖像觀察發(fā)現(xiàn):大多數(shù)不含有明亮區(qū)域的圖像中,某一些像素最少會有RGB通道中的一種是接近于0的值,進(jìn)而得出,暗通道先驗(yàn)規(guī)律,即無霧圖像的暗通道像素亮度很小,接近于零.根據(jù)該規(guī)律,提出了基于暗原色先驗(yàn)的去霧算法.
其暗通道可以用公式(2)表達(dá):
(2)
式中Jc表示彩色圖像的單個(gè)通道,Ω(x)表示以像素點(diǎn)a為中心的一個(gè)區(qū)域.
對公式(2)兩邊進(jìn)行取最小值,然后通過對3個(gè)顏色通道中取最小值.即可得到
Jdark→0
(3)
由暗原色先驗(yàn)的統(tǒng)計(jì)規(guī)律可知,He的算法對諸如天空等沒有暗原色的較亮區(qū)域,復(fù)原效果會產(chǎn)生色彩失真和光暈效應(yīng),為克服這一問題提出天空區(qū)域分割的方法,將對天空區(qū)域計(jì)算平均強(qiáng)度值作為新的大氣光值,在通過雙邊濾波進(jìn)一步的優(yōu)化透射率.實(shí)驗(yàn)證明此方法對含有較多天空區(qū)域或含有較亮區(qū)域的霧天圖像可以做到很好的還原.其算法的流程如圖1所示.
圖1 去霧流程圖Fig.1 Defogging flow chart
因?yàn)殪F天圖像表現(xiàn)為灰白色,對比度與亮度的變化較為平緩.圖片中物體多是彩色的,而背景尤其是天空區(qū)域,則表現(xiàn)為接近于白色.霧天圖像偏白會導(dǎo)致和天空區(qū)域的連接較為緊密,通過邊緣檢測分割圖像,我們會得到不連續(xù),信息不完全的圖像.
深度學(xué)習(xí)的圖像分割算法可以得到比較理想的效果,但是其數(shù)據(jù)較多,計(jì)算較為復(fù)雜,需要的時(shí)間較長,不適用于實(shí)時(shí)處理.而大津法(OTSU)閾值分割[8]復(fù)雜度較低,且運(yùn)算時(shí)間較短.符合本文并行去霧縮短去霧時(shí)間的思想.分割的圖像如圖2所示.
(a) 有霧圖像 (b) 非天空區(qū)域 (c) 天空區(qū)域
圖2 基于OTSU的天空區(qū)域分割圖
Fig.2 Sky zone segmentation based on OTSU
OTSU是一種基于全局的二值化算法,對于一副圖像I(x,y)的灰度圖,根據(jù)閾值T可以把圖像分為前景(非天空區(qū)域)和背景(天空區(qū)域).閾值的最佳取值是在前后景差別最大時(shí),其算法的最佳評價(jià)標(biāo)準(zhǔn)是最大類間方差.具體算法步如下:
1)計(jì)算0-255個(gè)灰度級中所有的像素點(diǎn)數(shù)量,然后把他們存儲到一個(gè)數(shù)組中,數(shù)組的下標(biāo)是對應(yīng)的每一級的灰度,儲存的內(nèi)容是每一級灰度中的像素點(diǎn)個(gè)數(shù).
2)求背景中的平均灰度和背景含有的像素點(diǎn)個(gè)數(shù)在背景圖像中的概率.
3)求前景中的灰度均值和前景含有的像素點(diǎn)個(gè)數(shù)在前景圖像中的概率.
4)遍歷0-255個(gè)灰度級,求并得到所需要類間方差的最大值.
前景(非天空區(qū)域)的像素點(diǎn)數(shù)占原始圖像像素點(diǎn)數(shù)的比例為k0,灰度均值記為μF.背景(天空區(qū)域)的像素點(diǎn)個(gè)數(shù)占原始圖像像素點(diǎn)數(shù)的比例為k1,其灰度均值為μB.原始圖像的灰度均值為μ,所求的類間方差值記為σ2.圖像的大小記為X×Y,前景中的像素點(diǎn)數(shù)記為Y0,背景中的像素個(gè)數(shù)記為Y1.
(4)
(5)
Y0+Y1=X×Y
(6)
k0+k1=1
(7)
μ=k0×μF+k1×μB
(8)
σ2=k0(μF-μ)2+k1(μB-μ)2
(9)
公式(10)帶入(11)即可得到
σ2=k0k1(μF-μB)2
(10)
使用遍歷的方法獲得最大的σ2就是所要求的閾值T.
在暗原色先驗(yàn)算法中是選取暗圖中最亮值的前0.1%的像素點(diǎn),在找出這些像素對應(yīng)在霧天圖像中的最大的值作為大氣光值A(chǔ).可以看出這是選取某一點(diǎn)的像素值強(qiáng)度作為A值,若選取某一點(diǎn)的值作為大氣光值,可能會導(dǎo)致選擇的A值是接近于最大像素值255.這樣會使圖像去霧后圖像有失真或斑塊產(chǎn)生.由此可知暗原色先驗(yàn)算法不適用于有天空的圖像,本文選擇對霧天圖像分割得到其天空區(qū)域圖.選擇對天空區(qū)域計(jì)算其強(qiáng)度均值記為大氣光值.由于天空區(qū)域的景深可以看做是無窮遠(yuǎn).所以有公式(1)可知:
t(x)=e-βd(x)≈0
(11)
I(x)≈A
(12)
即A值可以看做是是含有霧圖像的最亮點(diǎn)的值.故將天空區(qū)域的強(qiáng)度均值記為A值是合理的.即:
(13)
(14)
在實(shí)際成像過程中,即便是無霧條件下,空氣也含有微小的顆粒,所以,觀看遠(yuǎn)處的景象還會有不清楚的感覺,所以存在一定量的霧,會使我們感覺圖像更加的真實(shí).故
(15)
經(jīng)過大量的實(shí)驗(yàn)表明ω在0.7-0.95之間去霧的效果較好,本文選擇為0.9.
He在濾波時(shí)選擇的是軟摳圖算法.軟摳圖算法的數(shù)據(jù)多,計(jì)算量較大,耗時(shí).后來HE又提出導(dǎo)向?yàn)V波代替軟摳圖算法,導(dǎo)向?yàn)V波可以大幅度提高去霧算法運(yùn)算效率,且對霧天圖像的還原效果更好.故本文選擇導(dǎo)向?yàn)V波精細(xì)化透射率.在得到大氣光值A(chǔ)和優(yōu)化后的透射率t(x)后,由式(1)可得最后的還原公式為
(16)
由暗原色先驗(yàn)算法可知暗原色去霧可以分為5個(gè)步驟,根據(jù)每個(gè)步驟中數(shù)據(jù)的關(guān)聯(lián)性,可分析出算法的最大并行效率,對一幅X×Y的圖像,分析其并行[9-12]化結(jié)果如表1所示.
表1 暗原色算法并行度分析Table 1 Dark color algorithm parallel degree analysis
由表1可以看出,暗原色先驗(yàn)算法適用于并行計(jì)算.有3個(gè)過程可以達(dá)到像素點(diǎn)數(shù)的并行效率.求大氣光值的數(shù)據(jù)通過分析其并行度則可以達(dá)到分割出的天空圖像中的像素點(diǎn)數(shù).Xue的大氣光值的并行度則為Log2(X×Y×0.001),對比可以發(fā)現(xiàn)本文的方法有更高的效率.優(yōu)化透射率本文使用導(dǎo)向?yàn)V波,對Xue提出的并行累加保留累加中間結(jié)果的方法改進(jìn),可以有更高的并行度,進(jìn)一步的提高并行效率.
如圖3(a)所示在一副圖像中以線程Thread對應(yīng)的點(diǎn)為中心選取15×15的窗口,對于邊緣的點(diǎn)通過擴(kuò)展補(bǔ)充形成窗口[10].所有的像素點(diǎn)都能夠通過擴(kuò)展得到一個(gè)暗原色值.在并行化中對每一個(gè)像素值分配一個(gè)線程.對每一個(gè)像素的窗口函數(shù)內(nèi)求最小值,即像素點(diǎn)的暗原色值.
(a) 像素點(diǎn)對應(yīng)的線程 (b)像素點(diǎn)的暗原色值圖3 暗原色求解Fig.3 Dark color solution window
由圖3(b)求一個(gè)像素點(diǎn)的暗原色值(黑色方塊:(0,0)、(1,2))可以看出,計(jì)算暗原色時(shí),對每一個(gè)像素點(diǎn)值都需要多次讀取,可以利用寄存器存儲數(shù)據(jù).但是寄存器的線程是私有的不能共享,且存儲空間有限,不同線程之間有數(shù)據(jù)的重復(fù)調(diào)用,可以使用共享內(nèi)存,減少線程間的通信時(shí)間.
Xue是使用傳統(tǒng)的方法求大氣光值,求最大值是通過排序的方法,由于排序存在時(shí)序問題,所有并行化不高,耗時(shí)較長.本文使用的是分割后的天空圖,求其強(qiáng)度均值作為大氣光值.其并行度為天空區(qū)域的像素點(diǎn)數(shù).可以用歸約的方法求和后再求平均值.可以有效的提高算法效率.本文方法如圖4所示.
圖4 歸并法求和Fig.4 Merging method summation
圖5 kernel合并Fig.5 kernel merge
由于第1個(gè)和第3個(gè)Kernel函數(shù)的計(jì)算量較少,可以將其合并到第2個(gè)Kernel函數(shù),合并后可以改變存儲方式,由原來的全局內(nèi)存變?yōu)楣蚕韮?nèi)存,可以減少數(shù)據(jù)的訪存時(shí)間達(dá)到優(yōu)化代碼的效果.具體如圖5所示.
本文使用導(dǎo)向?yàn)V波[4]精細(xì)化透射率,在這一計(jì)算過程中多次使用中值濾波函數(shù)box_filter,對其核函數(shù)進(jìn)合并,可以看為有兩個(gè)kernel函數(shù)在并行.一個(gè)是求行累加,另一個(gè)是求列累加,還有一些其他的矩陣運(yùn)算[11].累加的方法如圖6所示.
圖6 并行累加Fig.6 Parallel accumulation
由圖6可知導(dǎo)向?yàn)V波在做累加是保留中間結(jié)果的累加方法,如果使用傳統(tǒng)的方法,需要大量的計(jì)算步驟,且需要多次分配內(nèi)存.而使用圖6的方式可以有效的減少計(jì)算次數(shù),在調(diào)用數(shù)據(jù)時(shí)使用共享內(nèi)存,也可以提高數(shù)據(jù)的使用效率.如a0+a1+a2+a3這個(gè)存儲空間可以多次調(diào)用,且不用多次分配內(nèi)存.
(a) 霧天圖像 (b) He的去霧圖 (c) 劉的去霧圖 (d) 本文去霧圖
圖7 去霧算法對圖
Fig.7 Defogging algorithm comparison chart
由于需要多次調(diào)用box_filter,使用上圖法已經(jīng)大幅度優(yōu)化了累加的時(shí)間,但是每次調(diào)用的數(shù)據(jù)不一樣,數(shù)據(jù)之間有四則運(yùn)算,結(jié)果之間也有四則運(yùn)算,根據(jù)這些不同,可使用一個(gè)kernel函數(shù)多次調(diào)用即可.其余的矩陣運(yùn)算使用另一個(gè)kernel函數(shù)既可以.
由公式(16)可知,在去霧這一過程中只涉及到簡單的四則運(yùn)算,故可以調(diào)用精細(xì)化透射率中的kernel函數(shù).
本文方法是在VS2013平臺上使用opencv3.1和CUDA7.5,進(jìn)行C、CUDA C編程實(shí)現(xiàn)的.硬件配置環(huán)境為:顯卡(NVIDIA GeForce GTX 1080Ti),CPU(Inter Core i7700k) 內(nèi)存(16GB ).
圖7給出了本文算法和He算法的對比效果,其中(a)為有霧圖像,(b)為He方法去霧的圖像,(c)為文獻(xiàn)[6]劉的去霧圖,(d)為本文方法去霧的圖像.從這些對比圖像可以觀察到,He方法在對天空區(qū)域去霧時(shí)出現(xiàn)了光暈現(xiàn)象和色彩失真,而本文方法所恢復(fù)的圖像更加自然真實(shí).
我們選擇1280×720的圖片,分別對去霧過程中的每一個(gè)步驟進(jìn)行時(shí)間統(tǒng)計(jì)并與Xue的算法進(jìn)行對比,其結(jié)果如表2所示.
表2 去霧各步驟的運(yùn)行時(shí)間Table 2 Timing of the defogging steps 單位:ms
從表2可以看出,針對高清圖像,本文的并行優(yōu)化算法較只用CPU實(shí)現(xiàn),其速度提升了75倍,與Xue的并行加速算法相比,其速度提升了近3倍,基本達(dá)到了對高清圖像的實(shí)時(shí)處理.圖8給出了本文CPU版本與Xue方法和本文GPU方法去霧過程中各步驟的時(shí)間對比.
圖8 CPU版與Xue方法和本文方法的時(shí)間比Fig.8 CPU time compared to the method of Xue and this method
由于Xue的方法沒有分割故不與CPU版做對比,去霧這一步驟時(shí)間相同也不與CPU版作對比.本文方法的并行加速效果更加明顯,在整個(gè)加速過程中可以看出在暗原色、大氣光值、初始透射率和去霧上加速比較大,是因?yàn)檫@3個(gè)步驟并行度高都是一些簡單的四則運(yùn)算,在優(yōu)化透射率加速比小是因?yàn)榇瞬襟E有大量的kernel函數(shù).數(shù)據(jù)訪存較多,所以較慢.在分割過程中存在時(shí)序問題,所以圖像的并行度不高,速度沒有得到較高的提升.在處理大小為1280×720圖像的不計(jì)算讀寫速度可以達(dá)到50ms,即每秒20幀的處理速度.基本可以滿足這類圖像的實(shí)時(shí)去霧效果.通過與Xue 的算法對比可以看出本文的加速效果更好.由于Xue的算法是在HE的算法基礎(chǔ)上只進(jìn)行算法的并行優(yōu)化,其去霧效果同HE的去霧效果一樣.通過對比本文的去霧效果更好,時(shí)間也更短,更適用于一些視頻的實(shí)時(shí)去霧.
表3分別給出了針對不同大小的圖片去霧的時(shí)間統(tǒng)計(jì).
表3 去霧時(shí)間對比 Table 3 Defogging time comparison 單位:ms
本文對He和劉的去霧算法進(jìn)行了實(shí)驗(yàn)觀察,此算法對霧天圖像可以實(shí)現(xiàn)去霧.但在處理含有天空的霧天圖像還有一些缺陷.本文在保證去霧效果前提下,提出了基于天空區(qū)域分割的改進(jìn)的暗原色先驗(yàn)的去霧算法.解決了對天空區(qū)域去霧出現(xiàn)的失真、塊效應(yīng)的情況.為了提升去霧算法的效率,本文將整個(gè)去霧算法并行化,使用CUDA實(shí)現(xiàn).并對Xue的方法進(jìn)行了改進(jìn),在求大氣光值時(shí)有更高的并行度,進(jìn)一步提升了運(yùn)算速率.本文算法在快速去霧的基礎(chǔ)上,同時(shí)達(dá)到了天空區(qū)域去霧不失真的效果.但是在霧氣較濃的圖像中,天空分割的效果并不好,大氣光值就不準(zhǔn)確,會影響天空區(qū)域的去霧效果.
基于霧天退化模型的去霧算法,大氣光值和透射率是去霧的關(guān)鍵.對于霧氣較濃的圖像,天空分割的效果并不好,解決濃霧下的天空分割和透射率進(jìn)一步優(yōu)化是我們下一步的研究工作.