龔楠 張津榮 趙東升
摘要 QUIc是一種預(yù)測編碼算法。它在只可以壓縮灰度圖像的SFALIC算法的基礎(chǔ)上,增加了RLE編碼,從而可以壓縮彩色圖像。采用FPGA硬件實(shí)現(xiàn)該算法不僅可以實(shí)時(shí)壓縮各種彩色圖像,而且可以將其部署到需要無損圖像壓縮的實(shí)時(shí)終端系統(tǒng)中。本文通過研究QUIc算法的原理及關(guān)鍵技術(shù),提出了一種基于FPGA硬件實(shí)現(xiàn)QUIc無損圖像壓縮算法的設(shè)計(jì)方案,并通過實(shí)驗(yàn)對(duì)其有效性進(jìn)行了對(duì)比分析和驗(yàn)證。
【關(guān)鍵詞】QUIc 無損壓縮 FPGA
1 引言
當(dāng)今的社會(huì)是一個(gè)互聯(lián)網(wǎng)高度發(fā)達(dá)的時(shí)代,人們獲取的信息有很大一部分來自于網(wǎng)絡(luò),其中圖像信息占了絕大部分。網(wǎng)絡(luò)中的圖片傳輸不僅耗費(fèi)了大量的帶寬資源,而且占據(jù)了大量的存儲(chǔ)空間。因此,如何在保證圖片視覺不失真前提下縮小體積,對(duì)于節(jié)省帶寬和能耗十分重要。QUIC作為一種高速、高壓縮比、自適應(yīng)的無損圖像壓縮算法,非常適合在實(shí)時(shí)性要求較高的領(lǐng)域應(yīng)用。本文研究了QUIC無損圖像壓縮算法的原理及其關(guān)鍵技術(shù),提出了基于FPGA實(shí)現(xiàn)QUIC無損壓縮算法的設(shè)計(jì)方案。
2 QUIC算法原理及關(guān)鍵技術(shù)
算法整體原理框圖如圖1所示,當(dāng)圖像被處理成光柵掃描序列后形成圖像數(shù)據(jù)流后,圖像數(shù)據(jù)流被分割成位圖數(shù)據(jù)與文件頭數(shù)據(jù)。文件頭數(shù)據(jù)用于優(yōu)化并選取參數(shù)k,位圖數(shù)據(jù)進(jìn)入Golomb-Rice編碼模塊進(jìn)行包括預(yù)測、映射、編碼等處理。同時(shí)當(dāng)位圖數(shù)據(jù)流滿足RLE編碼條件時(shí)進(jìn)入游長模式進(jìn)行編碼。在完成Golomb-Rice和RLE編碼后,按順序進(jìn)行QUIc碼流輸出。此外,為了提高壓縮速度,算法采用了基于FELICS算法的簡單的上下文模型,并使用了逐級(jí)降低模型更新頻率的方法。
2.1 像素值預(yù)測
在QUIC算法中,對(duì)于指定的像素X,預(yù)測器所采取的的方案是利用其周圍三個(gè)像素值:左相鄰像素(A),上相鄰像素(B),左上相鄰像素(C)。算法預(yù)測器Predl-7如表1所示,預(yù)測器Pred8如公式1所示:
2.2 Golomb-Rice編碼
算法所采用的編碼方案基于Golomb-Rice編碼系列。對(duì)于一個(gè)呈指數(shù)概率分布的無限字母表來說,GR編碼是一種最優(yōu)編碼,每個(gè)編碼都是以一個(gè)級(jí)數(shù)k的非負(fù)整數(shù)為特征。對(duì)于一個(gè)特定的級(jí)數(shù)k,非負(fù)整數(shù)i的編碼首先以
[i/2 k]
(5)
計(jì)算前綴碼,而后以
imod2k
(6)
計(jì)算后綴碼,其中后綴碼的二進(jìn)制長度為kbits。
編碼方案的采用極大地簡化了壓縮算法。對(duì)一個(gè)指定的殘差符號(hào)進(jìn)行編碼,首先基于存儲(chǔ)在模型中的信息選定一個(gè)級(jí)數(shù)k,然后根據(jù)k級(jí)數(shù)輸出一個(gè)對(duì)應(yīng)該殘差符號(hào)的碼字。
2.3 模型頻率更新
幾乎所有的典型圖像的特征是緩慢變化的,有的是幾乎不變的。由此,模型引入了降低更新頻率的方法。為了適應(yīng)緩慢的變化,模型需要對(duì)圖像進(jìn)行采樣,即更新數(shù)據(jù)模型,像素被編碼的頻率逐漸降低。如果在恒定的周期更新模型可能會(huì)干擾圖像結(jié)構(gòu)。因此,每次在更新模型后,隨機(jī)選擇若干符號(hào)進(jìn)行壓縮后再進(jìn)行下一次更新模型。為了解碼器能夠選擇同編碼器同樣的隨機(jī)值,算法選擇了偽隨機(jī)數(shù)發(fā)生器。
在具體實(shí)現(xiàn)中,將每2048個(gè)像素分為一大段,每大段對(duì)應(yīng)一個(gè)索引(wmidx),每個(gè)索引對(duì)應(yīng)不同的閩值(trigger)。每一大段里,分成若干小段,小段的長度通過隨機(jī)數(shù)發(fā)生器計(jì)算。每壓縮完一小段,用這一小段的最后一個(gè)像素(stopidx)來更新模)。
這種方法可以確保在提高壓縮速度的同時(shí)具有較好的壓縮比,本文所述算法與FELICS算法相比,該模型更新頻率遞減的方法可以將壓縮速度提高約250%,其代價(jià)僅僅是壓縮比降低了1%。
3 QUIC壓縮算法的FPGA設(shè)計(jì)方法
本文的設(shè)計(jì)采用四級(jí)流水線結(jié)構(gòu),系統(tǒng)只有一個(gè)主時(shí)鐘CLK作為工作時(shí)鐘,實(shí)現(xiàn)了包括串轉(zhuǎn)并單元、圖像上下文模型選取單元、映射單元、熵編碼器單元、系統(tǒng)控制單元等5個(gè)單元。串轉(zhuǎn)并單元負(fù)責(zé)從位圖數(shù)據(jù)中讀取一個(gè)像素的RGB輸出;上下文模型選取單元根據(jù)上下文模型產(chǎn)生預(yù)測值;映射單元負(fù)責(zé)將預(yù)測殘值映射后輸入熵編碼器單元;熵編碼器單元負(fù)責(zé)將映射碼流進(jìn)行游長模式編碼或者Golomb-Rice編碼;控制單元負(fù)責(zé)控制個(gè)單元的信號(hào)以及協(xié)調(diào)各模塊的工作先后順序。
3.1 游長模式設(shè)計(jì)
游長模式條件判斷模塊包括兩部分:預(yù)測值預(yù)備模塊和預(yù)測值比較模塊。預(yù)測值預(yù)備模塊獲得A、B、C、D的預(yù)測值。當(dāng)B的預(yù)測值B和C的預(yù)測的值C'相等,A的預(yù)測值A(chǔ)'和D的預(yù)測值D相等,且列數(shù)大于2時(shí),滿足游長模式的判斷條件,進(jìn)入游長編碼模式。
進(jìn)入該模塊后,首先要定義兩個(gè)數(shù)組輔助參量并將其存儲(chǔ)在rom中。這兩個(gè)輔助參量用于對(duì)游長編碼值進(jìn)行區(qū)段切分與余數(shù)編碼兩部分的索引第一個(gè)輔助參量J[i]值為{o,O,O,O,1,1,1,1,2,2,2,2,3,3,3,3,4,4,5,5,6,6,7,7;8,9,10,11,12,13,14,15};第二個(gè)輔助參量melcoder[i]值為2^J[i]。
當(dāng)進(jìn)入游長模式后,通過狀態(tài)機(jī)進(jìn)行編碼游長值,如下給出了狀態(tài)機(jī)的主要狀態(tài):
(1)計(jì)算游長值得參數(shù)段數(shù)hits (Sl);
(2)計(jì)算余下長度leftlen (S2);
(3)編碼hits (S3);
(4)編碼leftlen (S4);
(5)合并hits與leftlen編碼(S5)
如上,當(dāng)該模塊獲取到游長值后,進(jìn)入Sl狀態(tài),Sl狀態(tài)計(jì)算與melcoder是對(duì)應(yīng)的;Sl狀態(tài)完成后進(jìn)入S2狀態(tài)計(jì)算余下游長值;S3狀態(tài)將hits值右移5位截取高位,截取低5位,二者拼接成hits的編碼;S4狀態(tài)將leftlen轉(zhuǎn)為固定長度的二進(jìn)制,長度由hits是否大于32所確定,如果大于32固定長度就為hits+l,否則為32;最后S5狀態(tài)將S3和S4的編碼值合并輸出。
3.2 頻率更新模塊設(shè)計(jì)
觸發(fā)更新模塊的主要作用是選取觸發(fā)更新的值,首先根據(jù)像素計(jì)數(shù)單元計(jì)算像素值的個(gè)數(shù)是否滿足2048,每當(dāng)計(jì)數(shù)滿足2048時(shí),wmidx遞增1,直到wmidx為6時(shí)不再遞增.不同的wmidx會(huì)從預(yù)設(shè)的參數(shù)更新值中進(jìn)行索引。其次將參數(shù)值以paramerer的形式記錄一些隨機(jī)值,這些隨機(jī)值用以標(biāo)注每個(gè)wmidx所對(duì)應(yīng)的不同區(qū)間長度。
當(dāng)輸入編碼更新信號(hào)使能時(shí),像素計(jì)數(shù)重置為O,同時(shí)模塊根據(jù)wmidx以及不同區(qū)間長度值選擇stopidx的值,而當(dāng)像素計(jì)數(shù)單元等于stopidx的值時(shí),觸發(fā)k值更新使能,使得trigger_value輸出值有效。
3.3 像素編碼模塊設(shè)計(jì)
像素編碼模塊是整個(gè)編碼流程的最后一環(huán),也是最終QUIC碼流輸出所在的模塊,該模塊由以下幾個(gè)單元所組成預(yù)測值輸入單元、k值選取單元、GR和非GR判斷單元、GR和非GR解碼單元、k值更新單元、RGB合并單元。
其中,預(yù)測值輸入單元負(fù)責(zé)將上游模塊的預(yù)測值讀入本模塊,進(jìn)而由GR和非GR判斷模塊將預(yù)測值送入GR或者非GR編碼單元,這兩個(gè)單元所用編碼k值由k值選取單元選取,編碼完成后由k值更新單元更新k值,最后三個(gè)通道的編碼進(jìn)行合并輸出。
4 QUIC算法壓縮核驗(yàn)證與對(duì)比分析
4.1 QUIC算法壓縮核驗(yàn)證
當(dāng)完成各子模塊編寫并驗(yàn)證無誤時(shí),可利用二進(jìn)制文件處理軟件UltraEdit對(duì)PC機(jī)收到的壓縮后碼流和編寫的算法C程序輸出標(biāo)準(zhǔn)碼流進(jìn)行對(duì)比,分析數(shù)據(jù)差異后定位出問題的模塊并進(jìn)行代碼修改。最后重復(fù)仿真并綜合下到板子上調(diào)試。
4.2 對(duì)比分析
經(jīng)過24幅隨機(jī)圖片組的測試驗(yàn)證,獲得表2所示壓縮比結(jié)果對(duì)比。
5 結(jié)束語
QUIC壓縮算法可用于遙感圖像,醫(yī)學(xué)影像以及云桌面?zhèn)鬏數(shù)?。所以使用FPGA實(shí)現(xiàn)QUIC算法具有十分重要的商業(yè)前景。本文通過研究QUIC無損圖像壓縮算法的基本原理及關(guān)鍵技術(shù),提出了基于FPGA的QUIC的無損圖像壓縮算法的設(shè)計(jì)方法,不僅可以使得這種高效快速的無損圖像壓縮算法能夠得到快速的應(yīng)用,也可以為該算法的改進(jìn)以及優(yōu)化基于FPGA的實(shí)現(xiàn)方法提供一定的基礎(chǔ)。
參考文獻(xiàn)
[1]張?zhí)煨颍u勝,曾永慧,基于FPGA的圖像無損壓縮算法的實(shí)現(xiàn)[J],系統(tǒng)工程與電子技術(shù),2004,26 (10):1340-1343.
[2] Starosolski R.Simple fast andadaptive lossless image compressionalgorithm[J]. Software: Practice andExperience,2010, 37 (01): 65-91.
[3]于瀟,基于FPGA的無損圖像壓縮系統(tǒng)設(shè)計(jì)[J].電子產(chǎn)品世界,2015 (01):61-6 3.
[4]陳軍,基于LOCO-I算法的高速星載圖像無損壓縮FPGA實(shí)現(xiàn)研究[D].中國科學(xué)院研究生院(空間科學(xué)與應(yīng)用研究中心).2011.