吳長坤,張 為,郝亞喆
(天津大學 微電子學院,天津 300072)
隨著光電傳感器技術的飛速發展,圖像探測器獲得的圖像分辨率越來越高,原始圖像由8位灰度圖提升為如今的16位灰度圖,圖像信息雖然變得更加精細,但是每幅圖像的數據量也急劇增加[1]。海量的圖像數據給存儲系統帶來巨大壓力,同時有限的傳輸帶寬使得數據實時回傳變得更加困難。圖像壓縮是一種有效減少數據量以便更快處理數據的技術[2],因此對圖像做實時高質量壓縮處理可以有效解決上述問題。
圖像壓縮的方法有很多,但總體上可以分為有損壓縮和無損壓縮兩種[3]。無損壓縮要求圖像還原后信息不能有任何的丟失,但往往圖像壓縮比較小;有損壓縮在滿足實際應用場景要求的前提下允許圖像有一定程度的信息丟失,因此壓縮比較高。對于旨在減少數據量的應用來說,高質量的有損壓縮無疑是更好的選擇。
針對圖像的有損壓縮,國內外眾多學者進行了大量研究。文獻[4-5]在現場可編程門陣列板卡上完成了JEPG算法的硬件實現,文獻[4]使用標準測試圖在26倍的壓縮比下得出的峰值信噪比僅為28.89 dB,圖像壓縮質量較差。文獻[6-7]都基于現場可編程門陣列實現了JPEG XR壓縮算法,但是吞吐率較低,遠遠不能滿足海量數據的實時壓縮處理。ADV212是一款專門用于圖像壓縮的單芯片JPEG2000編解碼器[8],該芯片支持有損壓縮和無損壓縮,有損壓縮吞吐率最高為65 MB/s,但不易于擴展,難以滿足特定的功能需求。為了提高圖像壓縮吞吐率,文獻[9]基于JPEG2000算法,提出了一種在GPU上運行的端到端高吞吐率圖像壓縮編碼器架構,但是該架構體積大功耗高,通常安裝在嵌入式設備中,應用場景較為局限。文獻[10-11]在現場可編程門陣列上實現了JPEG2000算法的高吞吐率設計,其中文獻[10]吞吐率提升到了120 MB/s。通過查閱和對比國內外相關文獻,目前對JPEG2000算法的研究大都是對其各組成模塊進行優化,例如文獻[12-15]針對離散小波變換(Discrete Wavelet Transform,DWT)進行了優化,提高了模塊的處理速度、減少了內部存儲器的使用。文獻[16-19]針對位平面編碼(Bit Plane Coding,BPC)以及MQ算術編碼進行了優化,雖然模塊的處理效率得到了改善,但是整體編碼速度還有待提高。
為滿足海量數據的壓縮處理需求,參考現有架構,筆者設計了一種可以兼容處理8位到16位灰度圖的高吞吐率圖像壓縮編碼器,編碼器采用并-串-并架構進行設計,可并行處理兩個8位灰度圖像。針對16位灰度圖像,將圖像分割成兩幅8位灰度圖并行處理,解決了16位灰度圖像的壓縮問題;針對大于8位小于16位的灰度圖像,編碼器對數據高位做補零操作,將像素寬度拓寬到16位處理。同時架構采用優先編碼器控制并行模塊工作,有效減少了并行處理等待時間,大大提升了硬件處理效率。筆者所設計壓縮編碼器在Xilinx XC7K480T芯片上進行驗證,數據源采用1 024×1 024×16 bit大小的標準測試圖,最終測得編碼器吞吐率最高可達266.87 MB/s。
JPEG2000是一種基于小波變換的靜止圖像壓縮標準,于2001年正式發布。JPEG2000既支持有損壓縮又支持無損壓縮,與傳統的JPEG壓縮算法相比,壓縮性能提高20%以上,且在壓縮比很大的情況下,仍然有很好的壓縮效果。JPEG2000編碼器硬件架構如圖1所示,大致分為圖像預處理、離散小波變換、量化、最佳截斷嵌入碼塊編碼 (Embedded Block Coding with Optimized Truncation,EBCOT)等幾部分[20]。
圖像預處理包含圖像分塊、直流電平位移以及分量變換3部分,其中最重要的就是圖像分塊。在JPEG算法中,圖像需要被分割成8×8大小的切片來處理;JPEG2000算法雖然沒有規定是否分塊,但是為了降低內存消耗以及方便后續編碼處理,一般也會把圖像分割成若干個小的矩形塊,各個矩陣塊之間相互獨立,這也是本次架構設計的關鍵。此外由于矩陣塊之間存在邊界效應,會直接影響圖像的重構質量,因此對圖像進行合理分塊處理意義重大。直流電平位移的作用是去除信號中的直流分量,同時把無符號數據變換成有符號數據,用于后續處理;分量變換是將傳統的RGB色域轉換到其他的色彩空間,對于灰度圖來說,這一步可以省略。
離散小波變換是將圖像的有效信息集中到低頻子帶,子帶一般具有統計特性,在進行編碼時會有更高的編碼效率,更加利于后續的EBCOT處理;量化是將離散小波變換處理后的小波系數進行處理,把系數控制在較高的范圍之內,有助于提高整體壓縮質量;EBCOT是編碼器中最主要的部分,分為Tier1編碼和Tier2編碼。Tier1編碼又分為位平面編碼和算術編碼,Tier1編碼的作用是將量化后的子帶信息劃分成獨立的編碼塊,之后對每個編碼塊進行獨立的嵌入式編碼掃描,再將掃描的結果繼續做基于上下文的算術編碼,然后得到嵌入式碼流;Tier2編碼根據設計壓縮比,先對碼流進行截斷,然后做打包處理,最終得到符合JPEG2000壓縮標準的碼流數據。
傳統壓縮編碼器各模塊之間是串行工作模式,前后級有嚴格的使能控制邏輯。在處理典型圖像時,EBCOT模塊通常是整個編碼器中消耗時間最長的模塊,消耗時間大約占整體編碼消耗時間的80%以上[9],同時在EBCOT模塊工作過程中,其他模塊均處于等待狀態,大大降低了編碼器的工作效率。在處理高分辨率、高幀率圖像時,如果是簡單對整體架構做并行操作來提升編碼速度,效率只會進一步降低。通過對典型16位灰度圖像的分析,筆者提出了一種兼容處理8位~16位灰度圖像的壓縮編碼器硬件架構,如圖2所示。
處理16位灰度圖時,預處理完成后把圖像分成高8位和低8位兩幅圖像獨立并行處理,根據EBCOT模塊處理時間與DWT模塊處理時間的差異,高低位處理均采用DWT串行、EBCOT并行的架構進行處理。由于高低位數據包含的數據信息不同,因此高低位處理時EBCOT模塊的并行度也不同,高位并行度為m,低位并行度為n。一般情況下m要比n小得多,具體數值由DWT處理效率以及圖像矩形塊的平均復雜度決定。
合理控制多路并行模塊的工作順序,可以有效提高整體架構的工作效率。當并行度較小時,采用多路選擇器控制效率較高;當并行度較大時,多路選擇器設計會變得比較復雜,而采用順序執行方式雖然會降低復雜度,但也會增加未知的等待時間,從而降低編碼效率。綜合上述分析,當并行度較高時,采用優先編碼器對并行模塊進行控制。表1是以并行度為10為例的優先編碼器真值表。圖3為優先編碼器結構圖。表1中1~10代表10路并行模塊。當該路模塊空閑時,對應數字為1。本次設計的優先編碼器以編號小的編碼器優先,即當有多路EBCOT模塊空閑時,編號小的模塊優先工作。由于圖像是按照矩形塊的形式處理,因此編碼結束后需要對碼流按順序重新組織,組織完成后按高位和低位的順序依次輸出,完成整個壓縮過程。同時為進一步加快編碼器處理效率,高位處理和低位處理的EBCOT模塊可以相互調用,當圖像的低位/高位處理完成后,空閑的低位/高位EBCOT模塊可以繼續對高位/低位圖像進行編碼處理,輸出后的碼流緩存到高位/低位處理的存儲器中即可。

表1 優先編碼器真值表(并行度為10)
壓縮編碼器最終在Xilinx XC7K480T芯片上進行設計,表2給出了不同并行度下編碼器硬件資源消耗。

表2 不同并行度編碼器硬件資源消耗
為了測試壓縮編碼器性能,選取了4幀典型樣例圖來進行測試,樣例圖如圖4所示。
測試圖像大小均為1 024×1 024×16 bit,圖中顯示的是對16位原始灰度圖像做量化處理后的8位灰度圖像。通過對典型樣例圖進行處理得出,當m=11時,高位圖像達到最快處理速度;當n=12時,低位圖像達到最快處理速度。對于高位圖像來說,當并行度超過4時,一路EBCOT模塊硬件開銷增加的比例,遠高于架構處理速度提升的比例。綜合分析得出當m=4、n=11時,16位灰度圖像的壓縮性能與資源消耗最優。
表3給出了在壓縮比為5∶1和50∶1情況下,編碼器壓縮高位圖像以及低位圖像所消耗的時鐘周期數,根據圖像大小以及工作時鐘頻率,計算出編碼器的吞吐率。從表中可以看出,同一幅圖像在不同壓縮比下的吞吐率基本相同。

表3 典型樣例圖壓縮性能(8 bit圖像)
壓縮完成后使用jasper軟件將得到的圖像碼流數據進行圖像重構,最后利用MATLAB軟件計算原始圖像與重構后圖像的峰值信噪比(PSNR)。峰值信噪比的計算公式如下:
(1)
(2)
其中,EMSE代表原始圖像與重構后圖像之間的均方誤差,m和n分別代表圖像的長和寬,I(i,j)和K(i,j)分別代表重構后圖像和原始圖像。IMAX代表圖像中像素點的最大值,對于8位灰度圖來說,最大值為255。通過表3中結果可以看出,在5∶1的壓縮比條件下,典型樣例圖的高位子圖峰值信噪比在66 dB以上,低位子圖峰值信噪比在41 dB以上;在50∶1的壓縮比條件下,典型樣例圖的高位子圖峰值信噪比在47 dB以上,低位子圖峰值信噪比在32 dB以上。為進一步驗證壓縮質量,將重構后的高低位圖像重新整合成16位灰度圖像,計算與原始16位灰度圖像的峰值信噪比。對于16位灰度圖來說,式(2)中的IMAX最大值為65 535,計算結果如表4所示。通過表中結果可以看出,在5∶1的壓縮比條件下,16位典型樣例圖的峰值信噪比在56 dB以上;在50∶1的壓縮比條件下,16位典型樣例圖的峰值信噪比在35 dB以上。

表4 典型樣例圖高低位整合后PSNR值(16 bit圖像)dB
為了更直觀地對比原始圖像與重構后圖像的像素差異,使用MATLAB軟件將兩幅圖像各點像素差值進行分析。表5結果表明,在5∶1壓縮比條件下,4幅典型樣例圖高位子圖平均99.22%的像素與原圖像數值一致,所有像素數值差異不超過5;低位子圖平均64.13%的像素與原圖像數值一致,97.77%的像素數值差異不超過5。在50∶1壓縮比條件下,高位子圖平均97.70%的像素與原圖像數值一致,99.18%的像素數值差異不超過5;低位子圖平均53.86%的像素與原圖像數值一致,74.31%的像素數值差異不超過5。

表5 原始圖像與重構后圖像對應像素差值%
JPEG、JPEG XR以及JPEG2000是目前常用的幾種壓縮算法,表6給出了基于上述3種壓縮算法設計的編碼器與筆者所設計編碼器的性能對比。

表6 多種壓縮編碼器性能對比
文獻[6]和文獻[21]對這3種壓縮算法的壓縮質量進行了研究。結果表明,對同一圖像做壓縮時,JPEG XR算法與JPEG2000算法的壓縮質量大致相同,均好于JPEG壓縮算法。基于Xilinx XC7K480T芯片設計的編碼器與文獻[5]相比,相似時鐘頻率下,吞吐率提高了72%以上;與文獻[6]相比,最大時鐘頻率提高了47%以上,吞吐率提高了4倍;與文獻[10]相比,筆者設計的編碼器并行度為12的架構LUT使用減少了4%,BRAM使用減少約27%,吞吐率提高了40%以上;與文獻[11]相比,最大時鐘頻率提高2.7倍的情況下,吞吐率提高了10.4倍以上。
為避免不同工藝、不同器件對架構效率產生影響,采用文獻[15]中的EPI(Energy Per Image)參數比較編碼器的硬件效率。EEPI表示處理一幅圖像所需要的能耗,計算公式為
EEPI=PPowerTCT,
(3)
其中,PPower代表編碼器整體功耗,TCT代表一幅圖像的處理時間,EEPI數值越小代表架構性能越好。表6給出了處理一幅1 024×1 024圖像各架構的EEPI值,以8位灰度圖像為例,與文獻[5]相比,EEPI提升了14%以上;文獻[11]所提架構EEPI數值與壓縮比有關,與其均值相比,性能提高65%以上。
基于JPEG2000算法,筆者提出了一種兼容處理8位~16位灰度圖像的高吞吐率壓縮編碼器,通過各模塊間的并-串-并連接設計,使用優先編碼器對并行模塊進行控制,最終實現了圖像的高倍率、高質量快速壓縮,有效緩解了海量數據對于傳輸帶寬和數據存儲的壓力;同時編碼器支持多種分辨率圖像處理,可根據實際需求靈活調整并行模塊并行度。對比已有壓縮編碼器,吞吐率至少提高了40%以上,有著重要的實用價值。