1.4.3排列 DCT 结果
DCT 将一个 8x8 的数组变换成另一个 8x8 的数组。 但是内存里所有数据都是线 形存放的, 如果我们一行行的存放这 64 个数字, 每行的结尾的点和下行开始的点就 没有什么关系, 所以 JPEG 规定按如下次序整理 64 个数字。
0, 1, 5, 6,14,15,27,28,
2, 4, 7,13,16,26,29,42,
3, 8,12,17,25,30,41,43,
9,11,18,24,31,40,44,53,
10,19,23,32,39,45,52,54,
20,22,33,38,46,51,55,60,
21,34,37,47,50,56,59,61,
35,36,48,49,57,58,62,63
这样数列里的相邻点在图片上也是相邻的了。
1.4.4 量化
对于前面得到的 64 个空间频率振幅值, 我们将对它们作幅度分层量化,操作方法就是分别除以量化表里对应值并四舍五入。
for i=1:64
dc(i)=round(B(i)/q(i));
end
其中B(i)为经过余弦变换后的系数,q(i)为量化表数据;round()是进行四舍五入的数学函数。
下面两张 JPEG 标准量化表。 (按上面同样的弯曲次序排列)
这两张表依据心理视觉阀制作, 对 8bit 的亮度和色度的图象的处理效果不错。
当然我们可以使用任意的量化表。 量化表是定义在 jpeg 的 DQT 标记后。 一般为 Y 值定义一个, 为 C 值定义一个。
量化表是控制 JPEG 压缩比的关键。 这个步骤除掉了一些高频量, 损失了很高细节。 但事实上人眼对高空间频率远没有低频敏感。所以处理后的视觉损失很小。另一个重要原因是所有的图片的点与点之间会有一个色彩过渡的过程。 大量的图象信息被包含在低空间频率中。 经过量化处理后, 在高空间频率段, 将出现大量连续的零。
注意, 量化后的数据有可能超过 2 byte 有符号整数的处理范围。
1.4.5 huffman 编码
为了提高储存效率, JPEG 里并不直接保存数值, 而是将数值按位数分成 16 组:
数值 组 实际保存值
0 0 -
-1,1 1 0,1
-3,-2,2,3 2 00,01,10,11
-7,-6,-5,-4,4,5,6,7 3 000,001,010,011,100,101,110,111
-15,..,-8,8,..,15 4 0000,..,0111,1000,..,1111
-31,..,-16,16,..,31 5 00000,..,01111,10000,..,11111
-63,..,-32,32,..,63 6 ……
-127,..,-64,64,..,127 7 ……
-255,..,-128,128,..,255 8 ……
-511,..,-256,256,..,511 9 ……
-1023,..,-512,512,..,1023 10 ……
-2047,..,-1024,1024,..,2047 11 ……
-4095,..,-2048,2048,..,4095 12 ……
-8191,..,-4096,4096,..,8191 13 ……
-16383,..,-8192,8192,..,16383 14 ……
-32767,..,-16384,16384,..,32767 15 ……
DC 的编码
例如:
(0,57) ; (0,45) ; (4,23) ; (1,-30) ; (0,-8) ; (2,1) ; (0,0)
只处理每对数右边的那个:
57 是第 6 组的, 实际保存值为 111001 , 所以被编码为 (6,111001)
45 , 同样的操作, 编码为 (6,101101)
23 -> (5,10111)
-30 -> (5,00001)
-8 -> (4,0111)
1 -> (1,1)
前面的那串数字就变成了:
(0,6), 111001 ; (0,6), 101101 ; (4,5), 10111; (1,5), 00001; (0,4) , 0111 ; (2,1), 1 ; (0,0)
括号里的数值正好合成一个字节。 后面被编码的数字表示范围是 -32767…32767。合成的字节里, 高 4 位是前续 0 的个数, 低 4 位描述了后面数字的位数。
继续刚才的例子, 如果 06 的 huffman 编码为 111000
69 = (4,5) --- 1111111110011001
21 = (1,5) --- 11111110110
4 = (0,4) --- 1011
33 = (2,1) --- 11011
0 = EOB = (0,0) --- 1010
等号左边的是表示相应中间符号在huffman表中的位置。
那么最后对于前面的例子表示的 63 个系数按位流写入 JPEG 文件中就是这样的:
111000 111001 111000 101101 1111111110011001 10111 11111110110 00001
1011 0111 11011 1 1010
记得刚才我们跳过了每组 64 个数据的第一个吧, DC 就是指的这个数字 (后面 63 个简称 AC) 代入前面的 FDCT 公式可以得到
即一块图象样本的平均值。 就是说, 它包含了原始 8x8 图象块里的很多能量。 (通常会得到一个很大的数值)
JPEG 的作者指出连续块的 DC 率之间有很紧密的联系,因此他们决定对 8x8 块的DC 值的差别进行编码(Y, Cb, Cr 分别有自己的 DC)。
Diff = DC(i) - DC(i-1)
所以这一块的 DC(i) 就是: DC(i) = DC(i-1) + Diff
JPEG从 0 开始对 DC 编码, 所以 DC(0)=0。 然后再将当前 Diff 值加在上一个值上得到当前值。
1.5 可行性研究
1.5.1经济可行性
软件编码的耗费主要是人力和时间。最终的软件是个人或者团队的智慧结晶。智力成本的凝聚产生的无形资产是巨大的。图像在当今信息社会中扮演着举足轻重的角色,而其占用的资源又是海量的。在追求时间和空间的今天,研究图像压缩是切实可行的。
1.5.2 技术可行性
基于对图像编,解码的研究,对图像重新编码后,达到对数据的压缩,是完全可以实现的。本设计采用Vc++平台,通过颜色转换及采样、量化、游程编码,ZIGZAG扫描, 哈夫曼编码几个过程 实现对 图像的压缩。
1.5.3 运行可行性
本设计的最终编译成果是脱离Vc++环境的,可独立执行的exe 文档。
上一页 [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] ... 下一页 >>