JPEG霍夫曼编码过程

3
在JPEG标准中,Huffman表是通过两个步骤从一组统计数据中生成的。其中一个步骤是实现此图片中给出的函数/方法(该图片在JPEG标准的附件K中给出): Function 问题在于,在标准(附件C)中先前已经指出:
“Huffman表是根据16字节列表(BITS)中指定的内容指定的,该列表给出了从1到16的每个编码长度的编码数。然后,是8位符号值(HUFFVAL)的列表,为每个符号分配了Huffman编码。”
显然,BITS是由16个元素组成的列表。但在上面的图片中,i首先设置为32(i = 32),然后我们想访问BITS[i]。也许我误解了某些东西,请有人给我答案。
这里是图片的JPEG标准描述: 图K.3 给出了调整BITS列表的过程,以确保没有代码超过16位。由于最长的Huffman代码是成对的,因此这些代码将成对地从此长度类别中移除。该对的前缀(比一个位短)被分配给其中一个;然后(跳过该前缀长度的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;
        }
    }
}
1个回答

5
这段代码仅适用于希望生成自定义哈夫曼表的编码器。大多数JPEG编码器使用固定的表格,这些表格是大多数图像统计学合理近似值的表格。在这种特殊情况下,为交流系数生成Huffman表的第一步会产生一个长达32个条目(位)的表格。由于只有256个唯一符号要进行编码(跳过/长度对),因此应该永远不需要超过32位来指定所有Huffman码。在第一个传递已生成一组代码(长达32位),第二个传递将最不常见(最长)的代码“移动”到较短的长度槽中,以使最大代码长度为16位。在理想的哈夫曼表中,频率分布对应于代码长度。在这种情况下,正在通过将最长的代码挤入保留给较短代码的空槽中来制作表格。这可以做到,因为14/15/16位长度的哈夫曼码具有更多的位排列方式,并且可以将较长的码“放入”其中。
更新: 在JPEG中,“优化”哈夫曼表的效益有限。大多数压缩是因为像素的量化和DCT变换而发生的。转换成算术编码具有可衡量的好处(大小减小约10%),但这会限制受众,因为由于过去的专利问题,大多数JPEG解码器不支持算术编码。

我告诉你多少次了,你是个厉害的人:)。你在哪里看到这些固定表格的信息?或许可以帮助我! - MrD
您可以在标准的附录K.3.3中找到固定表的示例。我猜大约90%的JPEG使用这些代码。 - onemasse
1
M先生 - 也许我应该提供课程或私人教学 :) - BitBank

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接