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