JPEG图像解码与离散余弦变换详解


4. DQT,Define Quantization Table,定义量化表
序号 1 2 3 4 5 6 用途 标记代码 DQT 数据长度 第一个量化表精度及编号 第一个量量化表表项 量化表 n 精度及编号(可选) 量化表 n 表项(可选) 字节数 2 2 1 64(量化表精度为 8 位) 128(精度为 16 位) 1 64(精度为 8 位)或 128(精度为 16 位) 内容 固定值 0xFFDB DQT 中序号 2-6 字段总长度(不包括标记代码的 2 个字节) 高 4 位:精度,0:8 位;1:16 位 低 4 位:编号 该量化表中 64 个量化值 和量化表 1 一样。可以在一个 DQT 字段中出现多个量化 表 (最多可出现 4 个)
同上
7.SOS,Start of Scan,扫描开始 12 字节
序号 1 2 3 4 5 6 7 8 9 10 用途 标记代码 SOS 数据长度 颜色分量数 颜色分量 1 的编号 颜色分量 1 所使用直流/交流系数 表号 颜色分量 2 的编号 颜色分量 2 直流/交流系数表号 颜色分量 3 的编号 颜色分量 3 直流/交流系数表号 压缩图像数据开始标识 字节数 2 2 1 1 1 1 1 1 1 3 内容 固定值 0xFFDA SOS 中 2-10 字段的总长度(不包括标记代码的 2 个字节) JFIF 中使用 YCbCr,故这里颜色分量数恒为 3 第一种颜色分量的编号 高 4 位:标记该颜色直流分量使用的哈夫曼树编号 低 4 位:标记该颜色交流分量使用的哈夫曼树编号 第二种颜色分量的编号 高 4 位:标记该颜色直流分量使用的哈夫曼树编号 低 4 位:标记该颜色交流分量使用的哈夫曼树编号 第三种颜色分量的编号 高 4 位:标记该颜色直流分量使用的哈夫曼树编号 低 4 位:标记该颜色交流分量使用的哈夫曼树编号 固定值 0x003F00
JPEG 图像解码与离散余弦变换详解
潘斌斌 摘 要:本文通过一个例子,用具体的数据详细描述一幅 JPEG 格式图像文件的构成,获取 JPEG 图像的各个属性的方法,建立哈夫曼码表并对其进行解码。详细解释了编解码需用到的离散余弦变换 的原理。 关键词:JPEG DCT 离散余弦变换 图像解码
1. 概述
下面介绍各个常用标记代码的组成以及表示的意义[5]。
1. SOI,Start of Image,图像开始
序号 1 用途 标记代码 字节 2 内容 固定值 0xFFD8
2. APP0,Application0,应用程序保留标记 0
序 号 1 2 3 4 5 6 7 8 9 10 用途 标记代码 APP0 数据长度 标识符 版本号 图像横向和纵向的密度单位 图像横向的密度 图像纵向的密度 缩略图水平像素数目 缩略图垂直像素数目 缩略图 RGB 位图数据 (可有可无) 字节 2 2 5 2 1 2 2 1 1 不定 内容 固定值 0xFFE0 APP0 中序号 2-10 字段的总长度(不包括标记代码的 2 个字节) 固定值 0x4A 0x46 0x49 0x46 0x00,也就是字符串“JFIF0” 一般是 0x0101 或者是 0x0102,代表 JFIF 的版本号 1.1 或 1.2 0x00:无单位;0x01:点数/英寸;0x02:点数/厘米 图像横向的密度 图像纵向的密度 若没有缩略图,该值为 0 若没有缩略图,该值为 0 缩略图 RGB 位图数据。如无微缩图像(这种情况更常见),则“缩略图水平像素 数目”和“缩略图垂直像素数目”的值均为 0。
5. SOF0,Start of Frame,帧图像开始
序号 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 用途 标记代码 SOF0 数据长度 图像像素精度 图像高度 图像宽度 颜色分量数 颜色分量 1 的编号 颜色分量 1 水平/垂直采样因子 颜色分量 1 使用的量化表 颜色分量 2 的编号 颜色分量 2 水平/垂直采样因子 颜色分量 3 使用的量化表 颜色分量 3 的编号 颜色分量 3 水平/垂直采样因子 颜色分量 3 使用的量化表 字节数 2 2 1 2 2 1 1 1 1 1 1 1 1 1 1 内容 固定值 0xFFC0 APP0 中序号 2-10 字段的总长度(不包括标记代码的 2 个字节) 每个像素单个颜色分量数据样本的位数,通常为 8 位(0x08) 图像高度(单位:像素) 图像宽度(单位:像素) 而 JFIF 中使用 YCbCr,故这里颜色分量数恒为 0x03 第一种颜色分量的编号 高 4 位:水平采样因子 低 4 位:垂直采样因子 当前分量使用的量化表的编号(在 DQT 中定义的编号) 第二种颜色分量的序号 高 4 位:水平采样因子 低 4 位:垂直采样因子 当前分量使用的量化表的编号(在 DQT 中定义的编号) 第三种颜色分量的序号 高 4 位:水平采样因子 低 4 位:垂直采样因子 当前分量使用的量化表的编号(在 DQT 中定义的编号)
6. DHT,Define Huffman Table,定义哈夫曼表
序号 1 2 3 4 5 6 7 8 6 7 8 6 7 8 用途 标记代码 DHT 数据长度 第 1 个哈夫曼表的编号及类型 第 1 个哈夫曼表不同长度的码字数量 第 1 个哈夫曼表的所有码字 第 2 个哈夫曼表的编号及类型 第 2 个哈夫曼表不同长度的码字数量 第 2 个哈夫曼表的所有码字 第 3 个哈夫曼表的编号及类型 第 3 个哈夫曼表不同长度的码字数量 第 3 个哈夫曼表的所有码字 第 4 个哈夫曼表的编号及类型 第 4 个哈夫曼表不同长度的码字数量 第 4 个哈夫曼表的所有码字 字节数 2 2 1 16 该表的码 字总数 1 16 码字总数 1 16 码字总数 1 16 码字总数 内容 固定值 0xFFC4 DHT 中序号 2-10 字段的总长度(不包括标记代码的 2 个字节) 高 4 位:哈夫曼类型,0:DC 直流;1:AC 交流 低 4 位:哈夫曼表编号(0 号用于 Y 分量,1 号用于 CbCr 分量)。 第 1 个字节是该哈夫曼表中 1 位长度码字的数目,第 2 个字节是 2 位 长度码字的数目,以此类推。最后一个是 16 位位长度码字的数目。 第 1 个字节表示该哈夫曼表第一个码字,第 2 个字节表示该哈夫曼表 第 2 个码字,以此类推。
序号 1 用途 标记代码 字节数 2 内容 固定值 0xFFD9
3.依据哈夫曼表建立哈夫曼树
JPEG 使用哈夫曼编码,解码时先要建立哈夫曼树。以 FFC4 标记代码的内容就是哈夫曼表。以该例 从 0xB1 到 0xD1 字节的直流 0 号哈夫曼表为例进行说明。标记代码之后,001F 表示该哈夫曼表占 0x1F 字节(从 0xB3 到 0xD1)。紧接着的 00 代表是 0 号(Y 分量)直流哈夫曼码表,之后的 16 的字节分别表示 1 到 16 位长度的码字的个数(最长的码字不能超过 16 位)。再接着是码字权值。 本例子中,直流 0 号哈夫曼表 1 到 16 位长度的码字的个数分别是 00 01 05 01 01 01 01 01 01 00 00 00 00 00 00 00 表示在该哈夫曼树中, 有 0 个 1 位的码字,1 个 2 位的码字,5 个 3 位的码字,1 个 4 位的码字, 1 个 5 位的码字,1 个 6 位的码字,1 个 7 位的码字,1 个 8 位的码字,1 个 9 位的码字,0 个 10 到 16 位的码字。 第一个码字的值规定为 0。若第一个码字位数为 1 位,码字为二进制 0; 若第一个码字的位数为 2, 第一个码字为二进制 00,以此类推。在该例中,没有 1 位码字,所以第一个码字是 2 位的,码字为 00。 从第二个码字开始,若与之前码字位数相同,则从前面的码字加 1。位数不同则在前面的码字加 1, 再在后面添加若干个 0,数目为与前一个码字的位数差。该例中,第二个码字是 3 位的,之前的码字 是 2 位的,添加 3-2=1 个 0。所以从 00 的基础上加 1 是 01,再添加 1 个 0,所以第二个码字为 010。 以此为推。 再接着下来的 16 进制字符是 00 01 02 03 04 05 06 07 08 09 0A 0B,依次表示的是上面各个码 字的权值。总共有 1+5+1+1+1+1+1+1=12 个。即第一个码字权值为 00,第二个码字权值是 01,以此类 推。 所以得出直流 0 号哈夫曼表为
因为具有很高的压缩率以及很低的图像质量损耗,JPEG 在计算机、网络、相机、手机等涉及到静 态的图像存储传输中,成为目前世界上使用得最为广泛的一种图像格式[1]。 JPEG 文件压缩编解码算法的主要计算步骤如下图所示:
2.解析 JPEG 文件的各项属性,为后续解码作好准备。
国际标准组织(ISO)和国际电话电报咨询委员会(CCITT)于 1992 年制定了 JPEG 的相关标准 。该 标准定义了几种不同的压缩方法与编码方法。其中最常见的是用离散余弦编码的有损压缩。 在计算机中,最常用的描述 JPEG 文件构成的标准称为 JFIF (JPEG File Interchange Format)。 JPEG 文件主要由图像特征信息和压缩数据两部分组成。本节以一幅 Windows XP 自带的画图工具生成 16×16 的图像为例,用 UltraEdit 软件读出图像的字节组成,详细解析遵循该标准而生成的一幅图像。
1. 2. 3. 4. 5. 6. 7. 8. SOI(0xFFD8) APP0(0xFFE0) + 缩略图,像素密度等信息(+ 多个 APPn(0xFFEn)]可选) 多个 DQT(0xFFDB) +定义量化表. SOF0(0xFFC0)+各颜色分量图像位数,采样因子和所使用的量化表编号 多个 DHT(0xFFC4) + 定义哈夫曼码表 SOS(0xFFDA)+各颜色分量所使用的哈夫曼表编号 JPEG 图像压缩数据流 EOI(0xFFD9)
[3] [2]
在 JPEG 图像特征信息中,标记码标记了每种图像特征信息的开始,由两个字节构成。第一个都字 节是 0xFF(若遇连续多个 0xFF 可以理解为一个 0xFF)。常用的标记有 SOI(0xFFD8)、APP0(0xFFE0)、 DQT(0xFFDB)、SOF0(0xFFC0)、DHT(0xFFC4)、SOS(0xFFDA)、0xFFD9)。在一个完整的标记码之后, 是该标记码对应的图像特征信息。JFIF 格式的 JPEG 文件(*.jpg)的一般顺序[4]为:
合集下载

jpeg 编码原理

jpeg 编码原理

jpeg 编码原理
JPEG编码的原理主要涉及到三个关键步骤:色彩空间的转换、离散余弦变
换(DCT)和量化。

以下是这些步骤的详细解释:
1. 色彩空间的转换:JPEG编码首先将图像从RGB色彩空间转换为YCbCr
色彩空间。

RGB色彩空间由红色、绿色和蓝色三个分量组成,而YCbCr色彩空间由亮度(Y)分量和两个色度(Cb和Cr)分量组成。

这种转换是基
于人眼对亮度的敏感度高于对色彩敏感度的特性,因此对亮度的变化比对色彩的变化更为敏感。

2. 离散余弦变换(DCT):转换后的图像数据会进行离散余弦变换,这是一种将图像数据从空间域转换到频域的过程。

DCT变换的目的是将图像中的
数据集中到少数的几个系数上,这样可以去除图像中的空间冗余,便于后续的压缩。

变换后的图像能量集中在左上角,其中低频部分集中于左上角,高频部分集中于右下角。

3. 量化:这一步是为了去除数据中的冗余,并且减少表示图像所需的数据量。

JPEG采用基于人眼视觉特性的量化方法,对DCT变换后的系数进行量化。

量化过程会减少数据的精度,但不会丢失原始图像的信息。

经过上述三个步骤后,JPEG编码通过使用熵编码进一步压缩数据,最后生
成JPEG格式的图像文件。

以上是JPEG编码的基本原理,通过理解这些原
理,有助于更好地理解JPEG压缩的优缺点,以及如何优化JPEG图像的压缩效果。

jpeg编码原理

jpeg编码原理

jpeg编码原理JPEG编码原理JPEG是一种常用的图像压缩格式,它可以将图像压缩至原始大小的1/10或更小,而且不会影响图像的质量。

JPEG编码原理是基于离散余弦变换(DCT)和量化技术。

1. 离散余弦变换(DCT)在JPEG编码中,图像被分成8x8个像素块,每个块都被视为一个矩阵。

通过对这些矩阵进行离散余弦变换(DCT),可以将每个块转换为一组频率系数。

离散余弦变换是一种将时域信号转换为频域信号的方法。

在JPEG中,每个块都被视为一个时域信号,并通过离散余弦变换将其转换为频域信号。

这些频率系数表示了该块中各种不同频率的分量。

2. 量化在经过DCT后,得到了每个块的频率系数。

但是由于人眼对于高频细节的感知能力较差,因此在JPEG编码中采用了量化技术来减少高频分量化就是将每个频率系数除以一个固定值,并四舍五入取整。

由于高频分量较大,因此它们被量化后会变得更小,从而减少了数据量。

3. 压缩在经过DCT和量化后,每个块都被转换为一组频率系数,并且高频分量已经被减少。

这些频率系数可以被进一步压缩,从而减少文件大小。

JPEG编码使用了霍夫曼编码技术来压缩这些频率系数。

霍夫曼编码是一种无损压缩技术,它可以将出现频率较高的符号用较短的编码表示,从而减少数据量。

4. 解压在解压JPEG图像时,首先需要将霍夫曼编码还原为频率系数。

然后对这些频率系数进行逆量化和逆离散余弦变换(IDCT),从而恢复原始图像。

逆量化是将每个频率系数乘以一个固定值,并四舍五入取整。

逆离散余弦变换是将每个块的频率系数转换回时域信号,从而恢复原始图像。

JPEG编码原理是基于离散余弦变换和量化技术的。

通过DCT将图像分解为一组频率系数,并采用量化技术减少高频分量,然后使用霍夫曼编码压缩这些频率系数。

在解压时,需要将霍夫曼编码还原为频率系数,并进行逆量化和逆离散余弦变换来恢复原始图像。

jpeg编码标准

jpeg编码标准

jpeg编码标准JPEG,全称为Joint Photographic Experts Group,是一种广泛应用于图像压缩的标准。

其名称包含三个主要部分:“联合”,“图像”,“专家组”。

专家组是一个处理特殊问题的专家团队,而JPEG 就是这些专家的研究成果被采纳并应用于图像处理的结果。

JPEG编码是一种有损压缩方式,它通过去除图像中的冗余数据来减小文件大小,同时尽可能地保留图像的重要信息,使得图像在查看或打印时仍然具有良好的质量。

这种压缩方式被广泛用于数字图像和视频的传输,包括网络传输和存储等。

二、JPEG编码标准的主要组成部分1. 离散余弦变换(DCT):JPEG使用了一种特殊的变换方法,称为离散余弦变换。

这种方法将图像从空间域转换到频率域,从而实现了数据的压缩。

通过离散余弦变换,我们可以将高频率部分(也就是图像中的噪声和细节)移除,只保留低频率部分(也就是图像的主要信息)。

2. 量化:在离散余弦变换之后,我们需要对变换后的系数进行量化。

量化过程是将变换后的系数映射到一个有限的离散值集合中。

这个过程有助于进一步减小文件大小,同时尽可能保留图像的质量。

3. 熵编码:熵编码是一种用于减少文件大小的额外技术。

JPEG 使用了一种称为游程编码的技术来进行熵编码,它能够进一步减少文件中的冗余数据。

4. 霍夫曼编码:在JPEG标准中,霍夫曼编码被用于进一步优化文件大小。

它是一种无损的压缩技术,通过创建短的、重复的符号的平均值来减小文件大小。

三、JPEG编码的应用场景JPEG编码广泛应用于数字图像和视频处理领域,如网络传输、存储、打印和显示等。

它尤其适用于需要大量图像或视频数据的场景,如社交媒体、在线购物、视频会议等。

四、JPEG编码的优缺点优点:1. 高压缩率:JPEG编码能够有效地减小图像和视频的文件大小,而不会显著影响图像的质量。

这使得它成为了一种非常实用的技术,尤其是在需要大量数据传输和存储的场景中。

JPEG图像格式详解

JPEG图像格式详解

JPEG图像格式详解JPEG压缩简介-------------1.色彩模型JPEG的图片使用的是YCrCb颜色模型,而不是计算机上最常用的RGB.关于色彩模型,这里不多阐述.只是说明,YCrCb模型更适合图形压缩.因为人眼对图片上的亮度Y的变化远比色度C的变化敏感.我们完全可以每个点保存一个8bit的亮度值,每2x2个点保存一个Cr Cb值,而图象在肉眼中的感觉不会起太大的变化.所以,原来用RGB模型,4个点需要4x3=12字节.而现在仅需要4+2=6字节;平均每个点占12bit.当然JPEG格式里允许每个点的C值都记录下来;不过MPEG里都是按12bit一个点来存放的,我们简写为YUV12.[R G B]->[Y Cb Cr]转换-------------------------(R,G,B都是8bit unsigned)|Y||0.2990.5870.114||R||0||Cb|=|-0.1687-0.33130.5|*|G|+|128||Cr||0.5-0.4187-0.0813||B||128|Y=0.299*R+0.587*G+0.114*B(亮度)Cb=-0.1687*R-0.3313*G+0.5*B+128Cr=0.5*R-0.4187*G-0.0813*B+128[Y,Cb,Cr]->[R,G,B]转换-------------------------R=Y+ 1.402*(Cr-128)G=Y-0.34414*(Cb-128)-0.71414*(Cr-128)B=Y+ 1.772*(Cb-128)一般,C值(包括Cb Cr)应该是一个有符号的数字,但这里被处理过了,方法是加上了128.JPEG里的数据都是无符号8bit的.2.DCT(离散余弦变换)JPEG里,要对数据压缩,先要做一次DCT变换.DCT变换的原理,涉及到数学知识,这里我们不必深究.反正和傅立叶变换(学过高数的都知道)是差不多了.经过个点为一个单位处理的.所以如果原始图片的长宽不是8的倍数,都需要先补成8的倍数,好一块块的处理.另外,记得刚才我说的Cr Cb都是2x2记录一次吗?所以大多数情况,是要补成16x16的整数块.按从左到右,从上到下的次序排列(和我们写字的次序一样).JPEG里是对Y Cr Cb分别做DCT变换的.这里进行DCT变换的Y,Cr,Cb值的范围都是-128~127.(Y被减去128)JPEG编码时使用的是Forward DCT(FDCT)解码时使用的Inverse DCT(IDCT)下面给出公式:FDCT:772*x+12*y+1F(u,v)=alpha(u)*alpha(v)*sum sum f(x,y)*cos(-------*u*PI)*cos(------*v*PI)x=0y=01616u,v=0,1,...,7{1/sqrt(8)(u==0)alpha(u)={{1/2(u!=0)IDCT:772*x+12*y+1f(x,y)=sum sum alpha(u)*alpha(v)*F(u,v)*cos(-------*u*PI)*cos(------*v*PI) u=0v=01616x,y=0,1 (7)这个步骤很花时间,另外有种AA&N优化算法,大家可以去inet自己找一下.在Intel主页上可以找到AA&N IDCT的MMX优化代码.(Intel主页上的代码,输入数据为12.4的定点数,输入矩阵需要转置90度)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,35,36,48,49,57,58,62,63这样数列里的相邻点在图片上也是相邻的了.4.量化对于前面得到的64个空间频率振幅值,我们将对它们作幅度分层量化操作.方法就是分别除以量化表里对应值并四舍五入.for(i=0;i<=63;i++)vector[i]=(int)(vector[i]/quantization_table[i]+0.5)下面有张JPEG标准量化表.(按上面同样的弯曲次序排列)1611101624405161121214192658605514131624405769561417222951878062182237566810910377243555648110411392496478871031211201017292959811210010399这张表依据心理视觉阀制作,对8bit的亮度和色度的图象的处理效果不错.当然我们可以使用任意的量化表.量化表是定义在jpeg的DQT标记后.一般为Y值定义一个,为C值定义一个.量化表是控制JPEG压缩比的关键.这个步骤除掉了一些高频量,损失了很高细节.但事实上人眼对高空间频率远没有低频敏感.所以处理后的视觉损失很小.另一个重要原因是所有的图片的点与点之间会有一个色彩过渡的过程.大量的图象信息被包含在低空间频率中.经过量化处理后,在高空间频率段,将出现大量连续的零.注意,量化后的数据有可能超过2byte有符号整数的处理范围.5.0RLE编码现在我们矢量中有许多连续的0.我们可以使用RLE来压缩掉这些0.这里我们将跳过第一个矢量(后面将解释为什么)因为它的编码比较特别.假设有一组矢量(64个的后63个)是57,45,0,0,0,0,23,0,-30,-16,0,0,1,0,0,0,0,0,0,0,..,0经过RLE压缩后就是(0,57);(0,45);(4,23);(1,-30);(0,-16);(2,1);EOBEOB是一个结束标记,表示后面都是0了.实际上,我们用(0,0)表示EOB但是,如果这组数字不以0结束,那么就不需要EOB.另外需要注意的是,由于后面huffman编码的要求,每组数字前一个表示0的数量的必须是4bit,就是说,只能是0~15,所以,如果有这么一组数字:我们实际这样编码:(0,57);(15,0)(2,3);(4,2);(15,0)(15,0)(1,895),(0,0)注意(15,0)表示了16个连续的0.6.huffman编码为了提高储存效率,JPEG里并不直接保存数值,而是将数值按位数分成16组:数值组实际保存值00--1,110,1-3,-2,2,3200,01,10,11-7,-6,-5,-4,4,5,6,73000,001,010,011,100,101,110,111 -15,..,-8,8,..,1540000,..,0111,1000,..,1111-31,..,-16,16,..,31500000,..,01111,10000,..,11111-63,..,-32,32,..,636.-127,..,-64,64,..,1277.-255,..,-128,128,..,2558.-511,..,-256,256,..,5119.-1023,..,-512,512,..,102310.-2047,..,-1024,1024,..,204711.-4095,..,-2048,2048,..,409512.-8191,..,-4096,4096,..,819113.-16383,..,-8192,8192,..,1638314.-32767,..,-16384,16384,..,3276715.还是来看前面的例子:(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(06对应111000为查表所得.对应成1~16bits的不定长数值.出现频率高的数字小于8bits,频率低的大于8bits,从而使整个的数据长度降低,关于huffman压缩算法,请查阅相关资料)69=(4,5)---1111111110011001(注:69=4*16+5=0x45)21=(1,5)---111111101104=(0,4)---101133=(2,1)---110110=EOB=(0,0)---1010那么最后对于前面的例子表示的63个系数(记得我们将第一个跳过了吗?)按位流写入JPG文件中就是这样的: 1110001110011110001011011111111110011001101111111111011000001 1011011111011110107.DC的编码-----------记得刚才我们跳过了每组64个数据的第一个吧,DC就是指的这个数字(后面63个简称AC)代入前面的FDCT公式可以得到c(0,0)77DC=F(0,0)=---------*sum sum f(x,y)*cos0*cos0其中c(0,0)=1/24x=0y=0177=---*sum sum f(x,y)8x=0y=0即一块图象样本的平均值.就是说,它包含了原始8x8图象块里的很多能量.(通常会得到一个很大的数值)JPEG的作者指出连续块的DC率之间有很紧密的联系,因此他们决定对8x8块的DC值的差别进行编码.(Y,Cb,Cr分别有自己的DC)Diff=DC(i)-DC(i-1)所以这一块的DC(i)就是:DC(i)=DC(i-1)+DiffJPG从0开始对DC编码,所以DC(0)=0.然后再将当前Diff值加在上一个值上得到当前值.下面再来看看上面那个例子:(记住我们保存的DC是和上一块DC的差值Diff)例如上面例子中,Diff是-511,就编码成如果9的Huffman编码是1111110(在JPG文件中,一般有两个Huffman表,一个是DC用,一个是AC用)那么在JPG文件中,DC的2进制表示为1111110000000000它将放在63个AC的前面,上面上个例子的最终BIT流如下:1111110000000000111000111001111000101101111111111001100110111 1111111011000001101101111101111010解码过程简述-------------8.一个数据单元Y的解码(其余类同)--------------------------------在整个图片解码的开始,你需要先初始化DC值为0.1)先解码DC:a)取得一个Huffman码(使用Huffman DC表)b)Huffman解码,看看后面的数据位数Nc)取得N位,计算Diff值d)DC+=Diffe)写入DC值:"vector[0]=DC"2)解码63个AC:-------循环处理每个AC直到EOB或者处理到64个ACa)取得一个Huffman码(使用Huffman AC表)b)Huffman解码,得到(前面0数量,组号)[记住:如果是(0,0)就是EOB了]c)取得N位(组号)计算ACd)写入相应数量的0e)接下来写入AC-----------------下一步的解码------------上一步我们得到了64个矢量.下面我们还需要做一些解码工作:2)重排列64个矢量到8x8的块中3)对8x8的块作IDCT对8x8块的(Y,Cb,Cr)重复上面的操作[Huffman解码,步骤1),2),3)]4)将所有的8bit数加上1285)转换YCbCr到RGB9.JPG文件(Byte级)里怎样组织图片信息-----------------------------------注意JPEG/JFIF文件格式使用Motorola格式,而不是Intel格式,就是说,如果是一个字的话,高字节在前,低字节在后.JPG文件是由一个个段(segments)构成的.每个段长度<=65535.每个段从一个标记字开始.标记字都是0xff打头的,以非0字节和0xFF结束.例如'FFDA','FFC4','FFC0'.每个标记有它特定意义,这是由第2字节指明的.例如,SOS(Start Of Scan='FFDA')指明了你应该开始解码.另一个标记DQT(Define Quantization Table=0xFFDB)就是说它后面有64字节的quantization表在处理JPG文件时,如果你碰到一个0xFF,而它后面的字节不是0,并且这个字节没有意义.那么你遇到的0xFF字节必须被忽略.(一些JPG里,常用用0xFF做某些填充用途)如果你在做huffman编码时碰巧产生了一个0xFF,那么就用0xFF0x00代替.就是说在jpeg图形解码时碰到FF00就把它当作FF处理.另外在huffman编码区域结束时,碰到几个bit没有用的时候,应该用1去填充.然后后面跟FF.下面是几个重要的标记--------------------SOI=Start Of Image='FFD8'这个标记只在文件开始出现一次EOI=End Of Image='FFD9'JPG文件都以FFD9结束RSTi=FFDi(i=0..7)[RST0=FFD0,RST7=FFD7]=复位标记通常穿插在数据流里,我想是担心JPG解码出问题吧(应该配合DRI使用).RST将Huffman的解码数据流复位.DC也重新从0开始计(SOS---RST0---RST1--RST2--......--RST6---RST7--RST0--...)10.标记-------下面是必须处理的标记SOF0=Start Of Frame0=FFC0SOS=Start Of Scan=FFDAAPP0=it's the marker used to identify a JPG file which uses the JFIF specification=FFE0COM=Comment=FFFEDNL=Define Number of Lines=FFDCDRI=Define Restart Interval=FFDDDQT=Define Quantization Table=FFDBDHT=Define Huffman Table=FFC411.JPG文件中Haffman表的储存-----------------------------JPEG里定义了一张表来描述Haffman树.定义在DHT标记后面.注意:Haffman代码的长度限制在16bit内.一般一个JPG文件里会有2类Haffman表:一个用于DC一个用于AC(实际有4个表,亮度的DC,AC两个,色度的DC,AC两个)这张表是这样保存的:1)16字节:第i字节表示了i位长的Huffman代码的个数(i=1到16)2)这表的长度(字节数)=这16个数字之和现在你可以想象这张表怎么存放的吧?对应字节就是对应Haffman代码等价数字.我不多解释,这需要你先了解Haffman算法.这里只举一个例子:Haffman表的表头是0,2,3,1,1,1,0,1,0,0,0,0,0,0,0,0就是说长度为1的代码没有长度为2的代码为0001长度为3的代码是100101110长度为4的代码是1110长度为5的代码是11110长度为6的代码是111110长度为7的代码没有(如果有一个的话应该是1111110)长度为8的代码是11111100.....如果表下面的数据是4557291723253428就是说45=0057=0129=10017=10123=110等等...如果你懂Haffman编码,这些不难理解12.采样系数-----------下面讲解的都是真彩JPG的解码,灰度JPG的解码很简单,因为图形中只有亮度信息.而彩色图形由(Y,Cr,Cb)构成,前面提到过,Y通常是每点采样一次,而Cr, Cb一般是2x2点采样一次,当然也有的JPG是逐点采样,或者每两点采样(横向两点,纵向一点)采样系数均被定义成对比最高采样系数的相对值.一般情况(即:Y逐点采样,Cr Cb每2x2点一次)下:Y有最高的采样率,横向采样系数HY=2纵向采样系数VY=2;Cb的横向采样系数HCb=1,纵向采样系数VCb=1;同样HCr=1,VCr=1在Jpeg里,8x8个原始数据,经过RLE,Huffman编码后的一串数据流称为一个Data Unit(DU)JPG里按DU为单位的编码次序如下:1)for(counter_y=1;counter_y<=VY;counter_y++)for(counter_x=1;counter_x<=HY;counter_x++){对Y的Data Unit编码}2)for(counter_y=1;counter_y<=VCb;counter_y++)for(counter_x=1;counter_x<=HCb;counter_x++){对Cb的Data Unit编码}3)for(counter_y=1;counter_y<=VCr;counter_y++)for(counter_x=1;counter_x<=HCr;counter_x++){对Cr的Data Unit编码}按我上面的例子:(HY=2,VY=2;HCb=VCb=1,HCr,VCr=1)就是这样一个次序YDU,YDU,YDU,YDU,CbDU,CrDU这些就描述了一块16x16的图形.16x16=(Hmax*8x Vmax*8)这里Hmax=HY=2一个(Hmax*8,Vmax*8)的块被称作MCU(Minimun Coded Unix)前面例子中一个MCU=YDU,YDU,YDU,YDU,CbDU,CrDU如果HY=1,VY=1HCb=1,VCb=1HCr=1,VCr=1这样(Hmax=1,Vmax=1),MCU只有8x8大,MCU=YDU,CbDU,CrDU对于灰度JPG,MCU只有一个DU(MCU=YDU)JPG文件里,图象的每个组成部分的采样系数定义在SOF0(FFC0)标记后13.简单说一下JPG文件的解码-------------------------解码程序先从JPG文件中读出采样系数,这样就知道了MCU的大小,算出整个图象有几个MCU.解码程序再循环逐个对MCU解码,一直到检查到EOI标记.对于每个MCU,按正规的次序解出每个DU,然后组合,转换成(R,G,B)就OK了附:JPEG文件格式~~~~~~~~~~~~~~~~-文件头(2bytes):$ff,$d8(SOI)(JPEG文件标识)-任意数量的段,见后面-文件结束(2bytes):$ff,$d9(EOI)段的格式:~~~~~~~~~-header(4bytes):$ff段标识n段的类型(1byte)sh,sl该段长度,包括这两个字节,但是不包括前面的$ff和n.注意:长度不是intel次序,而是Motorola的,高字节在前,低字节在后!-该段的内容,最多65533字节注意:-有一些无参数的段(下面那些前面注明星号的)这些段没有长度描述(而且没有内容),只有$ff和类型字节.-段之间无论有多少$ff都是合法的,必须被忽略掉.段的类型:*TEM=$01可以忽略掉SOF0=$c0帧开始(baseline JPEG),细节附后SOF1=$c1ditoSOF2=$c2通常不支持SOF3=$c3通常不支持SOF5=$c5通常不支持SOF6=$c6通常不支持SOF7=$c7通常不支持SOF9=$c9arithmetic编码(Huffman的一种扩展算法),通常不支持SOF10=$ca通常不支持SOF11=$cb通常不支持SOF13=$cd通常不支持SOF14=$ce通常不支持SOF14=$ce通常不支持SOF15=$cf通常不支持DHT=$c4定义Huffman Table,细节附后JPG=$c8未定义/保留(引起解码错误)DAC=$cc定义Arithmetic Table,通常不支持*RST0=$d0RSTn用于resync,通常被忽略*RST1=$d1*RST2=$d2*RST3=$d3*RST4=$d4*RST5=$d5*RST6=$d6*RST7=$d7SOI=$d8图片开始EOI=$d9图片结束SOS=$da扫描行开始,细节附后DQT=$db定义Quantization Table,细节附后DNL=$dc通常不支持,忽略DRI=$dd定义重新开始间隔,细节附后DHP=$de忽略(跳过)EXP=$df忽略(跳过)APP0=$e0JFIF APP0segment marker(细节略)APP15=$ef忽略JPG0=$f0忽略(跳过)JPG13=$fd忽略(跳过)COM=$fe注释,细节附后其它的段类型都保留必须跳过SOF0:Start Of Frame0:~~~~~~~~~~~~~~~~~~~~~~~-$ff,$c0(SOF0)-长度(高字节,低字节),8+components*3-数据精度(1byte)每个样本位数,通常是8(大多数软件不支持12和16) -图片高度(高字节,低字节),如果不支持DNL就必须>0-图片宽度(高字节,低字节),如果不支持DNL就必须>0-components数量(1byte),灰度图是1,YCbCr/YIQ彩色图是3,CMYK彩色图是4-每个component:3bytes-component id(1=Y,2=Cb,3=Cr,4=I,5=Q)-采样系数(bit0-3vert.,4-7hor.)-quantization table号DRI:Define Restart Interval:~~~~~~~~~~~~~~~~~~~~~~~~~~~~~-$ff,$dd(DRI)-长度(高字节,低字节),必须是4-MCU块的单元中的重新开始间隔(高字节,低字节),意思是说,每n个MCU块就有一个RSTn标记.第一个标记是RST0,然后是RST1等,RST7后再从RST0重复DQT:Define Quantization Table:~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~-$ff,$db(DQT)-长度(高字节,低字节)-QT信息(1byte):bit0..3:QT号(0..3,否则错误)bit 4..7:QT精度,0=8bit,否则16bit-n字节的QT,n=64*(精度+1)备注:-一个单独的DQT段可以包含多个QT,每个都有自己的信息字节-当精度=1(16bit),每个字都是高位在前低位在后DAC:Define Arithmetic Table:~~~~~~~~~~~~~~~~~~~~~~~~~~~~~法律原因,现在的软件不支持arithmetic编码.不能生产使用arithmetic编码的JPEG文件DHT:Define Huffman Table:~~~~~~~~~~~~~~~~~~~~~~~~~~-$ff,$c4(DHT)-长度(高字节,低字节)-HT信息(1byte):bit0..3:HT号(0..3,否则错误)bit4:HT类型,0=DC table,1=AC tablebit 5..7:必须是0-16bytes:长度是 1..16代码的符号数.这16个数的和应该<=256 -n bytes:一个包含了按递增次序代码长度排列的符号表(n=代码总数)备注:-一个单独的DHT段可以包含多个HT,每个都有自己的信息字节COM:注释:~~~~~~~~~~-$ff,$fe(COM)-注释长度(高字节,低字节)=L+2-注释为长度为L的字符流SOS:Start Of Scan:~~~~~~~~~~~~~~~~~~~-$ff,$da(SOS)-长度(高字节,低字节),必须是6+2*(扫描行内组件的数量)-扫描行内组件的数量(1byte),必须>=1,<=4(否则是错的)通常是3 -每个组件:2bytes-component id(1=Y,2=Cb,3=Cr,4=I,5=Q),见SOF0-使用的Huffman表:-bit0..3:AC table(0..3)-bit 4..7:DC table(0..3)-忽略3bytes(???)备注:-图片数据(一个个扫描行)紧接着SOS段.。

jpeg编解码原理

jpeg编解码原理

jpeg编解码原理JPEG编解码原理JPEG是一种常用的图像压缩格式,它的编解码原理是基于离散余弦变换(Discrete Cosine Transform,DCT)和量化。

在JPEG编码过程中,图像首先被分割成8x8的小块,每个小块进行DCT变换,将空间域的数据转换为频域的数据。

这个过程可以看作是将图像分解为一系列频率成分,每个小块的DCT系数表示该频率成分的强度和位置。

接下来,对DCT系数进行量化。

量化是指将连续的数值变为离散的数值,以减少需要存储或传输的数据量。

量化过程中,需要使用一个量化矩阵,它是由JPEG标准规定的。

量化后的结果是一个系数矩阵,其中大部分系数都为0,只有少量的系数保留,这些系数通常是在高频区域,因为人眼对高频信息不太敏感。

量化后的系数矩阵被编码为比特流,这个过程称为熵编码。

熵编码使用的是一种自适应的算法,它可以根据数据的统计特征来选择不同的编码方式,以达到更好的压缩效果。

在JPEG解码过程中,先将比特流解码为系数矩阵,然后将系数矩阵进行反量化和反DCT变换,得到恢复后的图像。

解码过程中也需要使用相同的量化矩阵和熵编码算法来还原原始的系数矩阵。

总结一下,JPEG编解码原理可以分为以下几个步骤:1.将图像分割成8x8的小块;2.对每个小块进行DCT变换,得到系数矩阵;3.对系数矩阵进行量化,得到量化后的系数矩阵;4.将量化后的系数矩阵编码为比特流,使用熵编码算法;5.解码时,将比特流解码为系数矩阵;6.对系数矩阵进行反量化和反DCT变换,得到恢复后的图像。

JPEG编解码原理的核心是DCT和量化。

DCT可以将空间域的数据转换为频域的数据,量化可以将连续的数值变为离散的数值,以减少需要存储或传输的数据量。

这两个过程的相互作用,使得JPEG 可以在保持图像质量的前提下,大大减少图像的存储和传输开销。

dct变换及在jpeg编码中的具体应用 -回复

dct变换及在jpeg编码中的具体应用 -回复

dct变换及在jpeg编码中的具体应用-回复DCT(离散余弦变换)是一种数学变换,常用于信号处理、图像处理和数据压缩中。

在JPEG编码中,DCT的应用非常重要,它能够将图像信息压缩成更小的文件大小,同时保持较高的图像质量。

本文将详细介绍DCT 变换及其在JPEG编码中的具体应用。

一、什么是DCT变换?离散余弦变换(DCT)是一种数学变换,能将输入信号转换为一组频率分量。

与傅里叶变换相似,DCT也能将时间域信号转换为频域信号,但它的输出是实数而不是复数。

DCT变换的主要思想是将一个N维的输入信号分解为一组N个不同频率的余弦函数的线性组合。

这样的分解使得大部分信号能够用较少的系数来表示。

DCT的数学公式如下:X_k = \sum^{N-1}_{n=0}x_n \cdot\cos\left(\frac{(2n+1)k\pi}{2N}\right), \quad k=0,1,...,N-1其中,x_n是输入信号的采样值,N是采样点数,X_k是输出的DCT系数。

二、DCT在JPEG编码中的应用1. 颜色空间转换JPEG编码中的第一步是将RGB颜色空间转换为亮度-色度(YCbCr)颜色空间。

这主要是因为人眼对亮度的感知比色度更敏感。

YCbCr颜色空间将图像分为亮度(Y)和两个色度(Cb和Cr)分量,其中亮度分量负责传输图像的明暗信息,而色度分量负责传输颜色信息。

转换的过程中,通过DCT变换可以提取出亮度和色度分量的频域信息,减少了图像的冗余信息,从而减小了数据量。

2. 分块压缩JPEG编码将图像分为若干个8x8像素的小块,对每个小块进行独立的DCT变换。

这样做的原因是图像中的局部区域往往具有较强的相关性,8x8分块的做法可以充分利用这种相关性。

对每个8x8分块进行DCT变换后,通过量化将DCT系数进行舍入。

这样,高频分量的数值变得较小,可以被更多的抹除掉,进一步减小数据量。

低频分量可以保留较大的数值,以保证图像的主要特征。

jpeg 原理

jpeg 原理
JPEG是一种常见的图像压缩格式,其原理是基于离散余弦变
换(Discrete Cosine Transform,DCT)和量化技术。

JPEG压缩流程如下:
1. 分块:将图像划分为8×8的小块。

2. 颜色空间转换:对于彩色图像,将RGB颜色空间转换为亮
度和色度分量,即将彩色图像表示为YCbCr颜色空间。

3. 离散余弦变换(DCT):对每个8×8的小块进行DCT变换,将空间域的像素值转换为频域的系数。

DCT变换的目的是将
图像的大部分信息压缩到较低频率的系数中。

4. 量化:对DCT变换后的系数进行量化操作。

量化矩阵中的
每个元素都可以控制相应频率的系数的精度,使用较大的量化矩阵元素值可以得到更高的压缩比,但可能会引入更多的失真。

5. 哈夫曼编码:将量化后的系数重新排列为一维向量,并采用哈夫曼编码来对系数进行编码。

由于较低频率的系数出现的概率较高,因此可以通过使用可变长度编码来进一步提高压缩效率。

JPEG的解压缩流程与压缩相反:
1. 解码:对哈夫曼编码进行解码,得到量化后的系数向量。

2. 逆量化:将量化后的系数通过量化矩阵的逆操作进行还原。

3. 逆离散余弦变换(IDCT):对逆量化后的系数进行逆DCT 变换,将频域的系数还原为空间域的像素值。

4. 逆颜色空间转换:对于彩色图像,将亮度和色度分量转换回RGB颜色空间。

通过JPEG的压缩和解压缩过程,可以显著减小图像文件的大小,但同时也会引入一定的失真。

为了控制失真,JPEG提供了不同的压缩质量参数,用户可以根据需求选择适当的压缩质量来平衡文件大小和图像质量。

JPEG编码解码流程

JPEG 图片压缩算法流程详解薛晓利JPEG 是Joi nt Photogra phic Exports Group 的英文缩写,中文称之为联合图像专家小组。

该小组隶属于ISO 国际标准化组织,主要负责定制静态数字图像的编码方法, 即所谓的JPEG算法。

JPEG 专家组开发了两种基本的压缩算法、两种熵编码方法、四种编码模式。

如下所示:压缩算法:(1) 有损的离散余弦变换 DCT ( Discrete Cosine Transform ) (2) 无损的预测压缩技术; 熵编码方法:(1) Huffman 编码; (2) 算术编码; 编码模式:(1) (2)递增;(3) (4)11个步骤:颜色模式转换、采样、分块、离 DC 系数的差分脉冲调制编码、 DC 系数的系数的中间格式计算、熵编码。

下面,将一(1)颜色模式转换JPEG 采用的是YCrCb 颜色空间,而 进行压缩,首先需要进行颜色空间的转换。

色度和饱和度(也有人将Cb,Cr 两者统称为色度),三者通常以 Y,U,V 来表示,即用 U 代表 Cb ,用V 代表Cr 。

RGB 和YCrCb 之间的转换关系如下所基于DCT 的顺序模式:编码、解码通过一次扫描完成;基于DCT 的渐进模式:编码、解码需要多次扫描完成,扫描效果由粗到精, 逐级无损模式:基于 DPCM ,保证解码后完全精确恢复到原图像采样值; 层次模式:图像在多个空间分辨率中进行编码,可以根据需要只对低分辨率数据 做解码,放弃高分辨率信息;在实际应用中,JPEG 图像编码算法使用的大多是离散余弦变换、 Huffman 编码、顺序编码模式。

这样的方式,被人们称为JPEG 的基本系统。

这里介绍的JPEG 编码算法的流程, 也是针对基本系统而言。

基本系统的JPEG 压缩编码算法一共分为 散余弦变换(DCT )、Zigzag 扫描排序、量化、 中间格式计算、AC 系数的游程长度编码、 一介绍这11个步骤的详细原理和计算过程。

JPEG图像压缩与编码解析

JPEG图像压缩与编码解析
JPEG(Joint Photographic Experts Group)压缩格式,以其易于使用、压缩率高而著称,是应用最为广泛的一种图像压缩格式。

JPEG压缩
算法把图像分为内容和质量两个维度来进行压缩。

下面将详细论述JPEG
图像编码与解码的基本原理。

1.JPEG图像编码过程
(1)空间域转换
空间域转换是将原始图像由空间域变换成更加节省存储空间的频域。

JPEG压缩采用的是离散余弦变换(DCT)这种空间域转换方法,它可以把
图像表示成一系列正交基函数的线性组合,每一个函数表示的是对应的图
像量化值。

利用DCT将一幅图像分成8×8(也有可能是16×16)大小的块,每一个块由64(或者256)个相互独立的像素构成,被称为DCT子块。

(2)频段选择
JPEG图像压缩算法采用频段选择的原则,根据图像中的特征,把空
间域转换之后的低频分量即低频信息传��有损,而只把高频分量即高频
信息传递以达到保留重要信息的目的,在JPEG中,特征的保留按照“从
重要的到不重要的”的顺序进行。

(3)变换。

JPEG图像压缩编码原理及格式


图像灰度级gray(x,y)
JPEG中的余弦变换
对pic2进行DCT:
pic2
DCT:高频系数很小
JPEG中的余弦变换
pic3:
pic3
图像灰度级gray(x,y)
JPEG中的余弦变换
对pic3进行DCT:
pic3
DCT:高频系数较大一些
JPEG中的余弦变换
在JPEG进行余弦变换后,由8x8像素图像块获 得8x8个频域系数C(u,v),如果存储64个频域系 数,则图像数据并不能压缩。
(DCT系数x1000)
DCT:高频系数很小
JPEG中的余弦变换
对pic0进行DCT:
pic0
DCT:高频系数很小
JPEG中的余弦变换
pic1:
pic1
图像灰度级gray(x,y)
JPEG中的余弦变换
对pic1进行DCT:
pic1
DCT:高频系数很小
JPEG中的余弦变换
pic2:
pic2
0
0
0
0
0
0
2
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
0
0
0
0
0
0
0
{74,33,31,-1,-2,-1,2,-2,-2,2,0,0,……,0};
由于大量的0连续排列,可以用“行程编码(Run Length Coding)”方法节约存贮空间。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档