JPEG介绍

合集下载

JPEG编码介绍

JPEG编码介绍

JPEG编码介绍JPEG是一个比较成熟的图像有损压缩格式,图片经过转化变为JPEG图像后,仅会丢失人眼不易察觉的一些细节,在图像的清晰与大小中找到了一个很好的平衡点。

JPEG是Joint Photographic Exports Group的英文缩写,中文称之为联合图像专家小组。

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

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

在实际应用中,JPEG图像编码算法使用的大多是离散余弦变换、Huffman编码、顺序编码模式,被人们称为JPEG的基本系统。

下面将依次介绍JPEG编码的主要过程。

(1)颜色模式转换JPEG采用的是YCrCb颜色空间,而BMP采用的是RGB颜色空间,要想对BMP图片进行压缩,首先需要进行颜色空间的转换。

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

RGB和YCrCb之间的转换关系如下所示:Y = 0.299R+0.587G+0.114BCb = -0.1687R-0.3313G+0.5B+128Cr = 0.5R=0.418G-0.0813B+128一般来说,C 值 (包括 Cb Cr) 应该是一个有符号的数字, 但这里通过加上128,使其变为8位的无符号整数,从而方便数据的存储和计算。

R = Y+1.402(Cr-128)G = Y-0.34414(Cb-128)-0.71414(Cr-128)B = Y+1.772(Cb-128)(2)采样研究发现,人眼对亮度变换的敏感度要比对色彩变换的敏感度高出很多。

因此,我们可以认为Y分量要比Cb,Cr分量重要的多。

在BMP图片中,RGB三个分量各采用一个字节进行采样;而JPEG图片中,通常采用两种采样方式:YUV411和YUV422,它们所代表的意义是Y,Cb,Cr三个分量的数据取样比例一般是4:1:1或者4:2:2(4:1:1含义就是:在2x2的单元中,本应分别有4个Y,4个U,4个V值,用12个字节进行存储。

JPEG、MPEG标准简介

JPEG、MPEG标准简介

7 5
也 就是说 , 图像 的主要 信 息包 含在 Y 分 量 中. 因而 , 的量化级 别 比 U、 的量 化级 别 多一些 , Y V 即对 Y 分量 采
用 细量化 , U、 采 用粗量 化 , 对 V 进一 步提 高压 缩 比. GB格 式 与 YUV 格式 之 间的转 化方 式是 : R
— —
( tn1 o i a po )



我 们都 知 道 , 始 的 彩 色 图像 , 般 由红 、 、 三 原 一 绿 蓝 种基 色 的 图像 组 成. 而人 的视 觉 系统对 彩 色 色度 的感 然 觉 和 亮 度 的敏 感 性 是 不 同 的 , 这 里 , 先 介 绍 一 下 在 首 YUV 格 式. 这 种 格 式 中 , 分 量 的 物 理 含 义 就 是 亮 在 Y
o ec paef aJ r ah l c n n s
f re c o ah 8 8bo k * lc
— — DCT — — n. n . — 口 r—
度 , 和 V 分 量代 表 了色 差信 号 . U Y分 量包 含 了灰度 图
的所 有 信息 , 只用 Y 分量 就 完 全 能表 示 出一 幅灰 度 图 , 当同时 考虑 U、 分量 时 , V 就能够 表示 彩 色信 息 , 样一 这 来 , 同一种 表示 方法 可 以很方 便 的在灰 度 和彩 色 图之 用
方 便 .
[ 键 词 ] 多 媒 体 ; 缩 ; PEG ; PEG 关 压 J M
[ 章 编 号 ] 1 7 — 0 7 2 0 ) 2 0 7 — 3 [ 图 分 类 号 ] TP3 1 [ 献 标 识 t 3 A 文 6 22 2 ( 0 6 0 —0 40 中 9 文 i !  ̄

JPEG文件格式

JPEG文件格式
15 0 -1 0 0 0 0 0
-2 -1 0 0 0 0 0 0
-1 -1 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 0 0 0 0 0 0 0
我们可以看到,量化后出现了大量的0,这பைடு நூலகம்结果很有利于我们进行下一步的数据压缩的。至于为什么是8x8的大小,待会你就知道了。
我们还是使用那刚才那个包含很多0的量化后的8x8的数据块来说明。我们把块内剩余的63个数据用行程编码来编码。经过行程编码后的数据的格式是:(x,y)。x表示的是从当前位置开始有多少个连续的零,y表示这些连续的0的后面的第一个非零的数是多少。但是为了解决存储的问题和进行进一步的压缩。最后的压缩格式变为:(x,y)z。xy占有一个字节的长度。z的长度不固定,需要根据y的值来判断。x仍代表从当前位置开始有几个连续的零,但是因为x只能占有四位的长度,也就是它的最大值是15,所以,当多于16个连续的零的时候。会用一个字节的(15,0)来代替前面的16个0,然后继续编码(注意:这时候没有z部分)。当块结束或者当前块后面剩余的都是零的时候,就用(0,0)即EOB代替(同样也是没有z部分)。前面说到z的长度不固定,需要根据y的值来判断,这是为什么呢?简单的来说,z的长度是不一定的,在1~15的范围内。Y的作用简单的来说表示的是z的二进制位数(1~15),也正好是4位二进制的值能够表示的。然后,把xy合成的一个字节单独提取出来,利用DHT里面的Huffman表来进行编码。这样,编码的长度又能够被压缩了。
7 9 11 15 26 44 50 31
9 11 19 28 34 56 52 0

jepg和jepg2000编码方法 -回复

jepg和jepg2000编码方法 -回复

jepg和jepg2000编码方法-回复JPEG(Joint Photographic Experts Group)和JPEG2000编码方法是用于图像压缩和存储的两种常见技术。

JPEG是一种基于离散余弦变换(DCT)的有损压缩方法,而JPEG2000是一种基于小波变换的有损/无损混合压缩技术。

本文将详细介绍这两种编码方法的原理、步骤和特点。

第一部分:JPEG编码方法JPEG是一种广泛应用于图像压缩的方法。

它采用的离散余弦变换(DCT)的基本思想是将图像转换为频域表示,然后通过量化和编码过程来实现压缩。

下面是JPEG编码方法的详细步骤:1. 图像预处理:JPEG编码方法通常以8×8的图像块为单位进行处理。

首先,将图像分割成8×8的图像块,并对每个块进行预处理操作。

这包括颜色空间转换(如RGB到YUV),亮度调整(亮度分量即Y值)和色度调整(色度分量即U和V值)。

2. DCT变换:对预处理后的每个8×8图像块应用DCT变换。

DCT变换是一种将空域图像转换为频域表示的方法。

它将图像块分解成一系列的频率分量,其中低频分量代表图像的整体结构,高频分量代表图像的细节信息。

3. 量化:对DCT变换得到的频域系数进行量化。

量化是指将连续的频域系数转换为离散的符号表示,以减少数据量并实现压缩。

在JPEG中,使用的是一种均匀量化表,通过将频域系数除以对应的量化步长并取整,将系数进行量化。

量化步长越大,丢失的信息越多,压缩比也就越高。

4. 编码:对量化后的频域系数进行熵编码。

熵编码是一种无损压缩算法,可以进一步减小数据量。

在JPEG中,使用的是哈夫曼编码,其中频率较高的符号用较短的码字表示,频率较低的符号用较长的码字表示,从而实现数据的高效编码。

第二部分:JPEG2000编码方法JPEG2000是一种基于小波变换的新一代图像编码方法。

与JPEG不同的是,JPEG2000不仅可以实现有损压缩,还可以进行无损压缩。

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文件格式标准,读者可以更好地掌握该标准的使用和应用。

1. 简介JPEG,全称为Joint Photographic Experts Group,是一种常用的图像压缩格式。

该格式广泛应用于数字摄影、图像处理、图像存储等领域。

通过对图像进行有损压缩,JPEG可以在保持图片质量的同时减小文件大小,提高传输和存储的效率。

2. 历史背景JPEG文件格式标准最早于1992年发布。

它是由以同名组织命名的Joint Photographic Experts Group制定的。

该标准的制定旨在寻找一种通用的图像压缩方法,以适应当时数字图像处理领域的发展需求。

3. 文件结构JPEG文件由多个部分组成,其中最重要的是图像数据和文件头。

3.1 文件头JPEG文件头以SOI(Start of Image)标记开始,用于标识该文件是一个JPEG图像。

紧接着是APP(Application Segment)标记,用于存储一些可选信息,如图像的创建软件、版本等。

3.2 图像数据JPEG文件中的图像数据以帧(Frame)的形式存在。

一个JPEG文件可以包含多个帧,每个帧可以包含多个扫描(Scan)。

每个扫描由若干个组成,每个组包含了一组相邻的像素。

4. 压缩算法JPEG文件格式通过压缩算法实现对图像的有损压缩。

JPEG压缩算法主要包含两个过程:离散余弦变换(DCT)和量化。

4.1 离散余弦变换(DCT)DCT是一种常用的信号处理技术,用于将时域信号变换为频域信号。

在JPEG压缩中,DCT被用于将原始图像信号转换为一组频谱系数。

4.2 量化量化是JPEG压缩中的另一个重要步骤,它将DCT变换后的频谱系数进行量化处理。

通过设定不同的量化表,可以实现不同程度的压缩效果。

5. 应用领域JPEG文件格式在众多领域都有广泛应用,特别是数字摄影、图像处理和图像存储等方面。

jpg编码

jpg编码

一、JPEG文件格式介绍JPEG文件使用的数据存储方式有多种。

最常用的格式称为JPEG文件交换格式(JPEG File Interchange Format,JFIF)。

而JPEG文件大体上可以分成两个部分:标记码(Tag)和压缩数据。

标记码由两个字节构成,其前一个字节是固定值0xFF,后一个字节则根据不同意义有不同数值。

在每个标记码之前还可以添加数目不限的无意义的0xFF填充,也就说连续的多个0xFF 可以被理解为一个0xFF,并表示一个标记码的开始。

而在一个完整的两字节的标记码后,就是该标记码对应的压缩数据流,记录了关于文件的诸种信息。

常用的标记有SOI、APP0、DQT、SOF0、DHT、DRI、SOS、EOI。

SOI,Start of Image,图像开始标记代码2字节固定值0xFFD8APP0,Application,应用程序保留标记0标记代码2字节固定值0xFFE0包含9个具体字段:①数据长度2字节①~⑨9个字段的总长度②标识符5字节固定值0x4A46494600,即字符串“JFIF0”③版本号2字节一般是0x0102,表示JFIF的版本号1.2④X和Y的密度单位1字节只有三个值可选i.0:无单位;1:点数/英寸;2:点数/厘米⑤X方向像素密度2字节取值范围未知⑥Y方向像素密度2字节取值范围未知⑦缩略图水平像素数目1字节取值范围未知⑧缩略图垂直像素数目1字节取值范围未知⑨缩略图RGB位图长度可能是3的倍数缩略图RGB位图数据本标记段可以包含图像的一个微缩版本,存为24位的RGB像素。

如果没有微缩图像(这种情况更常见),则字段⑦“缩略图水平像素数目”和字段⑧“缩略图垂直像素数目”的值均为0。

APPn,Application,应用程序保留标记n,其中n=1~15(任选)标记代码2字节固定值0xFFE1~0xFFF包含2个具体字段:①数据长度2字节①~②2个字段的总长度i.即不包括标记代码,但包括本字段②详细信息数据长度-2字节内容不定例如,Adobe Photoshop生成的JPEG图像中就用了APP1和APP13两个标记段分别存储了一幅图像的副本。

JPEG文件解码详解

JPEG文件解码详解

JPEG文件解码详解JPEG(Joint Photographic Experts Group)是联合图像专家小组的英文缩写。

它由国际电话与电报咨询委员会CCITT(The International Telegraph and Telep hone Consultative Committee)与国际标准化组织ISO于1986年联合成立的一个小组,负责制定静态数字图像的编码标准。

小组一直致力于标准化工作,开发研制出连续色调、多级灰度、静止图像的数字图像压缩编码方法,即JPEG算法。

JPEG算法被确定为国际通用标准,其适用范围广泛,除用于静态图像编码外,还推广到电视图像序列的帧内图像压缩。

而用JPEG算法压缩出来的静态图片文件称为JPEG文件,扩展名通常为*.jpg、*. jpe、*.jpeg。

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

具体如下:压缩算法:●有损的离散余弦变换(Discrete Cosine Transform,DCT);●无损的预测技术压缩。

数据编码方法:●哈夫曼编码;●算术编码;编码模式:●基于DCT顺序模式:编/解码通过一次扫描完成;●基于DCT递进模式:编/解码需要多次扫描完成,扫描效果从粗糙到精细,逐级递进;●无损模式:基于DPCM,保证解码后完全精确恢复到原图像采样值;●层次模式:图像在多个空间多种分辨率进行编码,可以根据需要只对低分辨率数据作解码,放弃高分辨率信息。

在实际应用中,JPEG图像使用的是离散余弦变换、哈夫曼编码、顺序模式。

JPEG压缩编码算法的主要计算步骤如下:(0) 8*8分块。

(1) 正向离散余弦变换(FDCT)。

(2) 量化(quantization)。

(3) Z字形编码(zigzag scan)。

(4) 使用差分脉冲编码调制(DPCM)对直流系数(DC)进行编码。

(5) 使用行程长度编码(RLE)对交流系数(AC)进行编码。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

JPEG压缩编码-解压缩算法框图
JPEG压缩编码算法的主要步骤
正向离散余弦变换(FDCT)。 量化(quantization)。 Z字形编码(zigzag scan)。 使用差分脉冲编码调制(differential pulse code modulation,DPCM)对直流系数(DC)进行编码。 使用行程长度编码(run-length encoding,RLE)对 交流系数(AC)进行编码。 熵编码
Results
786488 bytes
23116 bytes
Results
786488 bytes
33079 bytes
Results
786488 bytes
26614 bytes
Results
786488 bytes
25485 bytes
基于DCT的累进操作方式编码
顺序方式: 每个图象分量的编码一次扫描完成的; 累进方式: 图象分量编码要经过多次扫描才完成。 累进方式 第一次扫描只进行一次粗糙图象的扫描压缩, 以相 对于总的传输时间快得多的时间传输粗糙图象, 并 重建一帧质量较低的可识别图象; 在随后的扫描中 再对图象作较细的压缩, 这时只传递增加的信息,可 重建一幅质量提高一些的图象。这样不断累进, 直 到满意的图象为止。
下一个非 0 值的实际值

行程取值范围为1~15, 超过15时用扩展符 号1 (15, 0)来扩充, 63个AC系数最多增加 3个扩展符号1。编码结束时用(0,0)表示。
“尺寸”取值范围为0~10。 “幅值”用以表示非0的AC系数的值, 范围 为[-210, 210-1](最长10bit)。


对DC系数、AC系数中的符号1采用Huffman 表中的变长码编码(VLC),这里Huffman变长 码表必须作为JPEG编码器输入。 符号2用变长整数VLI码编码。即补码。

JPEG2000主要特点如下:
(1)高压缩率。与JPEG相比,可修复约30%的速率失真特性。 JPEG和JPEG2000在压缩率相同时, JPEG2000的信噪比 将提高30%左右; (2)无损压缩。预测编码作为对图像进行无损编码的成熟方法 被集成在JPEG2000中; (3)渐进传输。JPEG2000可实现以空间清晰度和信噪比为首 的各种可调节性,从而实现渐进传输,即具有“渐现”特性. (4)感兴趣区域压缩。JPEG2000 支持所谓的“感兴趣区域”。
JPEG 标准是一个适用范围广泛的通用标准。 它不仅仅适于静态图像的压缩,电视图像序列的帧 内图像的压缩编码也常常采用 JPEG 压缩标准。

2.1.1 JPEG标准
JPEG:离散余弦变换(Discrete Cosine Transform,DCT) JPEG2000:小波变换(Wavelet Transform)

3. Z字形编排
量化后的系数要重新编排,目的是为了增加连续的“0”系数 的个数,就是“0”的游程长度,方法是按照Z字形的式样编排,如 下图所示。这样就把一个8 * 8的矩阵变成一个1* 64的矢量,频 率较低的系数放在矢量的顶部。
4. 直流系数的编码 8 *8图像块经过DCT变换之后得到的DC直流系数有两个特点, 一是系数的数值比较大,二是相邻8 * 8图像块的DC系数值变化不 大(具有一定的相关性)。根据这个特点,JPEG算法使用了差分 脉冲调制编码(DPCM)技术,对相邻图像块之间量化DC系数的差值 (Delta)进行编码, Delta=DC(0, 0)i-DC(0, 0)i-1

AC系数熵编码的中间格式

AC系数熵编码的中间格式由两个符号组成: 符号1: (行程,尺寸) (RRRRSSSS)R/S 符号2: (幅值) AC coefficients
第一个字节 7 R 6 R 5 R 4 R 3 S 2 S 1 S 0 S
两个非 0 值间 连续零的个数 第二个字节
下一个非 0 值 需要的比特数
静态图像压缩编 码标准
-JPEG标准
2.1 静态图像压缩编码标准

JPEG 是由联合图像专家组( Joint Photographic Experts Group )开发的一种图像压缩标准。

JPEG 算法在 1992 年被确定为 JPEG 国际 标准,是国际上彩色、灰度、静止图像的第一个国 际标准。

亮度分量DC系数举例
亮度DC系数举例 编码步骤 DC(0,0)0 DC系数值 DC差值 中间符号 熵和幅度编码 150 150 (8,150) (111110,10010110) DC(0,0)1 155 5 (3,5) (100,101) DC(0,0)2 149 -6 (3,-6) (100,001) DC(0,0)3 152 3 (2,3) DC(0,0)4 144 -8 (4,-8)
(011,11) (101,0111)
Luminance AC coefficients
Luminance AC coefficients
Chrominance AC coefficients
亮度分量AC系数编码举例

若AC系数zz(11)~zz(29)都为0,zz(30)=3,中间 符号就为15/0、(3/2, 3)。
本章学习要求
● 1.掌握JPEG标准基本算法过程;
● 2.查资料,比较JPEG和JPEG2000标准。
15/0表示16个0值系数, (3/2,3)表示从此处开始到zz(30)有3个连续0值系数,
用2位表示zz(30)=3。
亮度符号(3/2,3)的输出代码为111110111 11
JPEG压缩效果评价
压缩效果(比特/象素) 0.25~0.50 0.50~0.75 0.75~1.5 1.2~2.0 质 量 中~好 好~很好 极好 与原始图象分不出来
均匀量化器
量化
量化是一个“多到一”的过程,失真原因 关键是找最小量化失真的量化器, JPEG采用线性均匀量化器, 定义为对64个DCT系数除以量化步长, 然后四舍五入取整: FQ(u, v)=Integer Round[F(u, v)/Q(u, v)] Q(u,v)是量化器步长,它是量化表的元素。量化表元素随DCT 系数的位置和彩色分量不同有不同的值,量化表尺寸为8×8 与64个变换系数一一对应。 这个量化表应由用户规定(JPEG给出参考值-见表3.1,3.2), 并 作为编码器的一个输入。
(3) 在计算两维的DCT变换时,可使用下面的计算式把两维的 DCT变换变成一维的DCT变换
两维DCT变换方法
2. 量

量化是对经过FDCT变换后的频率系数进行量化。量化的目的是 减小非“0”系数的幅度以及增加“0”值系数的数目。量化是图像 质量下降的最主要原因。
对于有损压缩算法,JPEG算法使用均匀量化器进行量化,量化 步距是按照系数所在的位置和每种颜色分量的色调值来确定。 亮度量化值 色度量化值
熵编码可分成两步进行: 把码字

DC系数熵编码中间格式
直流分量DC的熵编码的中间格式由两个符号 组成: 符号1:(尺寸) SSSS 符号2:(幅值) DIFF “尺寸”表示DC差值的幅值编码所需的比特数, 而“幅值”表示DC差值的幅值, 范围为[211,211-1]。

1. 正向离散余弦变换
下面对正向离散余弦变换(FDCT)变换作几点说明。 (1) 对每个单独的彩色图像分量,把整个分量图像分成8×8的图像 块,如下图所示,并作为两维离散余弦变换DCT的输入。通过DCT 变换,把能量集中在少数几个系数上。
(2) DCT变换使用下式计算
它的逆变换使用下式计算,
上面两式中, C(u), C(v) = 1/ 2 , 当u, v = 0; C(u), C(v) = 1, 其他。 f(i, j)经DCT变换之后,F(0,0)是直流系数,其他为交流系数。
DCi-1 DCi
blocki-1
blocki
差 = DCi - DCi-1
5. 交流系数(AC)的编码

量化AC系数的特点是1*64矢量中包含有许多“0”系数,并 且许多“0”是连续的,因此使用非常简单和直观的游程长度 编码(RLE)对它们进行编码。
6.熵编码


为了进一步压缩数据,需对DC码和AC行程编码 的码字再做基于统计特性的熵编码。 JPEG建议的熵编码是Huffman编码和自适应二 进制算术编码。
基于DCT的分层操作方式

分层方式是对一幅原始图象的空间分辨率,分成 多个分辨率进行“锥形”的编码方法,水平(垂直) 方向分辨率的下降以2的倍数因子改变。
分层操作方式
分层操作方式的过程
(1)把原始图象空间分辨率降低。 (2)对已降低分辨率的图象采用基于DCT的顺序方式、累进 方式或无失真预测编码中的任何一种编码方法进行编码。 (3)对低分辨率的图象解码,重建图象,使用插值滤波器,对它插 值,恢复图象的水平和垂直分辨率。 (4)把分辨率已升高的图象作为原始图象的预测值,对它们的 差值采用基于DCT的顺序方式、累进方式或用无失真方式 进行编码。 (5)重复(3)、(4)直到图象达到完整的分辨率编码。
2.1.2 JPEG2000简介



基于Internet的多媒体应用给图像编码提出了新的 要求. 2000年12月公布JPEG 2000标准(ISO 15444), 其目标是在高压缩率情况下保证图像传输质量。 JPEG中采用DCT变换考察整个时域过程的频域 特征或整个频域过程的时域特征。JPEG2000采用 以小波变换为主的多分辨率编码方式。 JPEG2000统一了面向静态图像和二值图像的编码 方式, 是既支持低比率压缩又支持高比率压缩的通 用编码方式。



需在量化器的输出与熵编码的输入之间,增加一个 足以存储量化后DCT系数的缓冲区,对缓冲区中存 储的DCT系数多次扫描, 分批编码。 两种累进方式: 频谱选择法 扫描中只对64个DCT变换系数中 某些频带的系数进行编码、传送, 随后对其它频 带编码、传送, 直到全部系数传送完毕为止。 按位逼近法 沿着DCT量化系数有效位方向分段 累进编码。如第1次扫描只取最高有效位的n位 编码、传送, 然后对其余位进行编码、传送。
相关文档
最新文档