2012-02-02 150 views
3

JPEG標準中的霍夫曼表格是通過兩個步驟的統計信息生成的。其中一個步驟是實現此圖片給出的功能/方法:(此圖片在JPEG標準的附件K中給出): FunctionJpeg霍夫曼編碼程序

問題就在這裏。在標準(附錄C)先前說這樣的句子:

霍夫曼表是在一個16字節的列表(BITS)給出了每個碼長碼的數目來指定從 1〜16這之後是8位符號值(HUFFVAL)的列表,每個符號值被分配一個霍夫曼碼。

顯然BITS是16個元素的列表。但在上圖中,i首先設置爲32(i=32),那麼我們要訪問BITS[i]。可能我誤解了一些東西,所以請讓別人給我一個答案。

這裏是圖象的JPEG標準描述: 圖K.3給出的程序,用於調整BITS列表,以便沒有任何代碼是大於16位長。由於最長霍夫曼代碼的符號配對爲 ,因此每次從這個長度類別中刪除符號。對 (短一點)的前綴分配給一對;然後(跳過該前綴長度的BITS條目),將來自下一個最短的非零BITS條目的代碼字 轉換爲用於兩個比特長的兩個代碼字的前綴。在BITS 列表減少到16位的最大代碼長度之後,最後一步從代碼長度 計數中刪除保留代碼點。

這裏是上面的圖片代碼:

void adjustBitLengthTo16Bits(vector<char>&BITS){ 
    int i=32,j=0; 
    while(1){ 
     if(BITS[i]>0){ 
      j=i-1; 
      j--; 
      while(BITS[j]<=0) 
       j--; 
      BITS[i]=BITS[i]-2; 
      BITS[i-1]=BITS[i-1]+1; 
      BITS[j+1]=BITS[j+1]+2; 
      BITS[j]=BITS[j]-1; 
      continue; 
     } 
     else{ 
      i--; 
      if(i!=16) 
       continue; 

      while(BITS[i]==0) 
       i--; 
      BITS[i]--; 
      return; 
     } 
    } 
} 

回答

3

此代碼是隻對想生成自己的自定義霍夫曼表編碼器。大多數JPEG編碼器只是使用固定的表格,這些表格可以合理地近似大多數圖像的統計數據。在這種特殊情況下,爲AC係數生成霍夫曼表的第一步是生成一個長達32個條目(比特)的表格。由於只有256個獨特的符號要進行編碼(跳過/長度對),因此指定所有霍夫曼編碼時不應超過32位。在第一遍產生了一組代碼(長度最多爲32位)之後,第二遍採用最不頻繁(最長)代碼並將它們「移動」到較短長度的時隙中,使得最大代碼長度爲16位。在理想的霍夫曼表中,頻率分佈對應於碼長。在這種情況下,通過將最長的代碼擠壓到爲較短代碼保留的時隙中來製作表格。這可以這樣做,因爲14/15/16位長度的霍夫曼編碼對於更多的比特排列具有「空間」,並且可以「適合」它們中的較長編碼。

更新: 「優化」JPEG中的霍夫曼表的好處有限。大部分壓縮是由於像素的量化和DCT變換而發生的。切換到算術編碼有一個可衡量的好處(減少了約10%的尺寸),但是由於過去的專利問題,大多數JPEG解碼器不支持算術編碼,因此它限制了觀衆。

+0

多少次我說你是國王的男人:)。你從哪裏讀到這些固定表?也許它可以幫助我! – MrD 2012-02-02 19:30:37

+0

你可以在標準中找到附件K.3.3中固定表格的例子。我猜大約。所有JPEG的90%使用這些代碼。 – onemasse 2012-02-02 19:59:55

+0

M先生 - 也許我應該提供課程或私人課程:) – BitBank 2012-02-02 20:40:32