張?zhí)煜?,劉瑞?qiáng),周 沖,劉艷莉,張艷花,張鵬程,桂志國
(1.中北大學(xué) 生物醫(yī)學(xué)成像與影像大數(shù)據(jù)山西省重點實驗室,山西 太原 030051;2.哈爾濱工業(yè)大學(xué) 電子與信息工程學(xué)院,黑龍江 哈爾濱 150001;3.中北大學(xué) 信息與通信工程學(xué)院,山西 太原 030051)
隨著傳感器技術(shù)的發(fā)展,圖像增強(qiáng)技術(shù)已經(jīng)應(yīng)用在工業(yè)檢測、無人機(jī)識別、生物醫(yī)學(xué)成像等多個領(lǐng)域.圖像增強(qiáng)技術(shù)對于實時性要求越來越高,所以越來越多的應(yīng)用領(lǐng)域要求降低算法的時延.實時性要求算法能夠在1 s內(nèi)處理25幀以上圖像,才能滿足人眼的視覺感受,使人眼不會感到卡頓的現(xiàn)象.圖像增強(qiáng)算法中,偏微分方程的圖像增強(qiáng)算法不僅能夠提高圖像對比度,也能較大程度地保留細(xì)節(jié)信息[1-2],但由于操作過程中圖像迭代次數(shù)較多并且每次對整幅圖像進(jìn)行遍歷,在CPU上執(zhí)行圖像的遍歷計算的效率很低[3],運(yùn)行Perona-Malik模型算法處理一幀圖像的時間都在200 ms以上,很難實現(xiàn)算法的實時性處理.
現(xiàn)場可編程門陣列(FPGA)憑借其靈活性好、集成度高、并行處理、開發(fā)周期短等特點已經(jīng)廣泛應(yīng)用于圖像處理的各類加速應(yīng)用中.近年來,將FPGA與傳統(tǒng)嵌入式芯片的融合也成為了一種替代原有技術(shù)的方案.同時,將FPGA作為CPU外帶加速卡已經(jīng)被廣泛應(yīng)用[4],F(xiàn)PGA加速卡不僅能夠為CPU快速實現(xiàn)算法,更有千兆網(wǎng)接口、PCIe接口等來保證超快速地傳輸數(shù)據(jù).
因此,本文提出一種基于各向異性分散模型圖像增強(qiáng)算法的FPGA硬件實現(xiàn)結(jié)構(gòu).該算法是在Perona-Malik模型基礎(chǔ)上的一種改進(jìn)算法,圖像經(jīng)過該算法處理后,對比度有所提高,圖像細(xì)節(jié)明顯增強(qiáng).本文所設(shè)計的硬件結(jié)構(gòu)通過參數(shù)表,流水線處理以及行緩存等操作實現(xiàn).通過軟件實現(xiàn)和Modelsim仿真對結(jié)果進(jìn)行對比,根據(jù)主客觀評價分析表明,將此算法實現(xiàn)在FPGA上,處理效果與軟件實現(xiàn)近似,并且滿足實時性處理要求.
Perona-Malik模型是一種各向異性擴(kuò)散模型,迭代格式十分簡明,算法復(fù)雜度較低.模型如下:設(shè)圖像定義在整個二維平面內(nèi),原始圖像I(x,y,0)=I(x,y)隨時間t演化為圖像I(x,y,t)[5-7],演化規(guī)則為
(1)
式中:c(x,y,t)稱作擴(kuò)散函數(shù),根據(jù)擴(kuò)散函數(shù)的值是否趨近于0來判斷圖像在區(qū)域內(nèi)是否需要平滑操作.
將I(x,y,t)定義為灰度圖像的次迭代結(jié)果,(x,y,0)為初始圖像.迭代形式為
I(x,y,t+1)=I(x,y,t)+
(2)
設(shè)可能的擴(kuò)散函數(shù)c(x,y,t)
(3)
式中:常數(shù)K為擴(kuò)散常數(shù)或者流常數(shù),作為邊緣強(qiáng)度的閾值.一般定義流函數(shù)為
Φ(x,y,t)=g(|I|)·I(x,y,t).
(4)
圖1 中(a),(b)分別表示擴(kuò)散函數(shù)和流函數(shù).
圖1 Perona-Malik模型的函數(shù)圖
圖1(b)中顯示隨著流常數(shù)K的增大,平滑效果越明顯,當(dāng)I=K時,平滑效果最好,當(dāng)I>4K后,平滑效果趨近于零.因此在圖像邊緣增強(qiáng)過程中,選擇K使其略小于邊緣的梯度幅度,有利于邊緣增強(qiáng)[8].隨著迭代次數(shù)的增加,圖像的細(xì)節(jié)逐漸被模糊,只能停止擴(kuò)散來保留圖像原有的細(xì)節(jié)信息[9],限制了該模型在圖像增強(qiáng)領(lǐng)域的應(yīng)用.
為了保留圖像的細(xì)節(jié)信息,同時提升圖像對比度,在Perona-Malik模型中融合銳化操作.改進(jìn)后的模型不僅能夠?qū)Ρ尘皡^(qū)域進(jìn)行平滑操作,也能夠在邊緣區(qū)域進(jìn)行銳化操作,這樣在提升對比度的同時也不會模糊掉圖像的細(xì)節(jié)信息[10].類似傳統(tǒng)的Perona-Malik模型,其迭代形式為
I(x,y,t+1)=I(x,y,t)+
(5)
式中:h(x,y,t)功能上是一個銳化函數(shù),定義
h(i)=ω·[1-g(i)],
(6)
式中:g(i)為擴(kuò)散函數(shù);ω為銳化程度系數(shù),0≤ω≤1.它決定了相應(yīng)擴(kuò)散系數(shù)的銳化程度.將擴(kuò)散函數(shù)g(i)帶入式(6)的c(x,y,t)中,得到
I(x,y,t+1)=I(x,y,t)+
(7)
式中:將g(I)-h(I)作為新的擴(kuò)散函數(shù),根據(jù)式(4)得出新的流函數(shù)
Φ(x,y,t)=
[g(|I|)-h(|I|)]·I(x,y,t).
(8)
圖2(a)所示為不同ω值下的新擴(kuò)散函數(shù).在圖2(b)中取定ω=0.2,當(dāng)I>2.24K,即時,擴(kuò)散函數(shù)和流函數(shù)降為負(fù)值,這里的正負(fù)值表明:對I>2.24K的邊緣區(qū)域進(jìn)行銳化操作,對I<2.24K的非邊緣區(qū)域進(jìn)行平滑操作.因此,選取合適的ω和K值,使改進(jìn)型模型自適應(yīng)地進(jìn)行平滑或銳化操作,從而提升圖像對比度并保留圖像細(xì)節(jié)[11],本文選取=0.15和K=1來計算擴(kuò)散系數(shù).
圖2 改進(jìn)型Perona-Malik模型的函數(shù)圖
采用Xilinx公司出品的Zynq-7000 SoC開發(fā)平臺,芯片型號為XC7Z020.開發(fā)平臺有以下主要資源:ARM雙核Cortex-A9處理器,處理器工作頻率667 MHz,8個DMA通道,其中4個專用于可編程邏輯,PS端(ARM)與PL端(FPGA)通過AXI總線接口相連接,PL端含有85 000個邏輯單元(LE),53 200個查找表(LUT),106 400個觸發(fā)器(FF),60個 36 Kb塊RAM,220個可編程DSP切片[12],開發(fā)板工作電壓為5 V.
通過Verilog HDL硬件描述語言設(shè)計改進(jìn)型Perona-Malik模型,輸入圖像I(x,y,t)通過N次迭代處理后輸出圖像I(x,y,t+N),每次迭代處理都由4部分組成,并且使用流水線處理來達(dá)到提高運(yùn)算速率的目的[13].硬件結(jié)構(gòu)如圖3所示.
首先將輸入圖像經(jīng)過行緩存,當(dāng)緩存的行數(shù)達(dá)到2行,即可與當(dāng)前輸入行的數(shù)據(jù)滿足3行數(shù)據(jù)同時傳輸.當(dāng)3行數(shù)據(jù)滿足3×3的窗口處理模板后,通過窗口模板計算4個方向的梯度.然后將梯度值絕對值|I|傳入?yún)?shù)表中進(jìn)行查表操作得出每個方向的擴(kuò)散系數(shù),最后將輸出圖像和每個方向的值進(jìn)行累加,得到一次迭代處理的結(jié)果.
在行緩存過程中,由于輸入圖像四周的像素不進(jìn)行處理,為保證后續(xù)處理過程的統(tǒng)一性,如圖4所示,通過計數(shù)器來判斷像素位置,并添加1位標(biāo)志位進(jìn)入行緩存中,后續(xù)處理中只需判斷標(biāo)志位來決定是否需要對像素進(jìn)行處理.
圖3 Perona-Malik模型算法硬件結(jié)構(gòu)圖
圖4 行緩存與流水線操作
流水線中參數(shù)表的建立是為了減少迭代過程中的復(fù)雜計算.首先將式(7)中的擴(kuò)散函數(shù)g(I)-h(I)取定ω和K值,計算出擴(kuò)散系數(shù)c.輸入圖像為8 b灰度圖像,梯度絕對值|I|在[0,255]范圍內(nèi).在迭代過程中,各個方向的計算結(jié)果是Si=|I|i×ci.所以參數(shù)表以梯度絕對值|I| 為索引,采用深度為256的ROM來存儲各個方向的計算結(jié)果Si.
計算參數(shù)表時用定點小數(shù)表示浮點小數(shù).用 8 bit 數(shù)據(jù)來表示小數(shù)部分,對于灰度值區(qū)間為[0,255]的8 bit灰度圖來說,誤差只要小于0.5,在灰度值取整過程中就不會出現(xiàn)圖像信息缺失的問題.參數(shù)表實際值域為[-9.56,0.1],參數(shù)表使用8位定點小數(shù)表示后的最小分辨率為0.038,滿足計算精度要求.所以,結(jié)合上文負(fù)數(shù)的補(bǔ)碼表示,對參數(shù)表中數(shù)據(jù)保存格式如圖5所示,有1 bit 符號位+8 bit整數(shù)位+8 bit小數(shù)位,等效于將數(shù)值擴(kuò)大256倍,為保證小數(shù)部分截去的尾數(shù)誤差更小,對結(jié)果加0.5后進(jìn)行取整,則參數(shù)表存儲的值域為[-2 448,26],均采用補(bǔ)碼來表示.
圖5 參數(shù)表數(shù)據(jù)保存格式
除行緩存外,該算法結(jié)構(gòu)對每一幀圖像一次迭代計算只需要經(jīng)過3次加法計算和1次查表操作,避免了乘法以及平方等更加復(fù)雜的計算,計算過程經(jīng)過4個時鐘周期即可完成.
系統(tǒng)采用Zynq平臺實現(xiàn),由Zynq芯片,OV5640攝像頭、DDR3內(nèi)存緩存、VGA/HDMI顯示器構(gòu)成.系統(tǒng)結(jié)構(gòu)框架如圖6所示,分為硬件設(shè)計(PL)和軟件設(shè)計(PS)兩部分,其中硬件部分包括數(shù)據(jù)采集模塊、數(shù)據(jù)處理模塊、數(shù)據(jù)緩存模塊和圖像顯示模塊.軟件部分包括OV5640攝像頭驅(qū)動、數(shù)據(jù)緩存和DMA驅(qū)動控制,軟硬件之間通過AXI接口進(jìn)行通信.
圖6 系統(tǒng)硬件結(jié)構(gòu)圖
PS端最高工作頻率設(shè)置為667 MHz,PL端從數(shù)據(jù)采集模塊到DMA的工作頻率為100 MHz,OV5640和圖像顯示模塊工作頻率為25 MHz.PS端初始化攝像頭采集數(shù)據(jù)為YUV422格式,采集30 fps大小為640×480的圖像,數(shù)據(jù)采集模塊輸出Y分量,即灰度圖像.經(jīng)過Video in AXI-Stream IP核后將有效數(shù)據(jù)傳入數(shù)據(jù)處理模塊[14,15].
數(shù)據(jù)經(jīng)過處理后,通過PS端控制DMA傳入DDR3內(nèi)存中進(jìn)行緩存,類似雙緩沖機(jī)制,緩存3幀圖像來保證系統(tǒng)能夠同時接收和處理數(shù)據(jù).輸出顯示時,VTC視頻時間控制IP核給輸出模塊60 fps的VGA時序,所以在DMA與圖像顯示模塊之間加入了FIFO作為數(shù)據(jù)緩沖,防止數(shù)據(jù)丟失.
將該算法的軟件實現(xiàn)與仿真的硬件加速結(jié)果做對比,選取ω=0.15和K=1.軟件實現(xiàn)在2.5 GHz 的Intel Corei5-4200M CPU上通過VS 2013開發(fā)平臺和OPENCV開發(fā)庫完成.仿真處理在Vivado 2016.4,Modelsim和Matlab聯(lián)合仿真下進(jìn)行處理,為了與實際工程相符,設(shè)置工作頻率為100 MHz.
選取兩張256×256,一張400×292的灰度圖進(jìn)行對照實驗,每張圖像都經(jīng)過8次迭代處理,結(jié)果如圖7所示,其中第1列為選取的原圖,第2列是使用C++語言通過VS 2013開發(fā)平臺和OPENCV開發(fā)庫的處理結(jié)果,第3列是使用Verilog HDL經(jīng)過Vivado 2016.4綜合后,再通過其附帶的Modelsim仿真,產(chǎn)生數(shù)據(jù)文件后通過Matlab顯示的處理結(jié)果.
通過觀察圖像、定量計算圖像信息熵和對比度來評價參數(shù)選取后的處理結(jié)果.圖像信息熵計算公式為
(9)
式中:i表示灰度圖像灰度值,pi表示i在灰度分布中所占比例.圖像信息熵越大表明圖像中的細(xì)節(jié)程度越好[16].對比度計算公式為
C=∑δ(x,y)2·Pδ(x,y),
(10)
式中:δ(x,y)是相鄰像素間的灰度差;Pδ(x,y)是灰度差為δ的像素分布概率.
圖7 中處理結(jié)果的各項參數(shù)如表1所示.通過觀察圖7 和表1 中的結(jié)果可以看出,軟件的處理結(jié)果與綜合后的仿真結(jié)果在圖像質(zhì)量上相差無幾.通過信息熵和對比度來看,其結(jié)果相差不大,參數(shù)提升范圍也在同一數(shù)量級,說明通過Verilog HDL所實現(xiàn)的算法與C++所實現(xiàn)算法處理效果相同.但通過處理時間對比可知,經(jīng)過硬件算法在FPGA上實現(xiàn)的處理速度將會是在計算機(jī)CPU上實現(xiàn)的300倍左右,加速效果明顯.
圖7 VS2013處理結(jié)果和Modelsim仿真處理結(jié)果
表1 處理結(jié)果的各項參數(shù)
將該算法在ZYNQ開發(fā)板上進(jìn)行實現(xiàn),將輸出圖像改為720 p圖像,相應(yīng)的輸出時鐘頻率改為75 MHz,目的是將大小為640×480的原圖與處理結(jié)果圖拼接后進(jìn)行對比,最終結(jié)果如圖8所示.
圖8 中左側(cè)為處理后的顯示圖像,右側(cè)為原圖.圖8(a)為遮擋物體采光后采集的低對比度圖像,比較明顯的是原圖中因光照問題所模糊的投擲垃圾圖案和花型圖案,在處理圖中可以清晰看到其輪廓細(xì)節(jié).圖8(b)為正常采集的圖像,對比度相對較高,圖像細(xì)節(jié)保留完好,根據(jù)處理后的結(jié)果來看,并沒有出現(xiàn)過度銳化的現(xiàn)象,并且圖像對比度也有一定提升,結(jié)果表明算法在該場景下適應(yīng)性較好,所消耗各項資源如表2所示.
圖8 實際場景處理結(jié)果圖
本文在ZYNQ-7000平臺上對一種改進(jìn)型Perona-Malik模型算法進(jìn)行算法加速.通過對照實驗分析結(jié)果,該算法在PL端處理一幀256×256圖像約為0.67 ms,滿足算法處理實時性要求,使用Verilog HDL實現(xiàn)后處理效果與C++實現(xiàn)效果相似,并且在實際工程中處理效果較好,沒有出現(xiàn)過度銳化和噪聲等現(xiàn)象.
下一步的改進(jìn)之處有:
1) 利用片內(nèi)RAM,F(xiàn)IFO等其他內(nèi)部資源解決觸發(fā)器消耗較多的問題;
2) 先將數(shù)據(jù)存儲,再通過DMA讀出后進(jìn)行處理[17],用于解決處理結(jié)果邊緣有毛刺的問題.