侯天峰, 曾舒婷
(南京大學金陵學院 信息科學與工程學院, 南京 210089)
霧天等不利因素對圖像和視頻質(zhì)量有較大影響, 去霧可以改善圖片質(zhì)量。當前圖像去霧算法主要有兩類:一類是基于圖像增強的方法,如直方圖均衡化技術(shù)[1]。此類方法假設場景景深不變,但降質(zhì)與成像距離存在指數(shù)關(guān)系,因此圖像增強類方法去霧效果有限。另一類基于大氣散射原理,建立圖像退化模型,利用先驗知識進行去霧求解約束。如文獻[2]基于無霧圖像較有霧圖像有著更高的對比度這一先驗約束,通過提高恢復圖像的局部對比度來實現(xiàn)去霧。Fattal基于統(tǒng)計學的提出一種新的去霧方法,對色彩差異豐富的圖像取得了不錯的效果[3]。文獻[4]基于大量戶外無霧圖像的統(tǒng)計規(guī)律,提出一種簡單有效的暗原色先驗單幅圖像去霧算法,對一般戶外圖像取得了很好的去霧效果,但算法運算復雜度較高,難以應用于快速處理場景。
CUDA是NVIDIA公司提出的GPU并行計算架構(gòu)[5],利用GPU中的多顆計算核心進行通用計算處理工作,計算性能可獲得顯著提升,給GPU編程和并行計算提供了一個簡單方便的途徑[6],因此自提出以來得到迅速發(fā)展。目前,使用GPU進行數(shù)據(jù)密集型計算已經(jīng)成為數(shù)據(jù)處理并行化的主要手段之一,廣泛應用于科學技術(shù)、人工智能及大數(shù)據(jù)方向。如何根據(jù)GPU特點設計適合其處理的并行算法,以及合理利用CPU/GPU的協(xié)同處理提高性能是解決性能問題的主要工作[7]。
本文研究了暗原色先驗的去霧算法及各個算法步驟的運算復雜度,并基于CUDA框架,設計和提出算法并行化處理方案,實現(xiàn)CPU+GPU的異構(gòu)計處理,以顯著提高運算速度,滿足高清實時圖像處理的需求。
去霧問題數(shù)學模型可以描述如式(1)。
I(x)=J(x)t(x)+A(1-t(x))
(1)
(1)式為大氣散射模型,描述霧化圖像的退化過程,其中I是退化后圖像,J是無霧圖像,A為大氣光,t稱為透射率。去霧的目標就是從I中復原J。
暗原色先驗指出在絕大多數(shù)戶外圖像局部區(qū)域里,局部區(qū)域內(nèi)圖像像素總會有至少一個顏色通道具有很低的值如式(2)。
(2)
Jc代表J的某個顏色通道,Ω(x)為鄰域。Jdark稱為J的暗原色,Jdark的強度總是很低且趨近于0。
假設大氣光A給定,局部區(qū)域的透射率恒定不變。方程(1)在三個顏色通道中使用最小運算符,并同除以A,得到式(3)。
(3)
根據(jù)暗原色先驗的規(guī)律,無霧自然圖像的暗原色項Jdark應該接近于0如式(4)。
可見,《辭源》的既有處理方式很明顯將“安劉1”與“安劉2”雜糅了在一起,此種處理方式所造成的結(jié)果便是典故詞語詞目的失收。
(4)
由于Ac總為正數(shù),導出式(5)。
(5)
把上式代入(4),可估算出透射率t,為使圖像看起來更真實自然,通常會保留一部分霧,由ω控制如式(6)。
(6)
由上式估計出透射率是粗略的,為了提高精度,可應用軟摳圖或?qū)驗V波進行透射率精化得到完善后的透射率t(x)[2-3]。
通過下式計算去霧圖像如式(7)。
(7)
設定圖像分辨率為m×n,求解暗通道和初始透射率在計算上基本一致,因此實現(xiàn)并行化過程也基本相同,在進行數(shù)據(jù)劃分和線程分配時候的操作也近似。兩個步驟并行度一樣皆為去霧圖像的像素個數(shù)。一個線程對應一個像素點,每個單一線程都可以取得所需的數(shù)據(jù)窗,然后進行處理,如圖1所示。
圖1 像素和線程對應關(guān)系
圖1中某個15×15的局部區(qū)域,其求暗通道計算與其他區(qū)域互不沖突,整個圖像可以劃分成可分m×n個圖像塊,相應的暗通道求解可以分配給一個CUDA的Block來實現(xiàn)。每個像素點對應一個線程id,可以通過歸約算法實現(xiàn)求最小值運算。
大氣光的估計步驟:首先選取暗原色中亮度最大的0.1%的像素,這些像素大都是不透明的,在以上像素當中,輸入圖像中強度最大的像素點被選定為大氣光。暗原色圖像求取0.1%亮度最大像素點的過程,也可以通過圖像分塊的方式,實現(xiàn)并行化處理。
本文精化透射率使用導向濾波算法[8],其主要計算過程為一系列Box filter處理,即均值濾波,二維圖像均值濾波可分解為x和y方向的兩次一維濾波(下圖3中表示為i和j)。單一Box filter計算,可以通過圖像分塊的方式進行并行化,此外還可以使用縱向合并,將有并列關(guān)系的Kernel合并至同一個Kernel,以降低啟動Kernel的開銷,與此同時將數(shù)據(jù)進行共享,從而降低訪問開銷,如圖2所示。
上圖中的橢圓代表一個Kernel,矩形代表數(shù)據(jù),上圖所表示的即為將Kernel進行合并的示例圖,由此我們可以減少Kernel的數(shù)目從而減少開銷,同時在部分Kernel中,數(shù)據(jù)是共享的,從而減少相應的訪問次數(shù)。
去霧部分在整個去霧算法中占用的系統(tǒng)資源其實是最少的,其計算量也最小,而且每個像素的處理都是獨立的,所以在處理圖像去霧的并行化時,可以將去霧的運算部分集合到上面計算透射率時整合的最后一個Kernel,從而減少了數(shù)據(jù)訪問和啟動開銷。
本文實驗在搭載NVDIA GPU的筆記本電腦上實現(xiàn)的,主要配置為:GTX 860m顯卡,英特爾i5處理器4210h。代碼基于C++編程,利用Qt平臺搭配OpenCV,使用CUDA9.1。
實驗中,通過對比同算法在有無CUDA加速的情況下對相同的一幅圖像進行去霧處理,其運算效果和消耗的時間來評價協(xié)同計算的優(yōu)勢。為實驗的嚴謹性,本文選取了不同分辨率的含霧圖像進行了多組實驗,結(jié)果如表1所示:
表1 不同分比率含霧圖像處理時間對比
圖2 精細化透射率模塊Kernel關(guān)系
一般來說圖片尺寸越大,提升的效果就越明顯,如圖3所示。
測試中所使用的4組樣本實例和去霧效果如下圖4所示。
需要說明的是,本文實現(xiàn)的是He的原暗原色去霧算法,主要工作是探究GPU并行化處理方案,進行處理時間優(yōu)化,至于去霧效果自然與原算法一致,GPU加速并不會導致去霧效果有所損失。同時,目前去霧領(lǐng)域并未提出較為有效的去霧效果客觀評價指標,主要評判依據(jù)還是從幾個方面進行主觀比較,包括有霧覆蓋區(qū)域恢復細節(jié)程度、邊緣的暈化現(xiàn)象、對比度、色彩失真度、色彩噪聲等。這也是作者后續(xù)需要繼續(xù)努力研究的方向。
圖3 不同像素圖像處理時間提升倍率
(a) 原圖
(b) 暗原色
(c) 初始透射率
(d) 精化透射率
(e) 去霧圖像
圖4 圖像去霧效果
本文基于CUDA平臺,對暗原色去霧算法進行研究,并探討和提出并行化處理方案,實驗結(jié)果表明本文方法可以顯著提升算法執(zhí)行效率。受制于算法本身復雜度和硬件測試平臺的限制,離真正的實時化處理尚有舉例,因此繼續(xù)改善算法和減少運算時間是后續(xù)工作繼續(xù)努力的方向。