劉華軍, 張瑞玨, 劉建鋒, 王 盛, 夏巧橋
(1.華中師范大學 物理科學與技術學院,湖北 武漢 430079; 2.上海航天電子技術研究所,上海 201109)
由于大氣散射使得圖像質量嚴重退化、對比度下降、層次不豐富[1],霧天圖像去霧處理成為了國內外的研究熱點。根據不同的圖像處理方式將去霧算法分為基于物理模型方法和基于非物理模型方法[2]。睢丹等[3]提出了基于混沌性的加權濾波算法,有效地降低了霧化、減少了濃霧噪點。郭偉[4]提出了基于多種先驗知識的單幅霧天圖像復原算法;何凱明等[5]提出了“基于暗通道優(yōu)先的單幅圖像去霧”方法,兩種方法主要針對單幅圖像,去霧效果明顯,但算法的時間和空間復雜度較高。何凱明等[6]進一步提出導向濾波算法,以提高暗通道優(yōu)先算法的處理速度,但其計算復雜度仍較高。魏先民[7]提出了自適應直方圖均衡算法(adaptive histogram equalization,AHE),該算法自適應好、魯棒性強,但是其存在過度放大均勻區(qū)域噪聲的缺陷。基于此,Zuiderveld[8]提出了限制對比度自適應直方圖均衡(contrast limited adaptive histogram equalization,CLAHE)算法,提升了圖像的局部對比度并突出圖像細節(jié)。由于CLAHE算法有優(yōu)異的去霧效果,計算簡單且易于并行化實現,因此得到研究者青睞。楊光等[9]重點研究了CLAHE算法框架及其FPGA實現,實驗表明該算法具有良好的去霧效果。周衛(wèi)星等[10]提出的方法改善了圖像的整體視覺效果。文獻[11-12]以FPGA為硬件平臺實現了CLAHE算法,系統(tǒng)滿足實時性且圖像對比度明顯增強??讐训萚13]利用CLAHE算法設計基于高分辨率的視頻圖像去霧系統(tǒng),但是圖像分辨率僅為1 004×1 004。周曉波等[14]利用FPGA設計了支持多種分辨率的圖像高速實時去霧系統(tǒng),但其算法復雜度以及系統(tǒng)實時性仍有改善的空間。雖然現有去霧系統(tǒng)取得了不錯的去霧效果,但大多數系統(tǒng)針對單幅圖像進行處理,穩(wěn)定性和實時性不足,且存在亮光區(qū)域過曝的缺陷。針對這些問題,筆者設計并構建了一種基于FPGA的1080P全高清視頻圖像實時增強去霧系統(tǒng)。測試結果表明:系統(tǒng)對分辨率為1080P視頻圖像去霧效果明顯、圖像層次感強,同時具有較強的實時性和穩(wěn)定性,系統(tǒng)功耗小于5 W。
圖1 系統(tǒng)框圖Figure 1 System architecture
圖1為系統(tǒng)硬件框圖。高速相機輸出圖像分辨率為1 920×1 080,幀頻為30 f/s。相機通過HD-SDI接口傳輸至去霧系統(tǒng),接口芯片為GV7600,用于視頻圖像配置,系統(tǒng)可實現圖像自檢、鏡像、電子變倍以及電十字疊加等功能,并完成圖像增強去霧。通過RS-422串口命令對系統(tǒng)功能進行控制,其經過FPGA軟核解析并轉發(fā)給邏輯實現控制FPGA內部功能。圖2為FPGA內部功能圖,圖3為系統(tǒng)實物圖,其尺寸為103 mm×60 mm,質量小于100 g。
圖2 FPGA功能模塊Figure 2 The functional modules of FPGA
圖3 系統(tǒng)實物圖Figure 3 The photo of the system
CLAHE算法將圖像進行分塊,對每個子塊采用對比度限幅操作來克服AHE算法過度放大噪聲的缺陷。CLAHE算法步驟如下。
步驟1將圖像劃分為4×4個大小相同的子塊(非重疊圖像,1≤i,j≤4),分別對子塊進行直方圖統(tǒng)計,即統(tǒng)計各灰度級的像素數。
步驟2利用截斷閾值β對直方圖進行削峰填谷操作,截斷閾值β的計算如式(1):
(1)
步驟3對削減后的直方圖進行均衡,將多出的像素數分配到像素數小于β的灰度級中,以1作為像素分配步長,通過迭代的方法進行像素重分配,直至像素分配完畢,得到均衡后的結果。
步驟4根據直方圖均衡結果可得到每個子塊直方圖映射f以及其中心像素點的灰度值,其他點的像素通過與其鄰近的4個子塊的直方圖映射f采用雙線性插值算法獲取。圖4為圖像第j-1行至第j行、第i-1列至第i列的局部示意圖(i,j≥2),其中P為待增強像素點,x、y、w、r數值關系確定P點和參考點的位置關系,根據其處于角落、內部、邊界來確定各相鄰子塊的權重關系,加權計算得到最終的像素值,如式(2)所示:
(2)
式中:Pold為原始像素點的灰度值;Pnew為增強去霧后新灰度值。
圖4 第(i,j)子塊中像素P及其相鄰的4個子塊Figure 4 The four adjacent blocks of the sub-block(i, j)
圖5為改進CLAHE算法的FPGA實現流程圖。整個系統(tǒng)劃分成6個模塊,分別為輸入模塊、直方圖統(tǒng)計模塊、直方圖均衡模塊、灰度值映射模塊、雙線性插值模塊以及輸出模塊。其中,直方圖統(tǒng)計模塊采用分塊分通道統(tǒng)計,將多通道直方圖合并于一個直方圖中,用于后面的削峰填谷;針對直方圖均衡模塊,原CLAHE算法以1作為分配步長,該過程需要多次的迭代,像素重分配操作需要進行多次迭代,使得圖像處理延時較大。而筆者將該過程利用映射算法進行計算,將多出的像素灰度值個數均勻的分配給256個灰度級,且僅需要進行一次削峰填谷操作,提高了算法的效率。各個模塊均采用標準axi_stream接口進行互聯。
圖5 FPGA實現流程圖Figure 5 The FPGA program block diagram
輸入模塊:輸入模塊通過SDI接口采集相機輸出的高速圖像數據,將圖像數據從YUV顏色空間轉換為RGB顏色空間,并將數據流轉換為標準的axi_stream接口,方便與后續(xù)模塊互聯。
直方圖統(tǒng)計模塊:本系統(tǒng)將視頻圖像劃分為多個非重疊子塊,對每個子塊分RGB通道進行直方圖統(tǒng)計,并將多通道直方圖進行合并,合并后的直方圖數據存入乒乓RAM中。如圖6為子塊1的直方圖統(tǒng)計,分RGB通道統(tǒng)計各分塊的灰度直方圖信息,采用邊輸入邊計算的方法,將每個通道灰度值對于像素數存入對應的RAM1_R、RAM1_G、RAM1_B存儲器中。當該子塊所有像素輸入完成之后,讀出該子塊每個通道像素值并將其進行疊加統(tǒng)計,最后將整合的直方圖寫入乒乓RAM1_RGB中。截斷閾值β可以由上位機通過RS-422設置。當某個灰度值的個數M′大于或者等于β時,由β代替該像素的個數M′存入到RAM_RGB中,并將超過門限值的像素點個數M′-β累計到對應子塊的寄存器REG_cnt中,用于后續(xù)的直方圖均衡操作。
直方圖均衡模塊:直方圖統(tǒng)計完成后,通過削峰填谷對其進行均衡操作,如圖7所示。β為輸入閾值,由于實際環(huán)境的多變性,單一閾值無法對所有情況都達到良好的去霧效果,因此本系統(tǒng)提供了多個可供選擇的β值。
圖6 子塊1的直方圖統(tǒng)計Figure 6 The histogram statistics
圖7 直方圖均衡Figure 7 The histogram equalization
均衡算法步驟如下:
步驟1初始化參數。 計算分配步長L=REG_cnt/256,設置截斷閾值β,初始化當前灰度級i=0的像素個數M′,均衡后的灰度級個數K=0以及灰度級范圍i∈[0,255]。
步驟2計算均衡后的灰度級像素個數K=L+M′[i]。
步驟3若K>β,則當前灰度級像素個數M′[i]為β;否則灰度級像素個數M′[i]=M′[i]+L。
步驟4更新灰度級i=i+1。
步驟5停止準則,判斷i是否達到最大灰度級255。若滿足則輸出均衡后各灰度級的像素數;否則轉步驟2。
原始CLAHE算法像素重分配操作需要進行多次迭代,使得圖像處理延時較大,將變量REG_cnt與灰度級的個數作商,將多出的像素灰度值個數一次性均勻地分給各個未飽和灰度級,提高了實時性的同時節(jié)約了系統(tǒng)資源。
灰度值映射模塊:利用映射算法,通過原始圖像灰度值映射出增強后的灰度值。
映射算法步驟如下:
步驟1初始化每個子塊的總像素數N、灰度級i=0以及其對應的原始灰度級像素值Yi=0。
步驟4更新灰度級i=i+1。
步驟5判斷停止條件,判斷i是否達到最大灰度級255。若滿足則輸出增強后各灰度級的數值;否則轉步驟2。
將均衡后的灰度值直方圖數據采用乒乓的方式按奇偶幀存入RAM中。
雙線性插值模塊:圖8為雙線性插值模塊功能框圖。雙線性插值模塊包括數據選取、權值計算以及插值計算。從RAM中讀取像素數據時,同時計算權值因子,需對像素時鐘做一定的延時來保證兩者的同步性。位于角落、內部、邊界位置的像素對應不同的插值計算。最后,利用視頻圖像相鄰兩幀直方圖的高度相似性,以前一幀直方圖均衡后的映射灰度值作為當前幀圖像處理的數據,可避免緩存一幀的數據,避免了大容量外部存儲器的使用,節(jié)約了資源,提高了實時性。
圖8 插值計算模塊Figure 8 The interpolation calculation
像素點在圖像中的位置由像素時鐘和行同步信號(LVAL)計數獲得,即確定其所屬子塊中的位置。
輸出模塊:輸出數據通過芯片GV7600/DS90CR288解析,通過SDI/Cameralink接口傳送給顯示端。
為驗證本文算法的有效性,將本文算法與原始CLAHE算法進行對比。圖9為兩種去霧算法效果圖。僅對原始CLAHE算法中Y方向分量做均衡使得圖片的整體亮度有一定的增強,但其色彩暗淡,對比度較低;而本文算法處理效果明顯,圖片色彩均勻,圖片的層次感較強。
圖9 兩種算法去霧效果對比Figure 9 The fogging effect of the two algorithms
采用Xilinx Vivado軟件對FPGA程序進行布局布線,FPGA資源消耗如表1所示。其中,共消耗了53 064個查找表(LUT),占總查找表的26.04%;消耗103個塊存儲單元(BRAM),占總BRAM的23.15%;消耗了60個DSP資源,占總DSP的7.14%。
表1 FPGA資源消耗Table 1 The resource consumption of FPGA
圖10為直方圖統(tǒng)計模塊MODELSIM仿真的結果圖。將像素灰度值按一定的時序寫進RAM中,圖中:rgb_vld為數據有效標志(高有效);rgb_data為灰度值(如0×71、0×72等);ram_wr_cnt為灰度值個數(如0×4 100(16進制))。
圖11為雙線性插值模塊的MODELSIM仿真結果圖。按一定的時序從RAM中讀取直方圖均衡后的灰度值,通過讀取原始像素值查找新映射表來索引增強后的像素值。以讀取B通道數據為例,其中:ram1_en_pi_b為讀B值使能(高有效),ram1_addr_pi_b為B的數據地址(如0x85、0x84),ram1_din_pi_b為B的數據值(如0x92),pipe1_row_cnt與pipe1_line_cnt為子塊1的行列計數(如0x20、0x3f),以確定該值所在子塊1中位置。
圖10 直方圖統(tǒng)計仿真結果Figure 10 The simulation of histogram statistics
圖12為本文算法MATLAB實現和FPGA實現效果圖。FPGA與MATLAB實現結果圖對應位置像素點的RGB值一致,說明了FPGA實現的正確性。
圖12 MATLAB和FPGA 實現效果圖Figure 12 The fogging effect of this algorithm in MATLAB and FPGA
圖13為系統(tǒng)外場測試結果??梢钥闯?,原始有霧圖像圖片不清晰、對比度較低,很難識別圖中的目標(圖中房屋輪廓);而去霧圖像對比度增強、突出細節(jié)、層次感增強。結果表明,該系統(tǒng)具有較強的實時性和穩(wěn)定性,系統(tǒng)功耗測試僅為4.848 W,可應用于低功耗領域。
圖13 系統(tǒng)去霧效果圖Figure 13 The fogging effect of this system
以FPGA為硬件平臺,設計并構建了一種基于1080P高分辨率視頻圖像實時增強去霧系統(tǒng),對CLAHE算法進行一定的改進,完成了改進后的CLAHE算法各個模塊的設計和硬件實現。系統(tǒng)測試結果表明,系統(tǒng)具有極好的穩(wěn)定性和實時性,圖像的對比度明顯增強,圖像內容清晰,層次感強,能夠達到很好的去霧效果,同時還具有低功耗特性。