嚴 飛,陳佳宇,張華西,劉銀萍,劉 佳
(1.南京信息工程大學自動化學院,江蘇南京 210044;2.南京信息工程大學大氣物理學院,江蘇南京 210044;3.江蘇省大氣環(huán)境與裝備技術協(xié)同創(chuàng)新中心,江蘇南京 210044)
數(shù)字圖像在傳輸或者采集的過程中,會因為傳輸接口、傳輸距離、傳輸環(huán)境等因素引入各種不同的噪聲[1]。噪聲帶來的誤差會累計傳遞,因此需要對數(shù)字圖像進行去噪,方便后期應用。常用的圖像去噪方式有均值濾波、中值濾波以及高斯濾波等[2-5]。圖像存在的噪聲大多數(shù)為高斯噪聲,所以高斯濾波在圖像去噪中應用廣泛。而高斯濾波只考慮了像素點空間分布,沒有考慮到像素值的差異,會將圖像邊緣模糊。在1998年,文獻[6]在高斯濾波算法的基礎上提出了雙邊濾波算法。雙邊濾波區(qū)別于高斯濾波,它在去除噪聲的同時可以使圖像邊緣保持清晰[7]。雙邊濾波等算法需要經(jīng)過大量的計算,在許多實時性要求比較高的場合采用傳統(tǒng)ARM、DSP等串行架構處理器進行處理難以保證實時性。文獻[8-9]采用GPU對算法實現(xiàn)硬件加速,但是GPU功耗太大,不利于嵌入式場景。
從圖像去噪實時性與低功耗為目的出發(fā),從20世紀90年代開始,國外陸續(xù)有學者將FPGA用于圖像傳輸[10-13]。到21世紀初,使用者對于視頻圖像畫面質量的要求不斷提高,催促視頻技術的飛速發(fā)展[14]。在國內(nèi),文獻[15-17]開始研究使用FPGA對圖像做預處理。近年來,文獻[18]采用FPGA對雙邊濾波進行設計,未對算法進行優(yōu)化。文獻[19]將雙邊濾波值域核算法進行拆分,對算法進行加速的同時,減少了值域核計算資源浪費。
本文深入研究了雙邊濾波算法[20],對算法中的空域核計算部分進行剪枝并使用離散化[21]采樣方法對值域核進行計算。因傳統(tǒng)3×3卷積核覆蓋像素特征點范圍小,本文綜合計算量考慮后用5×3卷積核設計了基于FPGA的圖像雙邊濾波系統(tǒng)[22]。實驗結果表明該系統(tǒng)在保證圖像去噪快速性的同時,去噪質量也得到保證。
本設計采用的FPGA芯片是SPARTAN-7系列XC-7S50FGGA484-1,主要用來接收圖像、處理圖像以及驅動顯示器實時輸出顯示。
圖1為Verilog程序模塊框圖,系統(tǒng)的工作流程分為如下幾個步驟:上位機通過串口將圖片為RGB888格式數(shù)據(jù)發(fā)送給FPGA,F(xiàn)PGA接收圖片數(shù)據(jù)并拼接完成后經(jīng)過FIFO緩存器存放于DDR3存儲器。待接收完整幅圖片數(shù)據(jù)后,F(xiàn)PGA將數(shù)據(jù)從DDR3存儲器中循環(huán)讀出[23],經(jīng)過FIFO緩存器給雙邊濾波模塊進行處理。雙邊濾波模塊處理數(shù)據(jù)并實時輸出,最后生成視頻時序并將數(shù)據(jù)依照視頻顯示時序同時經(jīng)過TMDS編碼模塊實時HDMI輸出顯示。
圖1 Verilog程序模塊框圖
本圖像雙邊濾波系統(tǒng)采用了參數(shù)化的設計方式,可以支持任意分辨率的圖像濾波處理。本次使用800×600分辨率圖像對雙邊濾波系統(tǒng)進行實現(xiàn)。
前期采用Matlab將24位BMP圖像轉化為RGB888格式,通過上位機進行傳輸。上位機依次傳輸8 bit數(shù)據(jù),在FPGA端接收3次8 bit數(shù)據(jù)拼接為單個像素點數(shù)據(jù)。每次接收完8 bit數(shù)據(jù)時拉高一個時鐘Rx_done完成信號,接下來用Rx_done信號對接收數(shù)據(jù)進行打拍操作,對數(shù)據(jù)拼接。
與其他的濾波原理一樣,雙邊濾波所采用的是加權平均的方法。對周邊領域像素點的亮度值加權平均來表示像素點的強度。考慮到濾波處理時數(shù)據(jù)循環(huán)從DDR中讀取,因此在存儲數(shù)據(jù)時將RGB888格式的圖像數(shù)據(jù)信息轉化為YCbCr格式,為最后經(jīng)過雙邊濾波模塊處理時減少數(shù)據(jù)量與時鐘延時。
RGB轉換為YCbCr的公式如下:
Y=0.29R+0.587G+0.114B
(1)
Cb=-0.172R+0.511B+128
(2)
Cr=0.511R-0.428G-0.083B+128
(3)
圖2為RGB轉YCbCr仿真圖,本設計在FPGA內(nèi)部采用流水線的設計思想對YCbCr進行計算。分3步進行,分別是乘法、加減法與除法。只需3個時鐘周期便可輸出結果。由于FPGA不適合進行浮點數(shù)的運算。所以在對數(shù)據(jù)進行計算時,將所有數(shù)據(jù)進行左移8位擴大256倍進行計算,在最終的計算結果右移8位進行結果輸出。最小化減少計算過程中數(shù)據(jù)的精度損失。
圖2 RGB轉YCbCr仿真圖
雙邊濾波算法于1988年由文獻[6]基于高斯濾波方法提出。傳統(tǒng)的高斯濾波方法直接將高斯權重系數(shù)與圖像信息直接做卷積運算,只考慮了像素點間的空間距離關系,得到的圖像不清晰。雙邊濾波算法將高斯濾波權系數(shù)優(yōu)化成高斯函數(shù)和圖像亮度信息的乘積,優(yōu)化后的權系數(shù)再與圖像信息作卷積運算,這樣就考慮到了像素點間的相似程度,使得到的圖像邊緣更加平滑。此方法對于彩色和灰度圖像的濾波均適用,具有很強的實用性。
雙邊濾波的公式為
(4)
(5)
在本設計中分別用ws與wr表示空間域核二維高斯濾波函數(shù)Gσs和圖像像素值域核Gσr,其計算公式為:
(6)
(7)
式中:I(i,j)與I(m,n)分別為中心點與滑動窗口中某個點像素亮度值;σs為空域標準差;σr為值域標準差。
σs和σr均是已知的權重值,而i,j,m,n都是需要在窗口中遍歷確定的值。
圖3為本系統(tǒng)設計選用的5×3滑動窗口,它相比于傳統(tǒng)3×3與5×5窗口,獲得的特征像素點多,計算量適中。其中(i,j)為窗口的中心點坐標值,(m,n)為滑動窗口中的某個點坐標值。
圖3 5×3滑動窗口
在ws的計算中,ws只與σs和所選取的矩陣有關,當兩者都給定后,ws便是固定值。而wr所反映的是像素范圍域的輻射差異(例如卷積核中像素域中心像素之間相似程度、顏色深度、深度距離等),因此wr不僅與σr選取有關,而且還與滑動窗口中心點周圍像素點有關。
區(qū)別于傳統(tǒng)設計方式將式(6)結果存入ROM,本文在對雙邊濾波模塊進行設計時確定好σs,采用Matlab計算出ws值,由于浮點數(shù)不利于FPGA計算,因此將結果值擴大211(2 048)倍取整變?yōu)?2位數(shù)據(jù)直接進行賦值并在最終結果去掉低11位。可以節(jié)省FPGA內(nèi)部存儲資源,減少計算帶來的時鐘延時。
wr=2 048ax2,x∈[0,255]
(8)
如圖4所示,采用Matlab繪制出該函數(shù)曲線,對該曲線離散化,在x軸對其進行255次等間隔采樣,抽取縱坐標值取整進行存儲作為wr近似計算結果,存入FPGA內(nèi)部8位查找表中進行計算。
圖4 函數(shù)曲線圖
本文對該算法進行優(yōu)化后,將值域核部分直接縮減為一個8位查找表結果輸出。相比于以往的16位查找表,使用的存儲資源縮減為原來的1/256,相比于4個8位查找表輸出結果相乘,存儲資源縮減為原來的1/4,同時省去了查找表后進行乘法運算的步驟,對算法進行加速,減少了資源浪費。
圖5為FPGA內(nèi)部5×3雙邊濾波算法設計框圖,采用4個行緩存FIFO,上一級FIFO讀接口與下一級FIFO的寫接口相連。內(nèi)部采用計數(shù)器對FIFO中緩存的數(shù)據(jù)進行計數(shù)。當?shù)?級FIFO中數(shù)據(jù)緩存滿一行像素點的同時拉高第2級FIFO讀信號與第2級FIFO寫信號,以此類推。為了對5×3窗口進行圖像卷積運算時補上空白2行像素點,在第3行像素點讀入FIFO時便同時取出4個FIFO讀端口數(shù)據(jù)一起組成5×3矩陣第1列數(shù)據(jù),將數(shù)據(jù)存放于寄存器內(nèi)連打2拍,在第3拍便組成一個完整的5×3矩陣。
圖5 雙邊濾波器算法設計框圖
在進行除法運算時,本設計中被除數(shù)為36位、除數(shù)為28位,如果使用XILINX提供的IP核進行計算,將會消耗40個時鐘周期。為了降低延時改為移位比較法,將被除數(shù)存放于寄存器當中,除數(shù)存放于移位寄存器中。最開始將除數(shù)整體左移8位,有效位與被除數(shù)進行比較,當被除數(shù)大于等于除數(shù)時,輸出為1,其他情況為0。依次往右移位8次,只需8個時鐘即可拼接輸出計算結果。
圖6為雙邊濾波器時序設計圖。雙邊濾波器模塊采用AXI總線進行設計,tuser為每幀起始使能一個時鐘周期,與第一個有效數(shù)據(jù)對齊,tvalid與有效數(shù)據(jù)對齊,tlast與每行最后一個有效數(shù)據(jù)對齊使能一個時鐘周期,tdata為數(shù)據(jù)線,每個時鐘周期傳遞一個像素點的有效數(shù)據(jù)。該模塊的設計靈活,完全符合VGA行掃描時序。
預冷指迅速去除田間熱,將產(chǎn)品溫度降到適宜溫度的過程。預冷是果品冷鏈保藏運輸中必不可少的環(huán)節(jié),必須在產(chǎn)地采收后立即進行,若不能及時降溫預冷,在運輸冷藏過程中很快就會達到成熟狀態(tài),大大縮短貯藏壽命。
圖6 雙邊濾波器時序設計圖
表1為采用SPARTEN-7系列的XCS7050FGGA484-1實現(xiàn)本工程的資源利用率以及功耗圖。系統(tǒng)內(nèi)部使用50 MHz時鐘對本算法進行硬件加速,功率僅1.3 W。資源使用率低,因此該系統(tǒng)加速是輕量級的。
圖7為雙邊濾波器模塊Modelsim仿真圖,從圖7可以看出,數(shù)據(jù)從s_axis_tvaild有效信號拉高到m_axis_tvaild有效信號拉高總計使用2 175個周期(43.5 μs)。
表1 功耗與資源利用率
使用800×600分辨率的圖片對雙邊濾波系統(tǒng)進行驗證,其處理結果如圖8所示。
為了更好地對本系統(tǒng)的處理效果進行評估。采用PSNR與SSIM作為圖像質量評價指標,PSNR即峰值信噪比,是一種評價圖像的客觀標準。PSNR數(shù)值越大代表圖像失真越小。SSIM即結構相似性,是衡量兩幅圖像相似度的指標。SSIM∈[0,1],其值越大表示失真越小。
(9)
圖7 雙邊濾波器模塊Modelsim仿真圖
(a)原圖
(b)噪聲圖
(c)FPGA處理圖
(10)
SSIM(X,Y)=l(X,Y)c(X,Y)s(X,Y)
(11)
(12)
(13)
(14)
式中:MSE為當前待測圖像X與參考圖像Y均方誤差;H、W為待測圖像的寬度和高度;n為像素比特數(shù);μX、μY與σX、σY分別為圖像X和圖像Y的均值和方差;σXσY為圖像X、Y協(xié)方差;C1、C2、C3為常數(shù)。
表2為PC機與FPGA處理對比。從表2可以看出,圖像在PC機上進行同樣的處理消耗1.46 s,無法滿足實時性要求,在FPGA上對其進行加速處理耗時13 ms。而且經(jīng)過本系統(tǒng)對圖像進行去噪處理后,PSNR指標與SSIM指標都得到了明顯提高。
表2 PC機與FPGA處理對比
本文設計了基于FPGA的圖像雙邊濾波處理系統(tǒng),以提高對圖像進行雙邊濾波處理的速度與能效。對雙邊濾波算法進行剖析,將算法進行改進。在FPGA上實現(xiàn)了對雙邊濾波算法的加速。實驗結果證明:PSNR與SSIM值得到提升,且實時性得到保證,由此可說明,該系統(tǒng)設計是可行的。本文設計的系統(tǒng)中的雙邊濾波算法均使用純Verilog語言及參數(shù)化編程,模塊可移植性強。