前言 視頻壓縮算法通過(guò)對視頻信號的壓縮處理可以極大地降低視頻信號的存儲和帶寬需求,在此基礎上盡可能多的獲得最佳的圖像質(zhì)量。因此,了解視頻壓縮算法的基本原理對于嵌入式系統,處理器以及視頻應用工具的開(kāi)發(fā)人員來(lái)說(shuō),是非常必要的,例如在處理器選型以及軟件優(yōu)化的過(guò)程中,視頻壓縮算法的性能開(kāi)銷(xiāo)和存儲空間占用就是其中非常關(guān)鍵的因素。 在本文中,我們將著(zhù)重探討視頻壓縮算法的特點(diǎn)和處理流程,我們將對基本的視頻壓縮算法進(jìn)行解釋?zhuān)o態(tài)圖像壓縮、運動(dòng)估計、圖像去噪, 以及色彩空間轉換,同時(shí)我們還將討論視頻壓縮算法對處理器的性能需求以及由這些需求所帶來(lái)的一系列影響。 靜態(tài)圖像壓縮 視頻剪輯也就是我們通常所說(shuō)的動(dòng)態(tài)圖像序列,動(dòng)態(tài)圖像序列是由在時(shí)間軸上的若干幅靜態(tài)圖片組成的,在動(dòng)態(tài)圖像序列中的每一幅圖片稱(chēng)之為“幀”。在動(dòng)態(tài)圖像的壓縮算法中大量的使用了靜態(tài)圖像壓縮的算法和技術(shù),例如靜態(tài)圖像壓縮標準JPEG。實(shí)際上簡(jiǎn)單的動(dòng)態(tài)圖像序列壓縮的方法就是將此序列中的每一幅靜態(tài)圖片獨立的壓縮,忽略掉這些圖片在時(shí)間上的相關(guān)性。在一些視頻產(chǎn)品的應用中使用了這種方法,將每一幅圖片都用JPEG標準進(jìn)行壓縮,我們稱(chēng)之為“運動(dòng)JPEG”或者也叫MJPEG。 目前更為先進(jìn)的視頻壓縮算法更多的利用了視頻序列中連續的靜態(tài)圖像,也就是連續幀之間的時(shí)間相關(guān)性,利用運動(dòng)估計和運動(dòng)補償算法獲得更好的壓縮比,當然這些先進(jìn)的視頻壓縮算法也同樣采用了靜態(tài)圖像壓縮里面的一些基本算法,因此我們的討論就從基于塊變換的靜態(tài)圖像算法JPEG開(kāi)始。 數字圖像壓縮的基本單元 塊變換 在JPEG和大多視頻壓縮算法中所采用的壓縮算法都是“有損壓縮”,所謂有損壓縮就是指從壓縮后的數據中無(wú)法完全恢復重構出原始的壓縮前圖像,有損壓縮會(huì )丟失掉一部分原始圖像的信息,因此,有損壓縮算法就需要盡量保證由信息丟失所造成的原始圖像和重構圖像之間的差異不被人眼所察覺(jué)。 對于JPEG和類(lèi)似的圖像壓縮算法來(lái)說(shuō),壓縮的第一步需要將圖像分割為小塊,同時(shí)將每個(gè)小塊進(jìn)行變換,使之由空域信號變換成為時(shí)域信號。這種空域到時(shí)域的變換多采用8x8的離散余弦變換(以下稱(chēng)DCT),經(jīng)過(guò)DCT變換之后,8x8的空域像素矩陣變換成為 8x8的頻域信號矩陣,DCT變換能夠完整的保留所有8x8像素塊的信息,因此反向離散余弦變換(以下稱(chēng)IDCT)也就能夠從8x8頻域信號矩陣中完整的恢復原始8x8像素矩陣。DCT變換后的頻域信號矩陣中包含原始8x8像素矩陣的低頻部分和高頻部分,其中低頻部分對應圖像的重要信息,高頻部分對應圖像的細節信息,就人眼的特點(diǎn)來(lái)說(shuō),對于圖像低頻部分的感知要比對于圖像高頻部分的感知敏感很多,因此在DCT變換將圖像的信息按照其人眼感知的敏感程度分離之后,后續的壓縮步驟就是將其低頻部分編碼更多的比特,從而獲得更高的精度,而對其高頻部分編碼更少的比特數或者不編碼比特,從而在保留一定的視覺(jué)效果的同時(shí),獲得更好的壓縮效果。在解碼端,再用IDCT變換從頻域信號矩陣中恢復出原始8x8像素矩陣。 IDCT變換和DCT變換的運算量基本一致,因此這兩種變換對處理器的性能要求也基本類(lèi)似。一個(gè)二維8x8 DCT變換和IDCT變換在典型的DSP平臺上需要數百個(gè)指令周期完成,視頻壓縮算法的執行中每秒都需要進(jìn)行大量的DCT和IDCT運算,以一個(gè) MPEG4的解碼器為例,在解碼分辨率為CIF(352x288),幀率為30fps的視頻序列時(shí),需要每秒進(jìn)行71,280次IDCT運算,在TI TMS320C55x DSP處理器平臺上需要占用40MHz的處理性能(不考慮集成DCT加速器),這大概占用了整個(gè)視頻解碼器應用時(shí)處理器性能的30%。 由于DCT和IDCT運算的單位都是很小的圖像塊,因此相對于幀緩存以及圖像壓縮應用中的其他數據存儲來(lái)說(shuō),其對存儲資源的占用幾乎可以忽略不計,正是基于其大運算量,低存儲占用的特點(diǎn),DCT和IDCT運算單元特別適合用專(zhuān)用的硬件加速協(xié)處理器來(lái)實(shí)現。 量化 DCT變換后的結果稱(chēng)為DCT系數,正如上文所說(shuō),編碼器需要對于DCT系數中的重要的低頻分量編碼更多的比特,對于DCT系數中的次要的高頻分量編碼更少的比特,這種對系數的編碼方法可以通過(guò)兩步來(lái)實(shí)現:首先通過(guò)量化過(guò)程舍去次要的視頻信息,然后利用統計學(xué)的方法盡可能少的對剩余的重要信息進(jìn)行比特編碼。 量化過(guò)程就是將每個(gè)DCT系數向若干預設值進(jìn)行舍入的過(guò)程,例如,DCT系數是值介于-1 到1 之間的實(shí)數,將其用縮放因子20進(jìn)行縮放,同時(shí)將結果舍入到最近的整數,于是DCT系數便量化成為值介于-20到20之間的整數,共有41個(gè),在理想情況下,為每個(gè)DCT系數選擇合適的量化因子可以使量化后的DCT系數在向右取整的過(guò)程中不至于引入明顯的量化噪聲。 在解碼端,采用與編碼端相反的反量化過(guò)程,就上文所屬的例子來(lái)說(shuō),對量化后的DCT系數進(jìn)行反量化,用1/20進(jìn)行縮放,反量化值縮放到-1到1之間,注意此時(shí)的反量化值與原始的量化前系數已經(jīng)不再相等,不過(guò)足夠接近,以保證IDCT 變換以后不會(huì )引入明顯的視覺(jué)差異。反量化大概需要占用整個(gè)視頻解碼器應用時(shí)處理器性能的3%-15%,與DCT和IDCT變化類(lèi)似,量化和反量化對存儲器的資源占用可以忽略不計。 編碼 壓縮的下一個(gè)步驟即是對量化后的DCT系數進(jìn)行比特編碼,使之成為傳輸比特流,為了盡可能少的編碼比特數,達到數據壓縮的效果,需要利用量化后的DCT系數的一些統計特性。 量化后的DCT系數的值大多是0值,特別是大量的高頻DCT系數分量,一種叫做“游程編碼”(以下稱(chēng)run-length編碼)的技術(shù)可以很好的利用DCT 系數的這一特點(diǎn),在這種編碼技術(shù)中,并不對每個(gè)0值系數單獨編碼,而是將連續的0值(run)進(jìn)行打包,然后再對這些連續0值系數的個(gè)數(length) 進(jìn)行編碼。 為了更大程度的利用run-length編碼的特點(diǎn),需要對8x8系數矩陣進(jìn)行zig-zag掃描,保證先對低頻系數分量進(jìn)行編碼,然后再對高頻系數分量進(jìn)行編碼,這樣做的目的是因為在高頻系數分量中出現大量連續0值系數的概率更高。 Run- length編碼完成后即進(jìn)行變長(cháng)編碼(VLC),在變長(cháng)編碼中,每個(gè)可能出現的數據值作為一個(gè)符號(例如每種可能run-length值作為一個(gè)符號),出現概率大的符號值用比特數更少的碼字表示,出現概率小的符號值用比特數更多的碼字表示,變長(cháng)碼相對于定長(cháng)碼使用的比特數更少,(定長(cháng)碼是一種直接編碼方法,例如直接將每個(gè)量化后DCT系數編碼為其二進(jìn)制表示),因此變長(cháng)碼在編碼一幅圖像時(shí)所消耗的平均比特數更少。在變長(cháng)碼編碼中,哈夫曼編碼是一種廣泛使用的編碼方法,基于每個(gè)符號的發(fā)生頻率,哈夫曼編碼可以獲得更優(yōu)的編碼效果。 理論上,對一組符號序列來(lái)說(shuō),變長(cháng)編碼并不是最優(yōu)的編碼方法,相對于變長(cháng)編碼來(lái)說(shuō),“算術(shù)編碼”的編碼比特數更少,編碼效果更好。變長(cháng)編碼為每個(gè)符號分配單獨的碼字,因此每個(gè)符號都需要整數個(gè)比特個(gè)數(即每個(gè)符號至少占用1個(gè)比特),算術(shù)編碼將一組符號序列作為一個(gè)整體來(lái)進(jìn)行編碼,因此并不是每個(gè)符號都需要占用比特,因此可以獲得更大的壓縮率,但是算術(shù)編碼的運算法雜程度遠遠大于變長(cháng)編碼,因此只在最近的一些商用視頻壓縮算法中獲得應用,相對于算術(shù)編碼,在很多應用中,run-length編碼和變長(cháng)編碼的組合編碼方法相對于算術(shù)編碼運算復雜程度低,編碼效率足夠,因此時(shí)至今日變長(cháng)編碼仍然在大量的視頻壓縮協(xié)議中廣泛應用。 變長(cháng)編碼通過(guò)對碼字和其長(cháng)度的查找表實(shí)現,完成查找后將碼字取出填充進(jìn)比特流輸出,對應的解碼端過(guò)程稱(chēng)之為變長(cháng)解碼(VLD),最直接的變長(cháng)解碼做法需要對每一個(gè)比特都要進(jìn)行查表操作和判決,相對于變長(cháng)編碼對每一個(gè)符號所進(jìn)行的查表操作來(lái)說(shuō),這種變長(cháng)解碼的方法運算量更加密集,平均每個(gè)比特需要進(jìn)行11步操作,因此變長(cháng)解碼的處理性能需求是和解碼器的解碼碼率成正比的,對于一些低分辨率和低碼率的視頻序列來(lái)說(shuō),變長(cháng)解碼往往占到整個(gè)解碼器應用時(shí)處理器性能的 25%。 在一個(gè)典型的視頻解碼器中,上文所描述的這種最直接的變長(cháng)解碼方法需要占用數KB大小的存儲空間用于存放查找表,為了獲得更高的解碼性能,可以采用一次處理一批比特的做法,當然,這種做法需要付出更大存儲空間的代價(jià)。 變長(cháng)編碼的缺點(diǎn)在于,當編碼后的圖像或者編碼后視頻幀的比特流中出現誤碼時(shí),解碼端將無(wú)法正確恢復誤碼后的圖像部分,一旦出現誤碼,解碼端就無(wú)法識別誤碼所對應的正確碼字的長(cháng)度,因此也就無(wú)法識別下一個(gè)正確碼字在比特流里的起始位置,也就無(wú)法繼續解碼圖像。一種技術(shù)可以部分解決這個(gè)問(wèn)題,該技術(shù)在編碼比特流中預先插入“重同步標志”,重同步標志的插入位置和內容是事先定義好的,因此解碼端在解碼過(guò)程中能夠對重同步標志進(jìn)行正確定位,因此當誤碼發(fā)生的時(shí)候,解碼器可以從誤碼位置向后搜索下一個(gè)重同步標志,然后可以從這個(gè)重同步標志以后解碼出后續的圖像部分。 此外,在MEPG4視頻壓縮標準中,還采用了稱(chēng)為“反向變長(cháng)碼”的技術(shù),在反向變長(cháng)碼中,碼字的選擇保證了其不但能夠從普通的正向進(jìn)行解碼,同時(shí)也能夠從反向進(jìn)行解碼,因此當誤碼發(fā)生的時(shí)候,解碼端可以向下搜索下一個(gè)重同步標志,搜索到了以后,再從重同步標志的位置反向解碼至誤碼位置,因此解碼端能夠盡可能多的恢復圖像數據。 到此為止,上面描述的所有技術(shù)都是針對一個(gè)獨立的8x8的像素塊,一幅圖像所包含的信息遠大于一個(gè)8x8像素塊所能包含的信息,因此利用相鄰塊彼此的相關(guān)性可以應用更多更有效的壓縮方法。 為了利用塊與塊之間的相關(guān)性,可以采用預測的技術(shù),編碼器在對DCT系數進(jìn)行量化之前,可以基于周邊塊的DCT系數預測當前塊的DCT系數,然后對預測值和當前實(shí)際值的差值進(jìn)行量化,而不是直接對當前DCT系數進(jìn)行量化,由于這個(gè)差值往往比較小,因此這項技術(shù)可以減少對DCT系數編碼的比特數,對于解碼端,采用相同的預測方法,然后將從碼流解碼出來(lái)的差值加上預測出來(lái)的預測值,就可以重構出實(shí)際的DCT系數值,需要注意的是,由于解碼端只能夠獲得那些在當前塊解碼前已經(jīng)解碼的塊的DCT系數,因此編碼端必須保證只用到那些在編碼當前塊之前已經(jīng)編碼的塊的DCT系數作為預測值。 對于最簡(jiǎn)單的情況,只對每個(gè)塊的第一個(gè)系數進(jìn)行預測,這個(gè)系數被稱(chēng)作“DC系數”,它代表 DCT系數里的最低頻分量,等于所有塊像素的均值,其余的系數被稱(chēng)作“AC系數”。這種最簡(jiǎn)單的做法是基于這樣的假設,即當前塊的DC系數等于左邊相鄰塊的DC系數,這種做法利用了當前塊和左邊相鄰塊的空間相關(guān)性,對當前塊和前一編碼塊的DC系數的差值進(jìn)行編碼,被稱(chēng)為“DC系數差分編碼”,在JPEG圖像壓縮標準中得到了廣泛的應用。 也有一些更為復雜的預測方法,例如對8x8塊的每一行和每一列的第一個(gè)DCT系數進(jìn)行預測,這樣的方法被稱(chēng)作“AC-DC預測”,同上面所描述的差分編碼的方法相比,這種方法采用了更為復雜的預測方法,首先,對預測值的計算采用了濾波的方法,而不是簡(jiǎn)單的等于相鄰塊對應的系數,其次,預測值的產(chǎn)生可能要考慮多個(gè)相鄰塊,預測值可能是基于多個(gè)塊預測值的組合,同樣,編碼器會(huì )從多個(gè)預測塊中選出一個(gè)來(lái)獲得最好的預測效果,這樣的話(huà)編碼器就必須在碼流中表明哪一個(gè)相鄰塊被選中,這樣解碼器才能夠進(jìn)行同樣的預測過(guò)程正確重構DCT系數。 來(lái)源:Berkeley Design Technology, Inc. |