文档详情

JPEG文件编码格式说明

野鹰
实名认证
店铺
PDF
1.34MB
约26页
文档ID:3044919
JPEG文件编码格式说明_第1页
1/26

1 JPEG 文件编码 方式 说明 ( Version 1.0) 由于个人水平有限,文档难免有许多不足或错误,欢迎各位对文档提出宝贵的意见和建议,如有任何疑问 访问 我的 博客 : 邮箱 联系 方式 一 、 JPEG 文件格式编码 理论介绍 1、 颜色模式转换 我们 知道, BMP 图片 的 编码是 基于 RGB 颜色空间 ( 即每一个像素都由 (R,G,B)三个分量构成) 进行 的 , 而 JPEG 采用的是 YCrCb 颜色空间, 即 每一个像素都由(Y,Cr,Cb)三个 分量构成 , 其中 Y 代表亮度, Cr,Cb 则代表色度和饱和度 (也有人将Cb,Cr 两者统称为色度 ) 三者通常以 Y,U,V 来表示,即用 U 代表 Cb,用 V 代表 Cr要想对 BMP 图片进行压缩,首先需要进行颜色空间的转换 RGB 和 YCrCb 之间的转换关系如下所示: 0 .2 9 9 0 .5 8 7 0 .1 1 40 .5 0 0 0 .4 1 8 7 0 .0 8 1 30 .1 6 8 7 0 .3 3 1 3 0 .5YRC r GC b B                           在实际 的 jpeg 编码 中, 为了 方便数据的存储和计算 ,对于 上述得到的 Y,Cr,Cb值, 均 加上 128,使其变为 8 位的无符号整数。

即 0 .2 9 9 0 .5 8 7 0 .1 1 4 00 .5 0 0 0 .4 1 8 7 0 .0 8 1 3 1 2 80 .1 6 8 7 0 .3 3 1 3 0 .5 1 2 8YRC r GC b B                                      至此 , 我们将图片的 颜色空间 由 RGB 空间转化 成 YCrCb 空间 注 : 对于灰度图 来说,只有 Y 分量 ,没有 Cr, Cb 分量 (或者 说均为 0) 因为 对于灰度图来说, 每一个 像素的 R 值, G 值, B 值 都是 相同的 不妨设 R 值,G 值, B 值均为 a, 代入上述第一个矩阵方程,可以得到 Y=a, Cr=0, Cb=0 2、采样 研究发现 ,人眼对亮度分量更为敏感,对色度分量的数据相对不敏感,因此,我们可以认为 Y 分量要比 Cr,Cb 分量重要的多 , 所以对于色度分量,可以只取一部分,以增加压缩比在 BMP 图片中, RGB 三个分量各采用一个字节进行采样,也就是我们常听到的 RGB888 的模式;而 JPEG 图片中,通常采用两种采样方式:YUV411 和 YUV422, 其含义是 YUV 三个分量的数据取样比例。

举例来说,如果 Y取四个数据单元,即水平取样因子 Hy 乘以垂直取样因子 Vy 的值为 4,而 U 和 V各取一个数据单元,即 Hu× Vu=1,Hv× Vv=1那么这种部分取样就称为 YUV411在 2x2 的单元中,本应分别有 4 个 Y, 4 个 U, 4 个 V 值,用 12 个字节进行存储经过 4:1:1 采样处理后,每个单元中的值分别有 4 个 Y、 1 个 U、 1 个 V,只要用 6 个字节就可以存储了)这样的采样方式,虽然损失了一定的精度但也在人眼不太察觉到的范围内减小了数据的存储量当然, JPEG 格式里面也允许将每个点 的 U,V 值都记录下来; 填充 2 在 Jpeg 里 ,将 每 8x8 个原始数据 称为 一个 数据单元 (DU),因此 ,如果 原始 图片的 长宽 不 是 8 的 倍数,则需要进行填充, 必须 使其满足是 8 的 倍数 又 由于采样方式的影响 但 若 采样因子为 4: 1: 1, 即( 2*2):( 1*1):( 1*1), Y 分量的水平和垂直方向都是每 2 个像素采样 2 次; Cr 分量和 Cb 分量的水平和垂直方向都是每 2 个像素采样 1 次。

则 需要额外满足另一条件 在 编码中, 将 若干 个 数据单元 记为 一个 MCU, jpeg 以 MCU 为单位进行编码 对于 采样因子为 4: 1: 1 的 情况, 每 4 个 完整 的 数据 单元记为 一个 MCU, 其中 Y 分量有 64× 4 个采样点 ; Cr分量和 Cb 分量各自只有 64× 1 个采样点 因此 需要 对原始 图片 进行填充,使其长宽 满足 是 8× 2 的 倍数 而对于 采样因子为 1: 1: 1 的情况 , 只需 使其长宽满足是 8× 1 的倍数 例 : 对于 一幅 32*35 的图像 , 若 采样因子为 4: 1: 1, 则 需 将其填充为 32*48 的图像 , 若采样因子为 1: 1: 1,则需将其填充为 32*40 的图像, 相反 ,在解码过程中,对于超出原图高度和宽度的数据应该 直接舍去 如 上 图,每一个小方格 都是 8× 8 的数据,即为 一个数据单元 对于采样因子为 4: 1: 1 的情况, 对应于 左图,其中红色部分为一个 MCU,包含 4 个 数据 单元 在数据流中, MCU 的顺序是 MCU1, MCU2, MCU3, MCU4,MCU5, MCU6,(对于 左上 图 来说, 顺序 为 从 上到下,从左到右) , 红色 部分为 MCU1。

每个 MCU 有 4 个数据单元如果以 MCU1 说明 MCU 数据的次序, 如上述 左图所示 , 红色 部分为 MCU1, 由于有 4 个 数据单元, 对于 Y 来说, 每个 数据单元每 1 个像素采样 1 次 从而 可以得到 4 块 Y 分量,记为 Y1_DU,Y2_DU,Y3_DU,Y4_DU,对于 Cr 来 说 ,由于 每 2 个像素采样 1 次 从而由 MCU1 采样只能得到一块 Cr 分量 ,记为 Cr_DU, 对于 Cb 来说 , 与 Cr 类似,不再赘述 因此,由于 MCU1 得到 的 采样 数据 按 顺序排列为 : Y1_DU, Y2_DU, Y3_DU, Y4_DU, CrDU, CbDU 从而对于 得到 各个分量 的 数量 有 如下 Y 分量 : 3 Cr 分量 : Cb 分量 : 对于采样因子为 1: 1: 1 的情况, 对应于右 图, 其中红色部分为一个 MCU,包含 1 个数据单元在数据流中, MCU 的顺序是 MCU1, MCU2, MCU3, MCU4,MCU5, MCU6, ….., MCU20 红色部分为 MCU1 每个 MCU 有 1 个数据单元。

如果以 MCU1 说明 MCU 数据的次序,则依次为 YDU, CrDU, CbDU 从而对于得到各个分量的 数量 有 如下 Y 分量 : Cr 分量 : Cb 分量 : 4 解码过程 中, 先从 JPG 文件中读出采样系数 ,这样就知道了 MCU 的大小 ,算出整个图象有几个 MCU.解码程序再循环逐个对 MCU 解码 ,一直到检查到 EOI 标记 .对于每个 MCU,按正规的次序解出每个 DU,然后组合 ,转换成 (R,G,B) 3、 分块 由于后面的 DCT 变换是是对 8x8 的子块进行处理的,因此,在进行 DCT 变换之前必须把源图象数据进行分块 (在 第 2 部分 实际上 已经采用 了 分块 的分析方式,即将 8x8 的 数据块记为数据单元 DU) 源图象中每点的 3 个分量 (Y,Cr,Cb)是交替出现的, 所以 先要把这 3 个分量分开,存放到 3 张表中去然后由左及右,由上到下依次读取 8x8 的子块,存放在长度为 64 的表中,即可以进行 DCT 变换注意,编码时,程序从源数据中读取一个 8x8 的数据块后,进行 DCT 变换,量化,编码,然后再读取、处理下一个 8*8 的数据块。

由于 在第 2 步(采样 ) 中 已经 将 长宽 补成 了 8 的倍数 , 使其可以 很方便 的 进行一块块的处理 4、离散余弦变换 DCT 分块 之后 , 还必须将每个数值减去 128,然后一一带入 DCT 变换公式,即可达到 DCT 变换的目的 (图像的数据值必须减去 128,是因为 DCT 公式所接受的数字范围是 -128 到 127 之间 ) DCT( Discrete Cosine Transform,离散余弦变换),是码率压缩中常用的一种变换编码方法任何连续的实对称函数的傅里叶变换中只含有余弦项,因此,余弦变换同傅里叶变换一样具有明确的物理意义 DCT 是先将整体图像分成 N*N 的像素块,然后针对 N*N 的像素块逐一进行 DCT 操作需要提醒的是, JPEG 的编码过程需要进行正向离散余弦变换,而解码过程则需要反向离散余弦变换 8*8 数据 块 正向离散余弦变换计算公式: 8 1 8 1002 ( 2 1 ) ( 2 1 )( , ) c ( ) c ( ) ( , ) c o s s i n2 * 8 2 * 88 * 8xyx u y vF u v u v f x y   1 , , 0( ) , ( ) 21uvc u c v    , 其 他8*8 数据块 反向离散余弦变换计算公式: 5 8 1 8 1002 ( 2 1 ) ( 2 1 )( , ) ( , ) c ( ) c ( ) c o s s i n2 * 8 2 * 88 * 8uvx u y vf x y F u v u v   8*8 的二维像素块经过 DCT 操作之后,就得到了 8*8 的变换系数矩阵。

这些系数,都有具体的物理含义,例如, u=0, v=0 时的 F( 0,0)是原来的 64 个数据的均值,相当于直流分量,也有人称之为 DC 系数或者直流系数随着 u, v 的增加,相另外的 63 个系数则代表了水平空间频率和垂直空间频率分量(高频分量)的大小,多半是一些接近于 0 的正负浮点数,我们 称 之 为交流系数 AC DCT 变换后的 8*8 的系数矩阵中,低频分量 集中在 矩阵 的左上角 高频成分则集中在右下角 这里,我们暂时先只考虑水平方向上一行数据( 8 个像素)的情况时的 DCT变换,从而来说明其物理意义如下图所示: 原始的图像信号(最左边的波形)经过 DCT 变换之后变成了 8 个波,其中第一个波为直流成分,其余 7 个为交流成分 可见图像信号被分解为直流成分和一些从低频到高频的各种余弦成分而DCT 系数只表示了该种成分所占原图像信号的份额大小显然,恢复图像信息可以表示为下面的式子: F(n) = C(n)*E(n),这里, E(n)是一个基底, C(n)是 DCT 系数, F(n)则是图像信号;如果考虑垂直方向的变化,那就需要一个二维的基底大学里面的信号处理,傅里叶变换等课程上也讲过,任何信号都可以被分解为基波和不同幅度的谐波的组合,而 DCT 变换的物理意义也正是如此。

由于大多数图像的高频分量比较小,相应的图像高频分量的 DCT 系数经常接近于 0,再加上高频分量中只包含了图像的细微的细节变化信息,而人眼对这种高 频成分的失真不太敏感,所以,可以考虑将这一些高频成分予以抛弃,从而降低需要传输的数据量这样一来,传送 DCT 变换系数的所需要的编码长度要远远小于传送图像像素的编码长度到达接收端之后通过反离散余弦变换就可以得到原来的数据,虽然这么做存在一定的失真,但人眼是可接受的,而且对这种微小的变换是不敏感的 6 对于 上述图片的每个格子,均 分别 进行 8× 8 的 DCT 变换 , 5、 量化 图。

下载提示
相似文档
正为您匹配相似的精品文档