【问题标题】:Jpeg huffman coding procedureJpeg霍夫曼编码程序
【发布时间】:2012-02-02 15:39:20
【问题描述】:

按照 JPEG 标准,哈夫曼表是通过两个步骤从一组统计信息中生成的。其中一个步骤是实现这张图片给出的功能/方法:(这张图片在JPEG标准的附件K中给出):

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

霍夫曼表以 16 字节列表 (BITS) 的形式指定,给出每个代码长度的代码数量 1 到 16。后面是 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;
        }
    }
}

【问题讨论】:

    标签: encoding jpeg huffman-code


    【解决方案1】:

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

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

    【讨论】:

    • 我告诉过多少次你是国王:)。你从哪里读到这些固定桌子的?也许它可以帮助我!
    • 您可以在标准的附件 K.3.3 中找到固定表的示例。我猜大约90% 的 JPEG 文件使用这些代码。
    • 先生。 M - 也许我应该提供课程或私人课程:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-02
    • 1970-01-01
    • 2023-03-23
    • 2010-10-17
    • 1970-01-01
    相关资源
    最近更新 更多