A、變換量化過程總體介紹
經過幀內(16x16和4x4亮度、8x8色度)和幀間(4x4~16x16亮度、4x4~8x8色度)像素塊預測之后,得到預測塊的殘差,為了壓縮殘差信息的統計冗余,需要對殘差數據進行變換和量化操作。變換和量化的總體操作過程如下圖:
對於Intra_16x16的亮度塊,通過16(4x4)個4x4的前向DCT變換,然后對得到的16個DC系數再進行4x4的Hadamard變換,然后對於16個DC系數和240個AC系數進行量化(DC和AC的量化公式略有不同,為了控制量化死區大小,詳見量化器設計)。
對於8x8的色度塊(幀內、幀間),進行4x4的DCT變換后,得到4個DC和60個AC系數,同樣對於DC系數先進行2x2的Hadamard變換后,分別對DC和AC系數進行量化。
由於變換塊越大,編碼的效率越高,且圖像的細節信息越能得以保留。所以H.264在HD檔次中,支持進行8x8的DCT變換(設置標志transform_size_8x8_flag=1),且不需要對DC系數進行Hadamard變換,DCT變換后對DC和AC系數進行統一的量化處理。
然后對於其他尺寸的變換塊(不是Intra_16x16、8x8色度,沒有transform_size_8x8_flag=1標志),則簡單采用4x4的DCT變換,然后直接對DC和AC系數進行統一量化。
B、量化介紹
量化是通過多對一的映射,降低比特率。主要有均勻量化、非均勻量化和自適應量化。根據最優量化器設計准則:最佳量化區間的邊界值為相鄰兩個最佳量化值的平均數,最佳量化值為所在量化區間的均值。
1、簡單的定長標量量化器公式如下:
Z = int(|W|/S) * sng(W)。
其中W表示輸入值,S是量化步長,int(x)表示小於等於x的最大整數,sng(x)表示x的符號,取值-1、0、+1。
反量化公式:
W = S * Z;
如圖:在量化區間[n*S, n*S+S)中,殘差量化值為n*S。量化不長S決定了量化的效果,S越大,量化器的壓縮效率越高,但是相應的圖像的失真越高。但是對於上述量化器,對於區間[0,S)的殘差值,被量化成0,明顯不符合最優量化器設計准則,所以引入量化偏移量f。
2、變形量化器:引入量化偏移量f,公式如下:
Z = int((|W| + f ) / S) * sng(W);
反量化公式如下:
W = S * Z;
如圖:在量化區間(F-S,S-F)中,量化值是0;在[S-F, 2S-F)中,量化值為S。由於區間(f-S, S-f)的殘差量化為0,[S-f, 2S-f)的殘差量化為S,所以此量化器就可以通過調節f的值,調節量化區間的最佳量化值,使得最佳量化值滿足是該區間的均值(W是非均勻分布時也可以調節f達到最佳量化器的要求),因此f可以控制量化區間的偏移量。H.264的參考模型建議對於幀間預測時,f=S/6;對於幀內預測是,f=S/2。
對於殘差值屬於(f-S, S-f)時,量化值是0,所以區間(f-S, S-f)被稱為量化死區,通過f可以控制量化死區的大小。由於經過DCT變換后,殘差值大量處於量化死區,且量化死區的殘值值往往對應高頻細節信息,在實際應用中,往往需要對量化死區的高頻或者大量出現的殘差信息特殊處理,所以需要根據實際控制量化死區的大小。但是由於f同時控制着量化偏移量和量化死區,具有耦合性,所以為了解耦合,在JVT-K026中提出一種解耦合的量化器。
3、變形量化器:引入參數t控制量化死區,公式如下:
Z = int( (|W| + f + t) / S) * sng(W);
反量化公式:
W = (S * |Z| - t )* sng(Z)。
如圖:在量化區間(t+f-S, S-t-f)中,量化值是-t;在區間[S-t-f,2S-t-f)中,量化值是S-t。該量化器通過f控制量化值(即:量化值相對於量化區間斷點的偏移量),確定量化偏移量滿足最優量化器后,通過t控制量化死區的大小。