0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 首先,把DC系数表示为熵编码的中间格式,假设前一个子块DC系数的量化值是12,则本块DC系数于它的差为3,查表2-9,可得编码所需的位数为2,而其幅度为3,故DC的中间格式为(2)(3)。
接下来,对AC系数编码。经过“之”形扫描后,遇到的第一个非零系数为-2,其中遇到零的个数为1,即为行程,而对-2编码需要2bit,故其符号1为(1,2),符号2为(-2)。依次类推,可以求得这个8×8子块熵编码的中间格式为:
(DC)(2)(3),(1,2)(-2),(0,1)(-1),(0,1)(-1),(0,1)(-1),(2,1)(-1),(EOB)(0,0)
然后,进行熵编码:
对于(2)(3):2查DC亮度Huffman表得到11,3经过VLI编码为011; 对于(1,2)(-2):(1,2)查AC亮度Huffman表得到11011,-2是2的反码,为01;
对于(0,1)(-1):(0,1)查AC亮度Huffman表得到00,-1是1的反码,为0; 依此类推,可以得到这个8×8的子块经压缩后最后的数据流为11011,1101101,000,000,000,111000,1010,一共31bit。可以计算,它的压缩比为64×8/31=16.5,大概每个像素用半个比特。可见,这种编码方式取得了比较好的压缩效果。
基于DCT的JPEG压缩算法,对于中等复杂程度的彩色图像的压缩比与恢复图像的质量列表如图2-11所示。
表2-11压缩比与图像质量的关系
压缩效率(单位:bit/pixel) 0.25~0.50 0.50~0.75 0.75~1.5 1.5~2.0 2.5. Huffman编码
在上面的叙述中,曾多次提到过一种编码方式哈夫曼(Huffman)编码,哈夫曼编码
19
图像质量 中~好,可以满足某些应用 好~很好,满足多数应用 极好,满足大多数应用 与原始图像几乎一样 是1952年由Huffman提出的一种编码方式。这种编码方法的主要思想是根据源数据符号出现的概率进行编码,出现概率越高的符号,分配以越短的编码,反之,分配以较长的编码,从而达到用尽可能少的编码符号表示数据源。它的原理是根据以下信息论中的定理得来的:
定理 在变长编码中,对出现概率大的信源符号赋以短码字,而对于出现概率小的信源符号赋予长码字。如果码字长度严格按照所对应符号出现概率大小的逆顺序排列,则编码结果平均码字长度一定小于任何其他排列方式。
理论研究表明,哈夫曼编码是接近压缩比上限的一种较好的编码方法。 Huffman编码的一般步骤:
概率统计(如对一副图像或m副同种类型图像做灰度信号统计),得到n个不同概率的信号符号;
将信源符号按概率递减顺序排列;
把两个最小概率相加作为新符号的概率,并按(2)重排; 重复(1)、(2),直到概率为1;
在每次合并信源时,将合并的信源分别赋以“0”和“1”(本例中概率大的是赋“0”,概率小的赋“1”,);
寻找从每一信源符号到概率为1处的路径,记录路径上的“1”和“0”; 写出每一符号的“1”、“0”序列(从树根到信源符号结点)。 下面,我们通过一个例子来说明哈夫曼编码的具体过程:
如图2-10所示,在每个结点上标出一个信源字母的概率P j,1≤j≤8
图2.10 信源的Huffman编码
20
找出两个具有最小概率的结点,在本例中是0.01和0.04,把它们放在同一个父结点的两个子结点上。
在其父结点上标出子结点的概率之和,如图2-10所示,应该是0.01+0.04=0.05。进行下一轮找最小概率结点,由于这个父结点代表了原来的两个结点,因此现在只考虑7个结点。
在这7个结点中还没有产生父结点,在其中找两个最小概率的,这里是0.05和0.05,把它们放在同一个父结点的两个子结点上,并在其父结点上标出子结点的概率之和0.05+0.05=0.1。
继续这样的合并,每一步都将两个结点合并到一个父结点之下,对于两个概率相同的可以随意挑选出一个。
在左分支和右分支分别标0和1,这样,每个结点都产生一个码字。如图2-11所示,因此就有了一个字长为1的码字,三个字长为3的码字,一个字长为4的码字,一个字长为5的码字和两个字长为6的码字。图2-11表示了另一种Huffman编码。
在这种编码的Huffman树上,也有一个字长为1的码字,没有字长为2的码字,但有两个字长为3 的码字,三个字长为4的码字,两个字长为5的码字,没有字长为6的码字,两中Huffman编码和平均码长分别为:
_
L Ha=0.04+3(0.15+0.05+0.10)+4×0.10+5×0.05+6×(0.04+0.01)=2.55 _
L Hb=0.40+3(0.15+0.15)+4(0.10+0.10+0.05)+5(0.04+0.01)=2.55
图2.11 另一种Huffman编码
21
可见,尽管这两种码长设定不同,它们都有相同的平均码长,这也是Huffman编码成为最优算法的一个必要条件。
在计算哈夫曼编码时需要对原始图像扫描两遍:第一遍扫描要精确地统计出原始图像中的每个灰度值出现的概率;第二遍扫描是建立Huffman树并进行编码,其数据压缩和解压速度都较慢,但这种编码的效率相当高。 2.6. Jpeg文件的格式
JPEG委员会在制定JPEG标准时,定义了许多标记用来区分和识别图像数据及相关信息,目前,使用比较广泛的是JPEG文件交换格式JFIF(JPEG File Interchange Format)1.02版本。这是1992年9月由在C-Cube Microsystems公司工作的Eric Hamilton提出的。此外还有TIFF JPEG等格式,但由于这种格式比较复杂,因此大多数应用程序都支持JIFF文件交换格式。JPEG文件中的字节是按照正序排列的,即高位字节存放在前,低位字节存放在后。 2.6.1. 色度空间
JPEG文件使用的颜色空间是CCIR 601 推荐标准采用的彩色空间。在这个彩色空间中,每个分量、每个像素的电平规定为255级,用8bit代码表示。从RGB转换成YCbCr空间时,使用下面的精确的转换关系:
Y=256×E’y
Cb=256×[E’Cb]+128 Cr=256×[E’Cr]+128
其中亮度电平E’y和色差电平E’Cb和E’Cb分别是CCIR 601 定义的参数。由于E’y的范围是0~1,E’Cb和E’Cb的范围是-0.5~+0.5,因此Y、Cb和Cr的最大值必须要达到255。于是RGBYCbCr之间的转换关系需要按照下面的方法计算。
从RGB转换成YCbCr
YCbCr(256级)分量可直接从用8bit表示的RGB分量计算得到: Y=0.299R+0.587G+0.114B Cb=-0.1687R-0.3313G+0.5B+128 Cr=0.5R-0.4187G-0.0813B+128
但是,并不是所有图像文件格式都按照R0,G0,B0,……,Rn,Gn,Bn的次序存储样本数据,因此在RGB文件转换成JFIF文件时需要首先验证RGB的次序。
从YCbCr转换成RGB
22
RGB分量可直接从YCbCr(256级)分量计算得到: R=Y+1.402(Cr-128)
G=Y-0.34414(Cb-128)-0.71414(Cr-128) B=Y+1.772(Cb-128)
在JFIF文件格式中,图像样本的存放顺序是从左到右和从上到下。因此JFIF文件中的第一个图像样本是图像左上角的样本。[5] 2.6.2. JPEG文件格式
JPEG文件大体上可以分成一下两个部分:标记码(Tag)和加压缩数据。标记码由两个字节构成,其前一个字节是固定值0xFF,每个标记之前还可以添加数目不限的0xFF填充字节(fill byte)。标记码部分给出了JPEG图像的所以信息(有点类似于BMP中的头信息,但要复杂得多),如图像的宽、高、Huffman表、量化表等。标记码有很多,但绝大多数的JPEG文件只包含以下几种:
SOI 0xD8 图像开始,可作为JPEG格式的判据(JFIF还需要APP0的配合) APP0 0xE0 JFIF应用数据块,APP0是JPEG保留给Application所使用的标记码,而JFIF将文件的相关信息定义在此标记中。
APPn 0xE1~0xEF 其他的应用数据块(n,1~15) DQT 0xDB 量化表 SOF0 0xC0 帧开始
DHT 0xC4 哈夫曼(Huffman)表 SOS 0xDA 扫描线开始 EOI 0xD9 图像结束 JPEG文件由下面的8个部分组成: a)图像开始SOI(Start of Image) b)APP0标记(Marker) 1)APP0长度(length)
2字节,表示APP0标记码长度,不包括前两个字节0xFF与0xE0; 2)标识符(identifier)
5字节,JFIF识别码0x4A,0x46,0x49,0X46,0x00; 3)版本号(version)
23