一、简述
关于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*/