陳志杰,凌朝東,魏騰雄
(華僑大學 信息科學與工程學院,福建 廈門361008)
在很多的場合需要高分辨率的大圖像顯示,現在受限于液晶和信號傳輸,單個液晶屏并不能做的非常大,所以現在一般采用多個液晶屏進行拼接來實現大分辨率大圖像的顯示,為了使不同的原始輸入圖像的分辨率能夠在拼接大屏幕上匹配顯示,就必須對輸入的視頻圖像進行縮放以匹配輸出的分辨率,滿足拼接屏幕的要求[1]。這是插值算法在縮放上的一個應用實例,插值算法的應用很廣泛,除視頻圖像縮放,視頻圖像的旋轉也會用到插值算法。
現代的插值算法包括線性和非線性插值、有理插值、曲面重構和自適應區域插值等,但很多算法都由于過于復雜難于在硬件上實現,在硬件上實現常用的插值算法有最鄰近插值算法,雙線性插值算法,雙三次插值算法等[2]。最鄰近插值簡單且直觀,但得到的圖像質量不高。雙線性內插值法計算量大,具有低通濾波器的性質,使高頻分量受損,所以可能會使圖像輪廓在一定程度上變得模糊[3]。雙三次插值法用16個相鄰點做插值,它消除了最鄰近插值的階梯狀邊界問題,解決了雙線性插值模糊的問題能夠克服以上兩種算法的不足,計算精度高,但計算量大[4-7]。本設計采用雙三次插值算法,但為提高計算效率,對雙三次插值計算進行了離散化處理,變實數運算為整數運算[8]。有效克服雙三次插值算法計算量大的問題。提出了實現雙三次卷積模板算法的硬件電路的實現方法,避免三次方的計算,使次算法能夠在沒有顯著增加硬件資源的同時得到令人滿意的圖像縮放效果。
在數值分析中,插值算法可用通式表示為

其中:h(x-xk)為插值基函數,ck為第k 個原函數的值。不同的插值算法只是基函數及選取的插值點個數n不同。如果基函數的最高次冪為三次且在定義域內基函數的一階、二階導數連續,則稱該算法為三次插值算法,若在二維方向上應用該算法即雙三次插值算法。
系統采用Keys提出的三次插值基函數,雙三次插值算法基函數是利用三次多項式h(ω)來逼近理論上最佳插值函數sin(π×ω)/(π×ω),其基函數h(ω)的表達式如下:

圖像為二維信號,所以,圖像縮放的插值算法要在二維方向應用上述算法。先在水平方向,假設所求插值像素點為F,首先,每一行依據上述插值原理,得到4 個臨時插值像素點的像素值F0,F1,F2,F3。

其中:Fk+4i為輸入圖像鄰近16個點的像素值,兩像素點的距離為單位1。然后,以Fi為原函數,在垂直方向依據同樣的原理求得所需插值點F 的值,即

由上述可知計算時需要h(Δx)和h(Δy)這兩個值,如果Δx 和Δy 直接代入基函數進行計算,需要大量的乘法和浮點運算,會占用大量的系統資源,這里采用將h 的值離散化,模板化進行計算。計算每一目標像素灰度值,需要計算出目標像素點和源像素點的水平、垂直距離,然后根據距離帶入公式算出相應的加權系數。
將水平距離和垂直距離Δx,Δy 平均分割為4份,Δx,Δy 都在[0,1]的范圍內,分為[0,1/4],[1/4,1/2],[1/2,3/4],[3/4,1],如果Δx,Δy 的值落入到這4個范圍中的一個,將Δx,Δy 都取這個范圍內的平均值,即如果在[0,1/4]則取1/8,如果在[1/4,1/2]則取3/8,如果在[1/2,3/4]則取5/8,如果在[3/4,1]則取7/8。
在進行水平方向的卷積時需要用到

這個為加權系數,計算一個點的時候需要4個像素的點和這個加權系數進行卷積。按上面的范圍進行計算加權系數,得到水平方向加權系數的4個目標(每個數左移18位,用移位計算在硬件里方便實現):

同理垂直方向

FPGA 采用的是Lattice的ECP3 系列的芯片,其框圖如圖1所示。

圖1 FPGA 實現的原理圖Fig.1 Block diagram of FPGA implementation
如圖1所示,數據進入到FPGA 后進行水平方向的插值計算,水平方向計算完,由于計算垂直插值時需要用到圖像相鄰的4行數據,所以將水平方向插值計算結果的數據送入外部的存儲器進行存儲,然后從外部存儲器中讀出數據進行垂直方向的插值。
根據上面的分析,行卷積的實現為取相鄰的4個像素點與相應的模板進行卷積計算得到結果。所以行卷積的計算就是如何取得相鄰的4個像素點和如何取得相應的模板。在一行上4個相鄰的像素點需要同時取得,這樣才能提高計算速度,為了同時得到4個相鄰的像素點,輸入緩存用4個雙口RAM,在視頻圖像進入FPGA 時,將一行的數據同時寫入4個RAM 中,同時讀取時4個RAM取相鄰地址的數據,就得到了一行中4個相鄰的像素點。而相應的模板需要根據縮放的比例來進行計算得到。圖2為行卷積實現的框圖。
需要根據縮放比例計算出目標像素點對應到源像素點的位置,這個用scale factor 模塊來實現,知道目標像素點對應到源像素點的位置就能得出需要的模板。縮放比例用一個16.16的定點小數來實現,高16位表示整數部分,低16位表示小數部分。計算時采用累加來實現,每一次都加上縮放比例,這樣就能得到相鄰的4個像素點和相應的模板。其modelsim 的仿真結果如圖3所示,仿真時采用放大1.6 倍時一行圖像數據的情況。

圖2 行卷積實現原理圖Fig.2 Block diagram of line convolution implementation

圖3 scale_factor的仿真波形Fig.3 Waveform of scale_factor simulation
其中line為目標圖像對應到源圖像的整數部分的值,x_distance為對應到源圖像的小數的值,這樣根據整數部分可以得到相鄰的4個像素點,根據距離可以得到相應的模板。其中x_distance小數部分為左移16 位的結果。根據上面的計算可以得到卷積的像素點和模板,然后將得到的數據送入乘加器就能得到行卷積的計算結果。乘加器用Lattice芯片上的硬件乘加器進行實現,硬件乘加器的速度能夠滿足要求。
對行卷積整體仿真時,利用matlab采集一整幅圖片的像素點,將圖片的像素點轉化成RGB的格式,用十六進制存在文本中,然后利用modelsim 對文本的讀寫功能,產生一個模擬的VGA時序視頻信號,信號包括時鐘信號、行同步信號、場同步信號、數據使能信號和數據信號。將這幾個信號在testbeach中生成,給行卷積的模塊,將行卷積的計算結果通過modelsim 對文本的操作寫入到文本當中,將得到的仿真文本的數據和matlab仿真數據進行比對,做到兩個仿真結果的數據是一樣的,說明硬件描述語言對算法的行卷積能夠實現。
系統支持1 080p高清視頻,1 080p視頻的分辨率為1 920×1 080,如果當視頻的幀率為60 Hz時,RGB每位采用8bit,這樣一幀圖像的大小為1 920×1 080×24bit約為2M×24bit,進行處理時為了提高計算效率采用乒乓操作,所以一幀需要的存儲為4M×24bit,所以采用一片512M 的,數據寬度為16bit的DDR3 就能滿足圖像緩存的需要。DDR3的寫入速度非常快,比視頻的像素流快,所以,我們不可能來一個像素寫入一個值,這樣操作繁瑣,這就有必要在前面做一個像素的緩存器,如果視頻圖像的一行像素數據存入到緩存中時,將緩存中的數據一起寫入到DDR3。
DDR3控制器利用現有的IP 核來實現。其實現框圖如圖4所示。

圖4 DDR3控制器實現框圖Fig.4 Block diagram of DDR3controller
主要包括4個FIFO,4個FIFO 分別為發生請求讀寫DDR 時,將請求讀寫ddr的地址放入fifo中。ddr_init模塊主要是負責ddr的初始化,ddr_ctrl_state主要負責處理DDR 進行讀寫的狀態控 制,ddr3_sdram_mem_top 是Latticed 的DDR3的IP核。
其中ddr_ctrl_state的內部是設計一個狀態機,來實現ddr的讀寫控制狀態,其狀態轉移圖如圖5所示。
以下是各個狀態所表示的含義:
上電相關狀態:
S_POWER_UP表示上電開始狀態。

圖5 DDR 的狀態轉移圖Fig.5 State diagram of DDR ctroller
S_CHIP_CONFIG 表示芯片配置狀態。
S_CONIG_END 表示等待芯片配置完成狀態。
S_IDLE表示系統空閑等待狀態。
讀DDR 相關狀態:
S_RD_RQ0表示讀DDR,讀取FIFO 得到位置數據。
S_RD_RQ1表示讀DDR,讀取FIFO 得到位置數據。
S_RD_RQ2表示讀DDR,讀取FIFO 得到位置數據。
S_RD_RQ3表示讀DDR,讀取FIFO 得到位置數據。
S_WAIT_RD_RQ 表示需要幾個時鐘(m2~m4),從FIFO 中讀出位置參數。
S_DDR_RD_CMD 表示位置參數準備好,對DDR IP寫入讀命令和相應地址。
S_WAIT_RD_END 表示等待DDR 將數據讀完。
寫DDR 相關狀態:
S_WR_RQ0表示寫1端口數據狀態。
S_WR_RQ1表示寫2端口數據狀態。
S_WR_RQ2表示寫3端口數據狀態。
S_WAIT_WR_RQ 表示需要幾個時鐘(m2~m4),從FIFO 中讀出位置參數。
S_DDR_WR_CMD 表示位置參數準備好,對DDR IP寫入讀命令和相應地。
S_WAIR_WR_END 表示等待DDR 將數據寫完。
列卷積的計算方法和行卷積的計算方法相同,其實現框圖如圖6所示。只是列卷積時需要得到相鄰四列的像素值,這個可以通過每次從DDR3中讀出相鄰的四列放入4 個RAM 中,這樣從每一個RAM 中可以得到相鄰四列的4個像素值。
其中DDR 數據讀取控制模塊主要是根據圖像插值算法的需要從DDR 中讀出相鄰的4 行,分別放入到4 個RAM 中,然后通過控制RAM的地址來讀取列相鄰的4 個像素點。同時系數讀取控制器也根據需要讀出相應的列插。

圖6 列卷積實現框圖Fig.6 Block diagram of column convolution implementation
此算法是在Lattice ECP3-17EA 來實現的,圖7為實現此算法的資源的情況,從圖片中可以看出這個算法占用的資源不是很多,所以在此FPGA 芯片上實現此算法還是可行的。
做試驗時,先用matlab 將算法用軟件來實現,將仿真得到的結果保存。通過硬件描述語言實現后,用modelsim 仿真,同樣利用modelsim的讀寫功能,對一張圖片進行仿真,結果保存在文件里,將matlab得到的結果和modelsim 得到的仿真結果進行比較,可以發現兩個結果是完全一樣的。說明用硬件語言實現了該算法。

圖7 FPGA 資源的使用情況Fig.7 Use of FPGA resources
將雙三次插值算法改成模板方法實現,省去了很多的浮點計算,使其在硬件上耗費更少的資源。將圖像看成二維的,先計算水平的插值,再算垂直的插值,這樣在硬件上也可以減少資源,水平和垂直同時計算,一次要取臨近的16個點,然后進行16個乘加運算,而先水平后垂直,一次只需取4個點,需要4個乘加運算,相當于需要兩次的4個乘加運算。這樣可以減少乘加器的數量。
雙三次插值算法能夠得到令人滿意的圖像縮放效果,但因其算法復雜,硬件上實現很少應用,而本文通過分析雙三次插值的基本原理,提出了將圖像分為二維來進行計算,先水平后垂直實現雙三次插值算法的硬件實現思路。同時將計算過程離散化,化浮點計算為整數計算,避免了三次方的計算。通過實驗可以發現,利用FPGA 實現雙三次卷積模板算法可以比實現雙三次插值算法節約硬件資源。同時可以得到不錯的圖像效果,適合工程的應用。
[1] Xiang Z Q,Zou X C,Liu Z L.An high quality image scaling engine for large-scale LCD[C].ICSP2006 Proceedings,Wuhan,China:ICSP,2006.
[2] 王增發,孫麗娜.CFA 圖像實時插值在FPGA 上的應用[J].液晶與顯示,2013,28(4):615-619.Wang Z F,Sun L N.Application of CFA images interpolation algorithm in FPGA real-time system [J].Chinese Journal of Liquid Crystals and Displays,2013,28(4):615-619.(in Chinese)
[3] 孫紅進.FPGA 實現的視頻圖像縮放顯示[J].液晶與顯示,2010,25(1):130-133.Sun H J.FPGA realization of video lmage zooming display[J].Chinese Journal of Liquid Crystals and Displays,2010,25(1):130-133.(in Chinese)
[4] 張阿珍,劉政林,鄒雪城,等.基于雙三次插值算法的圖像縮放引擎的設計[J].微電子學與計算機,2007,24(1):49-51.ZHANG A Z,LIU Z L,ZOU X C,et al Design of image scaling engine based bicubic interpolation algorithm[J].Microelectronics &Computer,2007,24(1):49-51.(in Chinese)
[5] 王會鵬,周利莉,張杰.一種基于區域的雙三次圖像插值算法[J].計算機工程,2010,36(19):216-218.Wang H P,Zhou L L,Zhang J.Region-based bicubic image interpolation algorithm [J].Computer Engineering,2010,36(19):216-218.(in Chinese)
[6] Li Y H,Zhen J,Li J H,et al.The hardware realization of the bicubic interpolation enlargement algorithm based on FPGA[C]//Third International Symposium on Information Processing,Qingdao,China:ISIP,2010:277-281.
[7] Nuno-Maganda M A,Arias-Estrad M O.Real-time FPGA-based architecture for bicubic interpolation:An application for digital image scaling[C]//Proceedings of the 2005 International Conference on Reconfigurable Computing and FPGAs,Puebla City,Mexico:Computer Society,2005:31-42.
[8] 高成敏,陳良,林永和.雙三次卷積模板算法[J].計算機工程與應用,2009,45(17):151-154.Gao C M,Chen L,Lin Y H.Bicubic convolution template algorithm[J].Computer Engineering and Applications,2009,45(17):151-154.(in Chinese)
[9] 樊博,王延杰,孫宏.FPGA 實現高速實時多端口圖像處理系統的研究[J].液晶與顯示,2013,28(4):620-625.Fan B,Wang Y J,Sun H.High speed real-time multiport image algorithm in FPGA real-time system[J].Chinese Journal of Liquid Crystals and Displays,2013,28(4):620-625.(in Chinese)