encoding - jpeg哈夫曼编码程序

标签 encoding jpeg huffman-code

JPEG 标准中的霍夫曼表是分两步从一组统计数据中生成的。其中一个步骤是实现此图片给出的功能/方法:(此图片在 JPEG 标准的附件 K 中给出): Function

问题就在这里。以前在标准(Annex 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;
        }
    }
}

最佳答案

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

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

关于encoding - jpeg哈夫曼编码程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9115155/

相关文章:

ios - 我可以在 jpeg 中使用(一些)iOS 启动图像,而不是在 xcode5 中使用 png 吗?

java - java中如何压缩一串0和1

c - 如何修复我的函数以将霍夫曼树打印到屏幕上?

mysql - 向mysql插入特殊字符

postgresql - 强制 Postgres 使用 UTF8 编码安装,而不是 LATIN1?

c# - Python 的 hash.digest() 使用什么 c# 等效编码?

python-2.7 - 在python中将tiff转换为jpeg

Java 编码 - 相当于 Java 中的 sjisMS 编码

python - 将 GeoTIFF 转换为 JPEG 并在 Python 中提取 GeoTIFF header

optimization - 如何强制 haskell 不存储整个字节串?