您的位置:首页 > 编程语言 > MATLAB

JPEG文件中默认Huffman表说明

2014-06-03 22:47 691 查看
一、简述
         关于JPEG中Huffman的说明,具体可参见《ISO/IEC10918-1, 1993(e), Annex C》。

         在JPEG文件中,其数据包含有Huffman表数据,但这里面的Huffman表并不能直接应用于解码,还需要进行一些转换,以生成可以直接应用于解码的表。本文,即是说明如何进行转换。

二、Huffman表数据

         在JPEG文件中,一般存在亮度与色度的Huffman表,亮度Huffman又存在DC(直流)表与AC(交流)表,色度也存在DC(直流)表与AC(交流)表,所以,在JPEG文件中,一般来说有4张Huffman表。这里,我们不再详述Huffman表在JPEG中的位置,可以去查找JPEG的文件格式相关文章,我们将直接从JPEG文件默认的Huffman表数据开始。

         亮度DC的Huffman表数据,见图1画红线部分:



图1 亮度DC的Huffman表数据
         亮度AC的Huffman表数据,见图2画红线部分:



图2亮度AC的Huffman表数据
         色度表将不再进行表述,可以参考JPEG文件格式得到。

三、亮度Huffman表解析

         解压时,需要用到Huffman_size、Huffman_code两张表,至于是如何使用这两张表进行Huffman解码的,请参见《JPEG中Huffman解码详解》。本节的目的,仅仅是说明如何利用第二节所说的Huffman表数据,得到Huffman_size、Huffman_code这两张表。

a)        什么是Huffman_size、Huffman_code表?

         Huffman_size表中的数据代表着Huffman编码的长度;Huffman_code代表的是Huffman编码的内容。

         例:Huffman_size= 3 , Huffman_code =2 ,则其对应的Huffman编码为010(即值等于2的3 bit宽度的数据)。

b)        JPEG中的Huffman表数据的具体意义?

         JPEG中的Huffman表数据包含两个部分,一个部分表示不同位宽的编码个数,一个部分表示编码的具体内容,根据这些内容,即可得到上在所述的Huffman_size、Huffman_code表。

         我们以图1中的数据为例:前16个字节的数据为第1部分(BITS),00 01 05 0101 01 01 01 01 00 00 00 00 00 00 ,从第一个字节算起,共16个字节,这1~16个数据分别对应位宽1~16位的编码个数,从上可知:编码位宽为1的编码个数为0个,位宽为2的有1个,位宽为3的有5个等等。

         接下来为第二部分(HUFFVAL),此部分用于产生一张表Huffman_table,使得这张表按照1~16的长度去对应于Huffman_size、Huffman_code表。

c)        如何转化的?

         在《ISO/IEC10918-1, 1993(e), Annex C》中,用三个流程图,进行了详细的阐述,这里不再描述,仅将其相应的Matlab代码附上,以供参考:

% 根据DHT产生HUFFSIZE[]、HUFFCODE[]
% 参考"ISO/IEC10918-1, 1993(e), Annex C"
% dxq@2014-04-24

function[ehufco,ehufsi]=dedht(dht)
bits =dht(1:16);
huffval =dht(17:end);
% 参考"ISO/IEC10918-1, 1993(e), Annex C ,Figure C.1"
k = 0 ;
j = 1 ;
fori=1:16
for j=1:bits(i)
huffsize(k+1)=i;
k=k+1;
end
end
huffsize(k+1)=0;
lastk = k;

% 参考"ISO/IEC10918-1, 1993(e), Annex C ,Figure C.2"
code = 0;
k=1;
si =huffsize(1);
whilehuffsize(k)>0
huffcode(k)=code ;
code = code + 1 ;
k = k+ 1 ;
while huffsize(k)==si
huffcode(k)=code ;
code = code + 1 ;
k = k+ 1 ;
end
if huffsize(k)==0
break;
end
code = code * 2 ;
si = si + 1;
while huffsize(k)~= si
code = code * 2 ;
si = si + 1;
end
end

% 参考"ISO/IEC10918-1, 1993(e), Annex C ,Figure C.3"
for k=1:lastk
i=huffval(k);
ehufco(i+1)=uint32(huffcode(k));
ehufsi(i+1)=uint32(huffsize(k));
end


d)        以图1亮度DC的Huffman表数据为例,执行上述操作后,ehufco、ehufsi分别为:

ehufco =  0     2       3       4       5       6       14     30     62     126  254  510

ehufsi =  2      3     3       3       3       3       4       5       6       7       8       9

对应的Huffman_table可以被描述成:

                      { 2, 0x0000}, /*              00 */ 
            { 3, 0x0002},/*              010 */ 
            { 3,0x0003}, /*              011 */ 
            { 3,0x0004}, /*              100 */ 
            { 3,0x0005}, /*              101 */ 
            { 3,0x0006}, /*              110 */ 
            { 4,0x000e}, /*              1110 */ 
            { 5,0x001e}, /*             11110 */ 
            { 6,0x003e}, /*             111110 */ 
            { 7,0x007e}, /*           1111110 */ 
            { 8,0x00fe}, /*            11111110 */ 
            { 9, 0x01fe} /*          111111110*/ 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Huffman JPEG Matlab
相关文章推荐