c JPEG 霍夫曼编码理解

表1:

6e48c86766244a5890ad09b10c8ce8a9.jpeg

 

014ada73a1e44b1a9c4a5580e3c732b8.jpeg18333d7da0a54986b01f5efc105d4cfe.jpegd7a061295f59474ab1658977307c03a5.jpeg

 0 ,0 ,1 ,4 ,3 ,1 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,6 ,0 ,4 ,5 ,7 ,1 ,2 ,3 ,8 ,
----------------
16 ,0 ,2 ,1 ,2 ,5 ,2 ,4 ,3 ,5 ,6 ,4 ,4 ,5 ,5 ,0 ,0 ,1 ,2 ,3 ,4 ,17 ,0 ,5 ,18 ,33 ,49 ,6 ,65 ,19 ,34 ,81 ,97 ,7 ,113 ,-127 ,20 ,50 ,-111 ,-95 ,-16 ,35 ,66 ,82 ,114 ,-79 ,-63 ,21 ,-126 ,-47 ,-15 ,22 ,51 ,67 ,98 ,8 ,36 ,-110 ,-94 ,-62 ,23 ,52 ,53 ,-93 ,-78 ,
----------------
1 ,0 ,2 ,3 ,1 ,1 ,1 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,3 ,4 ,0 ,2 ,5 ,1 ,6 ,7 ,
----------------
17 ,0 ,2 ,2 ,1 ,3 ,2 ,4 ,4 ,4 ,5 ,5 ,1 ,0 ,0 ,0 ,0 ,1 ,2 ,0 ,3 ,17 ,4 ,18 ,33 ,5 ,49 ,19 ,34 ,65 ,81 ,50 ,97 ,-111 ,-95 ,6 ,113 ,-47 ,-16 ,20 ,35 ,51 ,-127 ,-79 ,21 ,66 ,114 ,-63 ,-31 ,-15 ,
----------------
这是成品jpg图片的霍夫曼表

0:是亮度dc表,16:为亮度ac表

1:为色度dc表,17:为色度ac表

从上面的表可以看出,网上的演示图片可能是不正确的。比如16表:如查表怎样知道两位二进制数有2个。三位有一个。更重要的证据是从17位开始的被转换数应该是递增的,而不是大小不一的排列。

我理解:

1.编码首先要收集(a,b)中b的所有值与他们的出现频率。(a,b)就是Z排序后的数对。a不用管。

2.  把所有b 的值按出现的频率按由高到低排序

3. 生成霍夫曼代码 

如: 0 ,0 ,1 ,4 ,3 ,1 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,6 ,0 ,4 ,5 ,7 ,1 ,2 ,3 ,8 ,

       第一个0是表id,不编码,剩下为:0 ,1 ,4 ,3 ,1 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,6 ,0 ,4 ,5 ,7 ,1 ,2 ,3 ,8   。其中前16位表示二进制的位数:0 ,1 ,4 ,3 ,1 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0  ,各个位数上有多少被转换数。如第一位是0,表示一位没有,第二位是1,表示两位二进制xx有一个,xxx有4个,xxxx有3个,xxxxx有1个。总共有1+4+3+1=9个数,这9个数就是第17位开始的9个数:6, 0, 4,5,7,1,2,3,8  。这9个数就是(a, b)对中的b。

4:编码二进制:  2位:  1个              00              规定必须从0开始  00代表6

                              3位      4个     (00+1)×2  =010,  011 ,100, 101     //010 代表 0, 011==4

                                        //   100==5 , 101== 7

                              4位: 3 个     (101+1)×2=1100(1),1101(2),1110(3)

                              5位: 1个      (1110+1)×2=11110 (8)

5:所以转换后:  6   的代码为    2 :00

                              0   ==        3:010

                              4   ==       3:011

                               5  ==        3:100

                               7   ==       3:101

                                1  ==      4:1100

                               2   ==      4:1101

                               3  ==      4:1110

                               8  ==     5 :11110

所以,网上大多数的文章是不正确的。

7.再查霍夫曼定义的(0个数/ 二进制位数)表,就是图三这张表。这个表霍夫曼官网有提供,不用jpg文件头提供

    比如Z排序后 (0 ,5),根据第5步推算的二进制  5==3:100

        则(0 ,5)---》(0  ,3)100,再查霍夫曼定义的0个数/二进制位数表,(0 ,3)是

        100,  最后 (0 ,5) 就转换为 100 100 。这6个比特就代表 (0  ,5)。

  当然有这张推算的表,解码就很容易了,读三位二进制如是100,就代表是  5

猜你喜欢

转载自blog.csdn.net/m0_59802969/article/details/134972089
今日推荐