Jpeg霍夫曼编码程序

时间:2012-02-02 15:39:21

标签: encoding jpeg huffman-code

JPEG标准的Huffman表是通过两个步骤从统计数据集中生成的。其中一个步骤是实现该图片给出的功能/方法:(该图片在JPEG标准的附录K中给出): Function

问题在这里。以前在标准(附件C)中说这句话:

霍夫曼表是根据16字节列表(BITS)指定的,给出了每个代码长度的代码数量 这之后是一个8位符号值列表(HUFFVAL),每个符号值都分配了一个霍夫曼码。

显然BITS是16个元素的列表。但在上图中,i首先设置为32(i=32),然后我们想要访问BITS[i]。可能我误解了一些东西,所以请让别人给我一个答案。

这是图片的JPEG标准说明:   图K.3 给出了调整BITS列表的过程,使得代码不超过16位。由于符号是配对的 对于最长的霍夫曼代码,一次从该长度类别中删除符号。该对的前缀 (它短一位)被分配给一对;然后(跳过该前缀长度的BITS条目)一个代码字 从下一个最短的非零BITS条目转换为两个代码字的前缀一个长一点。在BITS之后 list减少到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;
        }
    }
}

1 个答案:

答案 0 :(得分:3)

此代码仅适用于想要生成自己的自定义Huffman表的编码器。大多数JPEG编码器只使用固定表,这些表是大多数图像统计数据的合理近似值。在这种特定情况下,为AC系数生成霍夫曼表的第一步产生最多32个条目(比特)长的表。由于只有256个唯一符号要编码(跳过/长度对),因此指定所有霍夫曼码所需的时间不应超过32位。在第一次传递产生一组代码(长度最多为32位)之后,第二次传递采用最不频繁(最长)的代码并将它们“移动”到较短的长度时隙中,以使最大代码长度为16位。在理想的霍夫曼表中,频率分布对应于代码长度。在这种情况下,通过将最长的代码压缩到为较短代码保留的时隙中来使表适合。这可以做到,因为14/15/16位长度的霍夫曼码具有更多比特排列的“空间”,并且可以“适应”更长的码。

更新: 在JPEG中“优化”霍夫曼表是有限的好处。大多数压缩是由于像素的量化和DCT变换而发生的。切换到算术编码具有可测量的好处(大小减少约10%),但随后它限制了受众,因为大多数JPEG解码器由于过去的专利问题而不支持算术编码。