JPEG編解碼過程詳解(二)

來源:互聯網
上載者:User

 

2.4  量化(quantization)

    量化過程是一個將訊號的幅度離散化的過程,離散訊號經過量化後變為數字訊號。

    由於HVS對低頻訊號更為敏感,所以對訊號的低頻部分採用相對短的量化步長,對訊號的高頻部分採用相對長的量化步長。這樣可以在一定程度上,得到相對清晰的映像和更高的壓縮率。

 

2.5  Z字形編碼(zigzag scan)

          按Z字形把量化後的資料讀出,例:

 

 

2.6  使用行程長度編碼(RLE)對交流係數(AC)進行編碼

    所謂遊程長度編碼是指一個碼可以同時表示碼的值和前面有幾個零。這樣就發揮了Z字型讀出的優點,因為Z字型讀出,出現連零的機會比較多,特別到最後,如果都是零,在讀到最後一個數後,只要給出“塊結束”(EOB)碼,就可以結束輸出,因此節省了很多碼率。

    例:圖中按Z字形抽取和遊程編碼得到碼值為

                         (0,1,0)(1,2,0)(0,5,0)(0,4,0)(4,8,1)EOB

                   這樣一個4*4的矩陣用很少的數值就能表示!  

                 

 

2.7  熵編碼

    常用的熵編碼有變長編碼,即哈夫曼編碼。

    哈夫曼的編碼方法:對出現機率大的符號分配短字長的二進位碼,對出現機率小的符號分配長字長的二進位碼,得到符號平均碼長最短的碼。

    哈夫曼編碼的步驟:(1). 把信源符號按機率大小順序排列, 並設法按逆次序分配碼字的長度。 (2). 在分配碼字長度時,首先將出現機率最小的兩個符號的機率相加合成一個機率 (3). 把這個合成機率看成是一個新組合符號地機率,重複上述做法直到最後只剩下兩個符號機率為止。 (4). 完成以上機率順序排列後,再反過來逐步向前進行編碼,每一次有二個分支各賦予一個二進位碼,可以對機率大的賦為零,機率小的賦為1。

 

 

關於AC/DC係數的編碼

1.AC係數的Huffman編碼

     經過Z掃描和遊程編碼後的非零AC係數被表述為符號A和符號B。符號A由(Runlength,Size)構成,符號B(Amplitude)。

    Runlength為非零AC係數前連續為0的AC係數;

    Size則是表示編碼Amplitude所需要的位元位元;

    Amplitude為AC係數的幅值。

    實際操作時,JPEG用一個8位的值RS來表示符號A,RS=RRRRSSSS,對於一個非零的AC係數,高四位用來表示Runlength,低四位用來表示Size。(00000000)用來表示EOB。

    對符號B進行變字長整數(VLI)編碼,將符號B的VLI碼放在A後從而形成對A,B編碼的最終結果。

 

2.DC係數的Huffman編碼

      對於DC係數,與非零的AC係數類似,它將相鄰兩塊DC係數的差值(DIFF)描述如下的符號對:符號A為(Size),符號B為(Amplitude)。

     Size表示為編碼Amplitude所需要的位元;

     Amplitude表示DC係數的幅值。

     在JPEG標準中,對符號A根據相應的Huffman表進行變字長編碼,對符號B進行變字長整數編碼,而後將符號B 的VLI碼放在符號A的Huffman碼後,從而完成了對DIFF的編碼。

     在JPEG標準中沒有定義預設的Huffman表,使用者可以根據實際應用自由選擇,可以預先定義一個通用的Huffman表,也可以針對一幅特定的映像,在壓縮編碼前通過搜集其統計特性來計算Huffman表。

 

三,JPEG解碼的主要過程。

   3.1  讀入檔案的相關資訊

            按照JPEG檔案資料存放區方式,把要解碼的檔案的相關資訊一一讀出,為接下來的解碼工作做好準備。參考方法是,設計一系列的結構體對應各個標記,並儲存標記內表示的資訊。其中映像長寬、多個量化表和哈夫曼表、水平/垂直採樣因子等多項資訊比較重要。以下給出讀取過程中的幾個問題。

     1. 讀取檔案的大體結構

              JFIF格式的JPEG檔案(*.jpg)的一般順序為:

              SOI(0xFFD8),APP0(0xFFE0),[APPn(0xFFEn)]可選,

              DQT(0xFFDB),SOF0(0xFFC0),DHT(0xFFC4),SOS(0xFFDA),

              壓縮資料,EOI(0xFFD9)。

     2. 讀取哈夫曼表資料;

     3. 建立哈夫曼樹。

     在準備好所有的圖片資訊後,就可以對圖片資料進行解碼了。

 

 

關於AC,DC係數的解碼

 

 1. AC係數的解碼

    通過查詢Huffman資料解出RS,從中的到Runlength和Size的值。因為符號B是通過VLI表來編碼的,所以通過查詢Size的值可以得到Amplitude。這樣就可以解出符號A和符號B的值了。

 2. DC係數的解碼

    同理,先查詢Huffman表解出Size的,通過Size解出DIFF,將其與上一個8*8塊的DC係數數值相加,最終得到該塊的DC係數。

 

 

3.2 MCU中顏色分量(Y,U,V)的解碼

    映像資料流是有MCU組成,而MCU是用資料單元和顏色分量構成。映像資料流是以位(bit)為單位儲存資訊的。並且內部的資料都是在編碼時通過正向離散餘弦變換(FDCT)進行時空域向頻率域變換而得到的結果,所以對於每個顏色分量單元都應該由兩部分組成:1個直流分量和63個交流分量。

    顏色分量單元內部綜合運用了RLE行程編碼和哈夫曼編碼來壓縮資料。每個像素的資料流由兩部分構成:編碼和數值,並且兩者基本以互相隔開方式出現(除非該編碼的權值為零)。解碼的過程其實就是哈夫曼樹的尋找過程。

 

3.3 直流係數的差分編碼

    把所有的顏色分量單元按顏色分量(Y、Cr、Cb)分類。每一種顏色分量內,相鄰的兩個顏色分量單元的直流變數是以差分來編碼的。也就是說,通過之前解碼出來的直流變數數值只是使用中色彩分量單元的實際直流變數減去前一個顏色分量單元的實際直流變數。也就是說,當前直流變數要通過前一個顏色分量單元的實際(非解碼)直流分量來校正:

                                       DCn=DCn-1+Diff

 

其中Diff為差分校正變數,也就是直接解碼出來的直流係數。但如果使用中色彩分量單元是第一個單元,則解碼出來的直流數值就是真正的直流變數。

              3個顏色分量的直流變數是分開進行差分編碼的。也就是說,為1張圖片解碼時應設定3個獨立的直流校正變數。

 

3.4 反量化

    反量化的過程比較簡單。只需要對8*8的顏色分量單元的64個值逐一乘以對應的量化表內位置相同的值則可。映像內全部的顏色分量單元都要進行反量化。

 

3.5 反Zig-zag編碼

3.6 反離散餘弦變換

 

    之前提到,檔案中的資料是在編碼時通過正向離散餘弦變換(FDCT)進行時空域向頻率域變換而得到的結果,所以現在解碼就必須將其反向離散餘弦變換(IDCT),就是把顏色分量單元矩陣中的頻率域數值向時空域轉換。並且,原來的頻率域的矩陣大小為8*8,則經過反向離散餘弦變換後,時空域的矩陣仍然是8*8。

 

 

3.7 YCrCb向RGB轉換

    要在螢幕上顯示映像,就必須以RGB模式表示映像的顏色。所以,解碼時需要把YCrCb模式向RGB模式轉換。

    另外,由於離散餘弦變化要求定義域的對稱,所以在編碼時把RGB的數值範圍從[0,255]統一減去128位移成[-128,127]。因此解碼時必須為每個分量加上128。具體公式如下:

                 R=       Y        +1.402*Cb     +128;

                 G=Y-0.34414*Cr    -0.71414*Cb   +128;

                 B=       Y        +1.772*Cb     +128;

    還有一個問題,通過變換得出的R、G、B值可能超出了其定義域,所以要作出檢查。如果大於255,則截斷為255;如果小於0,則截斷為0。 

    至此,每個MCU的解碼已經完成。

 

原文出處:http://blog.sina.com.cn/s/blog_61d40cc30100f5e6.html

原文作者:quennel

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.