陸 成,姚小江,解其云,張潤芃
(南京郵電大學(xué) 電子與光學(xué)工程學(xué)院、柔性電子(未來技術(shù))學(xué)院,江蘇 南京 210046)
霧天光線傳播會受到空氣中懸浮顆粒散射的影響,導(dǎo)致諸如視頻監(jiān)控、航拍無人機、輔助駕駛系統(tǒng)等成像設(shè)備獲取的圖像關(guān)鍵信息丟失且對比度大幅降低,無法進行有效工作[1,2]。
區(qū)別于傳統(tǒng)單一的串/并行處理器,ZYNQ SoC(system on chip)作為全可編程的異構(gòu)平臺,內(nèi)部集成了雙核ARM Cortex-A9處理器與7系列FPGA,并通過AXI總線實現(xiàn)SoC內(nèi)部高帶寬、低時延的連接。SoC兼具ARM靈活的控制能力與FPGA強大的并行計算能力,特別適用于含有大量的數(shù)學(xué)運算和邏輯控制的實時圖像處理場合。能夠滿足當(dāng)前戶外視覺系統(tǒng)高實時性、高靈活性、低功耗、低成本以及小型化的需求。而Retinex算法因其去霧效果良好,適用場合較廣,復(fù)雜度及計算量適中等特點,適合部署在嵌入式設(shè)備。
目前在ZYNQ SoC上對于Retinex去霧算法部署優(yōu)化的研究較少。文獻[3]使用HLS工具完成SSR算法設(shè)計,去霧效果及資源利用仍有較大優(yōu)化空間。文獻[4]基于軟硬件協(xié)同的思想實現(xiàn)了基于HSV空間的Retinex算法,資源利用優(yōu)秀,但去霧效果受限于數(shù)據(jù)精度。文獻[5]中方法及效果與前者較為相近。文獻[6]實現(xiàn)了一種針對夜間圖像增強的Retinex算法,圖像暗部細節(jié)提升十分明顯,但資源消耗相對較大,成本較高。文獻[7]提出一種自然恢復(fù)的Retinex算法,同樣效果明顯,且資源使用率有大幅度降低?,F(xiàn)有相關(guān)研究在資源利用、成本控制方面仍然有很大優(yōu)化空間,無法同時保證算法有效性與設(shè)計低成本。另外沒有實現(xiàn)去霧算法針對不同場合使用的靈活參數(shù)調(diào)整,在算法實時性方面也還有提升空間。本文從Retinex理論出發(fā),針對現(xiàn)有設(shè)計與研究的不足加以改進,并對算法部署在可編程邏輯架構(gòu)上的難點提出解決方案。
Retinex理論由Land等提出,理論具體內(nèi)容可見文獻[8]。理論核心思想是認為一幅圖像S(x,y) 可分解為圖像照度分量L(x,y) 和反射分量R(x,y), 即
S(x,y)=L(x,y)·R(x,y)
(1)
式(1)兩邊同時轉(zhuǎn)向?qū)?shù)域可以計算出物體真實圖像數(shù)據(jù)
logR(x,y)=logS(x,y)-logL(x,y)
(2)
式(2)包含一個已知量和兩個未知量,為了得到確切解, 眾多學(xué)者提出了不同的Retinex算法。
Jobson等使用高斯中心環(huán)繞函數(shù)F(x,y) 與原圖像S(x,y) 進行卷積來估算圖像照度分量,稱為SSR(single scale retinex)算法,目前被廣泛使用各種圖像增強場合[9]。即
logR(x,y)=logS(x,y)-log[F(x,y)*S(x,y)]
(3)
基于SSR算法,Rehman等選擇不同尺度求取反射分量的值,再進行加權(quán)平均,稱為MSR(multi scale retinex)算法。MSR可以在保持圖像色調(diào)均衡的同時進一步壓縮圖像灰度的動態(tài)范圍[10]
(4)
式中:K是高斯中心環(huán)繞函數(shù)的個數(shù),一般取3兼得高、中、低3個尺度的優(yōu)點,wk為每個尺度的權(quán)重。
為了解決MSR算法因噪聲放大引起圖像局部顏色失真的現(xiàn)象,Jobson等又提出了MSRCR(multi-scale retinex with color restoration)算法[11]。MSRCR通過引入色彩恢復(fù)因子來修正圖像在去霧過程中丟失的彩色信息。算法實現(xiàn)如下
RMSRCRi(x,y)=G·[Ci(x,y)RMSRi(x,y)-O]
(5)
(6)
式中:Ci(x,y) 為i通道對應(yīng)像素點的色彩恢復(fù)因子,Ii(x,y) 為當(dāng)前通道對應(yīng)像素點的值,α為受控制的非線性強度,β為增益常數(shù),G為整體增益,O為修正偏差,N為圖像通道數(shù),對于RGB圖像,N=3, 則Ij(x,y) 為各通道當(dāng)前像素點位置的值。
Retinex算法經(jīng)過眾多學(xué)者的優(yōu)化與創(chuàng)新,去霧效果足夠優(yōu)秀,但是對于高分辨率圖像,就其在PC處理器的運行速度而言,還遠達不到實時處理的標(biāo)準(zhǔn)。區(qū)別于傳統(tǒng)串行處理器,F(xiàn)PGA能夠在同一個時鐘周期內(nèi)并行處理多個計算任務(wù),不同任務(wù)之間可以形成流水線結(jié)構(gòu),進而大幅度縮短算法的運行時間。但FPGA同樣受限于本身架構(gòu)特點,存在不足之處。算法實現(xiàn)存在以下難點:SoC內(nèi)部無論是Cortex-A9處理器或是Artix-7的DSP48資源都很難做到對算法產(chǎn)生的大量浮點數(shù)據(jù)進行實時處理;SoC內(nèi)部邏輯資源有限,難以在低成本的同時保證去霧算法的效果;傳統(tǒng)Retinex算法為串行執(zhí)行,需要在不改變算法本質(zhì)的基礎(chǔ)下進行并行加速?;谝陨?,本文對算法進行改進,在保證去霧效果的基礎(chǔ)上,使其適合在可編程邏輯架構(gòu)運行,改進算法架構(gòu)如圖1所示。
圖1 改進Retinex算法架構(gòu)
改進算法在原算法基礎(chǔ)上主要進行了光照估計、色彩平衡、圖像融合三方面優(yōu)化。使用雙邊濾波聯(lián)合Gamma校正改善原有算法的光照估計過程,并引入色彩恢復(fù)因子加以白平衡對去霧后圖像色彩進行校正,最后融合直方圖均衡化的優(yōu)點對輸出圖像進行增強。
經(jīng)典Retinex算法采用的高斯濾波是空間域濾波,中心點像素值由鄰域內(nèi)其它點像素值加權(quán)計算得到,權(quán)值僅與像素距離有關(guān),濾波后圖像會變得模糊,丟失細節(jié)。而雙邊濾波可以看成兩個高斯濾波的結(jié)合,一個考慮距離空間臨近,一個考慮顏色相似[12]。計算空間臨近度權(quán)值和像素值相似度權(quán)值的乘積,使用優(yōu)化的權(quán)值與原圖像卷積,進而達到保邊去噪的效果。雙邊濾波實現(xiàn)如下
(7)
其中,BF[I]p為濾波后像素,s為濾波窗口域,Gσs和Gσr分別為空間臨近和像素相似高斯濾波器,濾波器標(biāo)準(zhǔn)差由人為確定。
小尺度的SSR可以增強細節(jié),但容易丟失色彩,大尺度的SSR可以保持色彩,但對比度增強方面欠佳[13],因此MSR算法使用高、中、低3個尺度的高斯函數(shù)分別對原圖像進行卷積,兼顧了亮度提升和細節(jié)增強。在FPGA中,可以將數(shù)據(jù)流復(fù)制后再分別進行流水線處理,不會影響算法實時性,但是會消耗大量的邏輯資源。而Gamma校正在γ<1時,可以提升圖像對比度,使得校正后的圖像更符合照度圖像。所以設(shè)計使用小尺度的雙邊濾波函數(shù)與原圖像卷積加以Gamma校正代替多尺度高斯函數(shù)用于提取圖像的照度分量。根據(jù)對大量圖像進行實驗后發(fā)現(xiàn)γ值為0.35校正后的照度分量為佳,Gamma校正硬件實現(xiàn)如下所示
(8)
dst(x,y)=lut[src(x,y)]
(9)
其中,lut[i] 是存儲對應(yīng)γ值校正后的數(shù)組,src(x,y) 為原圖像灰度值,dst(x,y) 為經(jīng)過Gamma校正后該點灰度值。
傳統(tǒng)Retinex算法存在對數(shù)域數(shù)據(jù)轉(zhuǎn)向指數(shù)域的步驟,浮點型數(shù)據(jù)進行指數(shù)運算會消耗大量的DSP資源,并且較難滿足時序要求。Min-Max歸一化相比于指數(shù)計算可以節(jié)省大量資源,如果樣本數(shù)據(jù)沒有大量集中在一起時,對圖像數(shù)據(jù)的線性映射效果會非常好。本設(shè)計使用Min-Max歸一化的方法來代替指數(shù)運算將加法器輸出的數(shù)據(jù)重新映射到[0-255]的值域內(nèi)實現(xiàn)圖像的恢復(fù)。Min-Max歸一化算法實現(xiàn)如下
(10)
其中,Ii max和Ii min分別為圖像第i個通道的最大和最小值。Vmax和Vmin是給定放縮范圍的最大值和最小值,對于8位無符號圖像Vmax=255,Vmin=0。 而I′i(x,y) 則為原圖像Ii(x,y) 經(jīng)過線性映射后的結(jié)果。
SSR和MSR算法都存在去霧后圖片往往會出現(xiàn)色彩偏差的問題,因為算法分通道單獨進行,忽略了不同色彩通道之間的聯(lián)系。文獻[5,6]將圖像從RGB空間分別轉(zhuǎn)換到HSV和YCbCr空間,只對亮度信息進行處理,這樣雖然有效防止了色彩出現(xiàn)偏差,但是并不能增強被霧霾弱化的色彩,且一定程度上也會減弱去霧效果。本文根據(jù)MSRCR算法,引入色彩恢復(fù)因子,用于調(diào)節(jié)各個通道之間的比例關(guān)系,在數(shù)據(jù)選取恰當(dāng)?shù)那闆r,可以在不影響去霧效果的情況下有效恢復(fù)出圖像原始色彩。為了抑制高亮天空區(qū)域,G選擇為0.7。調(diào)節(jié)各通道比例的α、β參數(shù)分別選擇為200和0.36可以對大部分有霧圖像起到較好的色彩恢復(fù)效果。
Retinex算法以色彩恒常性理論為基礎(chǔ),而自動白平衡算法(auto white balance,AWB)可以消除相機在不同光線條件下可能會出現(xiàn)的偏色問題,模擬人類視覺系統(tǒng)的顏色恒常性。常用的AWB算法有灰度世界法、完美反射法等[14],硬件實現(xiàn)難度相仿。本文選取消耗資源更少的灰度世界法對經(jīng)過色彩因子恢復(fù)的圖像進行白平衡,進一步保證算法對原始色彩、色溫的準(zhǔn)確恢復(fù)調(diào)節(jié)。算法實現(xiàn)如下
(11)
(12)
式中:Ravg、Gavg、Bavg分別為RGB這3個通道亮度均值,K=(Ravg+Gavg+Bavg)/3。
直方圖均衡化將圖像的原始直方圖變換為均勻分布的形式,有效增加圖像灰度的動態(tài)范圍,一定程度上消除了顏色偏差,同時增加了對比度,顯示了更多的細節(jié)。Reti-nex算法可以顯著提高暗部區(qū)域的細節(jié),但亮部區(qū)域處理后可能會出現(xiàn)光暈、泛白、對比度下降等現(xiàn)象[15]。本文將這兩種圖像增強算法進行像素級融合互補,首先將圖像轉(zhuǎn)換到Y(jié)CrCb空間對亮度分量Y進行直方圖均衡,可以使圖像不出現(xiàn)失真的情況下增強對比度,再轉(zhuǎn)回RGB空間與經(jīng)過Retinex算法后輸出的圖像進行線性融合,融合規(guī)則如下
dst(x,y)=α*src1(x,y)+(1-α)src2(x,y)
(13)
src1(x,y) 和src2(x,y) 分別為直方圖均衡化與Retinex過程處理后圖像,α取0.2時對大部分圖像都能起到良好的融合效果,融合后圖像各方面指標(biāo)都較為優(yōu)秀。
Xilinx公司的Vitis HLS(high-level synthesis)工具可以從C層面開發(fā)和驗證算法,以更高的抽象級別實現(xiàn)硬件細節(jié)。相比于RTL層面更快迭代設(shè)計。在設(shè)計中使用指令(pragmas),進而實現(xiàn)算法代碼對硬件電路精確的調(diào)度與綁定。Vitis vision庫是基于OpenCV針對FPGA架構(gòu)專門優(yōu)化的視覺庫,包含了大部分基礎(chǔ)的OpenCV算法函數(shù),方便用戶快速實現(xiàn)自己的算法。設(shè)計使用Vitis HLS工具完成去霧IP核開發(fā)與驗證,并在ZYNQ 7020開發(fā)板上進行測試。
FPGA通過為每個功能模塊建立單獨的硬件來實現(xiàn)整個算法所需要的邏輯功能,指令#pragma HLS DATAFLOW可以讓每個功能模塊間形成流水線,實現(xiàn)在一個時刻完成多個算法的并行處理,最大程度上降低算法總延時,算法整體流水線架構(gòu)如圖2所示。
圖2 改進Retinex算法內(nèi)部流水線設(shè)計
(1)將原圖像每個像素點加1,防止在對數(shù)運算中出現(xiàn)錯誤。
(2)復(fù)制數(shù)據(jù)流,分別用于直方圖均衡化過程和Reti-nex過程。
(3)第一路數(shù)據(jù)流圖像轉(zhuǎn)換到Y(jié)CrCb色彩空間,通過直方圖均衡化模塊只對Y分量進行處理后再轉(zhuǎn)回RGB空間。
(4)第二路數(shù)據(jù)流經(jīng)過雙邊濾波與Gamma校正處理后與經(jīng)過同步保持的第三路數(shù)據(jù)流進行Retinex過程處理。
(5)將Retinex算法和直方圖均衡化算法處理后的數(shù)據(jù)進行線性融合。
(6)對融合后的圖像進行色彩恢復(fù)以及白平衡處理,最后輸出去霧圖像。
算法內(nèi)部是由許多功能模塊通過DATAFLOW指令串聯(lián)而成的,功能模塊根據(jù)FPGA架構(gòu)特點進行設(shè)計,同時也應(yīng)用了適合的pragma在邏輯資源與處理延時之間達到平衡。
3.2.1 查找表計算對數(shù)
改進算法中的Retinex過程模塊和色彩恢復(fù)模塊都涉及到對數(shù)運算。對數(shù)運算和指數(shù)運算一樣會消耗FPGA內(nèi)部大量的硬件資源。算法處理的圖像是8位3通道的真彩色圖像,像素點的灰度級數(shù)在0-255之間,所以對于Retinex過程模塊只需要存儲ln[0-255]的值就可以快速計算出對數(shù)值。而對于色彩恢復(fù)模塊,將式(6)變形可得
(14)
3.2.2 數(shù)據(jù)格式標(biāo)準(zhǔn)化
改進算法中處理過程中會產(chǎn)生大量的小數(shù),例如進行Min-Max歸一化時,會先將圖像數(shù)據(jù)壓縮到0-1范圍,再重新映射回0-255值域內(nèi)。考慮到ZYNQ中DSP48E資源的浮點運算能力較弱,本設(shè)計將所有出現(xiàn)的浮點數(shù)轉(zhuǎn)化為定點保存。由Min-Max歸一化公式可知,要想數(shù)據(jù)在定點近似保存時不存在誤差,分辨率至少為1/255≈4×10-3。在計算機中二進制近似表示為0.000000010000011000。Vitis HLS除了支持C++基本數(shù)據(jù)類型之外,還提供了任意精度定點數(shù)據(jù)類型,可以避免位寬資源不必要的浪費。通過模板類ap_[u]fixed
根據(jù)上述分析,設(shè)計統(tǒng)一使用ap_fixed<24,8> 有符號定點數(shù)表示浮點數(shù)。對于圖3中不同數(shù)據(jù)精度輸出圖像:主觀上看不出太大差別,但是使用Image Watch工具放大道路紅燈處像素,可以看出使用ap_fixed<16,8> 定點數(shù)據(jù)相對于使用單精度浮點數(shù)算法輸出圖像有較大誤差,而使用ap_fixed<24,8> 定點數(shù)據(jù)的輸出誤差可以忽略不計。經(jīng)過計算,使用ap_fixed<24,8> 類型數(shù)據(jù)相對于單精度浮點數(shù)據(jù)輸出圖像結(jié)構(gòu)相似性達到99.7%,客觀上保證了去霧效果不會受限于數(shù)據(jù)精度。
圖3 不同數(shù)據(jù)精度輸出圖像及其局部像素值
3.2.3 依賴循環(huán)流水化
在Min-Max歸一化算法和自動白平衡算法以及直方圖均衡化算法內(nèi)部都存在有依賴關(guān)系的循環(huán)。以Min-Max歸一化處理為例,算法需要計算出一幀圖像數(shù)據(jù)的最大最小值,再使用該值進行歸一化處理。
如圖4所示,算法需要經(jīng)過兩次對圖像遍歷的Loop才能完成對圖像的歸一化處理,由于兩個Loop之間存在依賴關(guān)系,無法使用DATAFLOW指令進行流水線處理,只能串行執(zhí)行這兩個Loop,極大增加了算法的延時,且對于其它模塊需要的同步FIFO是巨大的。對此,設(shè)計使用static限制符初始化一個存放最大最小值的數(shù)組用于Loop2進行歸一化處理,并將Loop1和Loop2合并,在完成當(dāng)前幀數(shù)據(jù)歸一化后再使用當(dāng)前幀數(shù)據(jù)最大最小值更新數(shù)組,下一幀圖像使用上一幀圖像數(shù)據(jù)進行歸一化處理,在實際測試中,可以每秒處理100幀以上數(shù)據(jù),不會對效果產(chǎn)生影響。
圖4 Min-Max歸一化算法流水線改進方式
3.2.4 模塊間數(shù)據(jù)同步
設(shè)計使用#pragma HLS PIPELINE II=1指令將模塊內(nèi)部流水線化,并指定啟動時間間隔(II)為1,這樣可以降低每個模塊之間需要同步的FIFO大小。流水線的瓶頸位于設(shè)計中處理最慢的模塊,對于改進Retinex算法來說是雙邊濾波模塊,根據(jù)設(shè)計推導(dǎo)可知,需要同步的FIFO深度D≥[(S-1)/2]·W, 其中S為濾波器窗口大小,W為圖像寬度。所以設(shè)計指定FIFO深度為1000以使得不同模塊之間的數(shù)據(jù)得以同步處理。
本文算法仿真測試環(huán)境為基于OpenCV3.4.11的Vitis HLS 2020.2?;贖SV空間的MSR算法處理平臺為基于OpenCV4.1的Visual Studio 2019,PC配置為主頻3.6 GHz的AMD Ryzen R5-3600 CPU,以及16 GB雙通道DDR4內(nèi)存。算法實際驗證平臺為正點原子啟明星ZYNQ7020開發(fā)板、OV5640攝像頭和4.3寸800×480分辨率屏幕。
為了驗證算法的效果以及可行性,選取了3組圖片分別進行仿真對比,測試結(jié)果如圖5所示。
圖5 兩種算法輸出結(jié)果
主觀上來看,基于HSV空間的MSR算法和本文算法輸出圖像相對于原圖像均有不同程度細節(jié)提升、對比度增強。前者對于濃霧處細節(jié)增強要優(yōu)于后者,但是圖像部分噪聲也被放大,出現(xiàn)了明顯的色彩失真,本文算法處理后圖像顏色偏差很小,飽和度適中,但是細節(jié)不夠豐富。整體來說,本文算法處理圖像相較于前者更符合人類視覺感知。從客觀上,對兩種算法輸出的去霧圖像進行了信息熵、峰值信噪比(PSNR)、結(jié)構(gòu)相似性(SSIM)以及每幀處理耗時(T)這4個維度的評價。信息熵表示圖像中每個灰度級像素的可能信息量,信息熵越大,圖像的細節(jié)越完整、輪廓越清晰。PSNR可評價圖像的重建質(zhì)量,PSNR越小,表示圖像越模糊。SSIM主要用于度量圖像結(jié)構(gòu)信息的保留程度,值越大,表明圖像保留了越多的結(jié)構(gòu)或深度信息。指標(biāo)具體計算方法可見文獻[16],原圖像以及兩種算法輸出圖像作為評價標(biāo)準(zhǔn)參數(shù)輸入,其中每幀處理耗時(T)計算結(jié)果分別由Vitis HLS/Visual Studio工具輸出,其余指標(biāo)均在MATLAB中編寫程序計算得出。表1與表2分別為兩種算法輸出圖像清晰度指標(biāo)數(shù)據(jù)。
表1 基于HSV空間的MSR算法輸出圖像數(shù)據(jù)
表2 本文算法輸出圖像數(shù)據(jù)
從表中數(shù)據(jù)分析可知,本文算法相對于前者算法輸出3幅圖像平均的信息熵和峰值信噪比數(shù)據(jù)有不同程度提高,而在結(jié)構(gòu)相似性方面則有較大幅度提升,算法在ZYNQ上運行幀處理耗時相對于PC更是有高達17倍的加速??陀^說明本文算法相較于前者算法圖像更清晰,顏色保真度更高,實時性更好。與主觀感受基本相符。
在C驗證完成后,對工程進行了C/RTL聯(lián)合仿真,保證算法映射出的電路準(zhǔn)確無誤。綜合報告指出在主頻為100 MHz下需要403 363個Cycle完成一幀800×480大小的彩色圖像處理,也就是約為4.03 ms處理完一幀圖像。完全能夠滿足系統(tǒng)實時性的需求。算法綜合后資源報告見表3。
表3 算法綜合后資源使用數(shù)據(jù)
經(jīng)過優(yōu)化后的算法綜合后完全滿足ZYNQ SoC的資源要求,實際上整體工程經(jīng)過布局布線后會進一步優(yōu)化,SoC內(nèi)部除了IO資源外其余各種資源利用率均不超過30%。在完成軟硬件設(shè)計后,進行實際工程測試,系統(tǒng)測試架構(gòu)如圖6所示。
圖6 去霧系統(tǒng)視頻通路設(shè)計
系統(tǒng)將OV5640攝像頭輸入的有霧視頻數(shù)據(jù)轉(zhuǎn)換為AXI4-Stream協(xié)議方便在SoC內(nèi)部高速傳輸,輸入視頻通過Retinex去霧IP核進行實時處理。VDMA IP核通過AXI-HP高性能接口將去霧后的數(shù)據(jù)送入ARM端并寫入DDR3中緩存,VDMA同時根據(jù)LCD屏幕時序與數(shù)據(jù)速率讀取DDR3中緩存數(shù)據(jù)并進行輸出。另外ARM端使用AXI-GP通用接口對IP核以及外設(shè)進行配置,上位機可以通過AXI4-Lite協(xié)議對去霧IP核絕大部分參數(shù)進行實時配置以取得更好的去霧效果,實際測試結(jié)果如圖7所示。
圖7 實際去霧效果測試
通過配置OV5640攝像頭寄存器輸出800×480@45 fps格式視頻,實際測試時輸出去霧圖像因室內(nèi)測試光線影響出現(xiàn)部分失真,不會影響實際使用。切換場景時系統(tǒng)可以對輸入視頻進行實時去霧處理。算法上板測試與之前仿真結(jié)果基本一致,驗證了嵌入式去霧系統(tǒng)的有效性與實時性。
本文首先分析了異構(gòu)SoC相對于傳統(tǒng)串/并行架構(gòu)在進行圖像處理的優(yōu)劣勢所在,并對MSRCR算法做出照度估計、色彩平衡、融合增強等多方位改進,克服了原算法的不足。同時根據(jù)ZYNQ SoC架構(gòu)特點,對算法全流水線設(shè)計部署難點提出解決方案,大大提升了算法實時性。數(shù)據(jù)分析與實測結(jié)果表明:改進算法客觀上顯著提高了對比度和清晰度并有效恢復(fù)原始圖像色彩,與主觀感受與實際測試結(jié)果相符。另外本文構(gòu)建的基于ZYNQ SoC的實時去霧系統(tǒng),可以根據(jù)使用場景不同,靈活調(diào)整算法參數(shù)。系統(tǒng)在實時性、成本控制、去霧效果、靈活性等各方面完全滿足了戶外去霧系統(tǒng)的需求。