Encoding Jpeg哈夫曼编码程序

Encoding Jpeg哈夫曼编码程序,encoding,jpeg,huffman-code,Encoding,Jpeg,Huffman Code,JPEG标准中的哈夫曼表是通过两个步骤从统计数据集合生成的。其中一个步骤是实现此图片给出的功能/方法:(此图片在JPEG标准的附录K中给出): 问题就在这里。之前的标准(附录C)中有这样一句话: 哈夫曼表以16字节列表(位)的形式指定,该列表给出了从 1至16。然后是8位符号值(HUFFVAL)列表,每个值都被分配一个哈夫曼码 显然,位是由16个元素组成的列表。但在上图中,i首先设置为32(i=32),然后我们要访问位[i]。可能我误解了什么,所以请让别人给我一个答案 以下是图片的JPEG标准

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

问题就在这里。之前的标准(附录C)中有这样一句话:

哈夫曼表以16字节列表(位)的形式指定,该列表给出了从 1至16。然后是8位符号值(HUFFVAL)列表,每个值都被分配一个哈夫曼码

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

以下是图片的JPEG标准描述: 图K.3给出了调整位列表的步骤,以便代码长度不超过16位。因为符号是成对的 对于最长的哈夫曼码,每次从该长度类别中删除两个符号。该对的前缀 (短一位)分配给该对中的一个;然后(跳过该前缀长度的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;
        }
    }
}
void adjustBitLength到16位(向量和位){
int i=32,j=0;
而(1){
如果(位[i]>0){
j=i-1;
j--;

while(位[j]此代码仅适用于希望生成自己的自定义哈夫曼表的编码器。大多数JPEG编码器只使用固定表,这些表是大多数图像统计数据的合理近似值。在这种特殊情况下,为AC系数生成哈夫曼表的第一步将生成最多32个条目(位)的表长。由于只有256个唯一符号需要编码(跳过/长度对),因此指定所有哈夫曼码所需的长度不应超过32位。在第一次传递产生一组代码(长度不超过32位)后,第二次传递使用频率最低(最长)的代码和“移动”在理想的哈夫曼表中,频率分布对应于代码长度。在这种情况下,通过将最长的代码压缩到为较短代码保留的插槽中,使表适合。这可以实现,因为14/15/16位长度的哈夫曼代码“空间”可以容纳更多的位排列,并且可以“容纳”其中较长的代码

更新:
“优化”JPEG中的哈夫曼表的好处有限。大多数压缩都是由于像素的量化和DCT变换而产生的。切换到算术编码有一个可测量的好处(~10%的大小缩减),但由于过去的专利问题,大多数JPEG解码器都不支持算术编码,因此限制了受众。

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