PNG、JPEG、BMP等几种图片格式详解(二)—— JPEG

版本记录

版本号 时间
V1.0 2017.09.06

前言

只要是做图片的或者与图片相关的,那么图片的格式就是一个不可以绕过的问题,我们见过很多的图片格式,但是具体不同的图片格式是如何定义的,又具有什么特点,很多时候我们都没有深入研究过,下面我们就开始深入研究。感兴趣的可以看我上面这篇。
1. PNG、JPEG、BMP等几种图片格式详解(一)—— PNG

JPEG

以下部分内容来自百度百科,还会有一部分是自己的见解,我写这篇文章的目的是既让大家可以了解百度上已有的知识,但是不用再去找百度,还有就是可以看到我关于这种图片格式的深层次的了解,看完这篇,包括我在内,会感觉到即使很小很小的一个知识点,深入以后都是非常深的,底层和深层次原理是我的最爱,这也是我写博客的初衷和目的。


基本介绍

JPEGJoint Photographic Experts Group(联合图像专家小组)的缩写,是第一个国际图像压缩标准。JPEG图像压缩算法能够在提供良好的压缩性能的同时,具有比较好的重建质量,被广泛应用于图像、视频处理领域。人们日常碰到的“.jpeg”、‘’.jpg“等指代的是图像数据经压缩编码后在媒体上的封存形式,不能与JPEG压缩标准混为一谈。

JPEG(Joint Photographic Experts Group)是在国际标准化组织(ISO)领导之下制定静态图像压缩标准的委员会,第一套国际静态图像压缩标准ISO 10918-1(JPEG)就是该委员会制定的。由于JPEG优良的品质,使他在短短几年内获得了成功,被广泛应用于互联网数码相机领域,网站上80%的图像都采用了JPEG压缩标准。

JPEG本身只有描述如何将一个影像转换为字节的数据串流(streaming),但并没有说明这些字节如何在任何特定的储存媒体上被封存起来。.jpeg/.jpg是最常用的图像文件格式,由一个软件开发联合会组织制定,是一种有损压缩格式,能够将图像压缩在很小的储存空间,图像中重复或不重要的资料会被丢失,因此容易造成图像数据的损伤。尤其是使用过高的压缩比例,将使最终解压缩后恢复的图像质量明显降低,如果追求高品质图像,不宜采用过高压缩比例。但是JPEG压缩技术十分先进,它用有损压缩方式去除冗余的图像数据,在获得极高的压缩率的同时能展现十分丰富生动的图像,换句话说,就是可以用最少的磁盘空间得到较好的图像品质。而且 JPEG是一种很灵活的格式,具有调节图像质量的功能,允许用不同的压缩比例对文件进行压缩,支持多种压缩级别,压缩比率通常在10:1到40:1之间,压缩比越大,品质就越低;相反地,品质就越高。比如可以把1.37Mb的BMP位图文件压缩至20.3KB。当然也可以在图像质量和文件尺寸之间找到平衡点。JPEG格式压缩的主要是高频信息,对色彩的信息保留较好,适合应用于互联网,可减少图像的传输时间,可以支持24bit真彩色,也普遍应用于需要连续色调的图像。


详细介绍

JPEG是第一个国际图像压缩标准,用于连续色调静态图像(即包括灰度图像和彩色图像)
。JPEG是联合图像专家组(Joint Photographic Experts Group)的缩写,这个图像压缩标准是国际电信联盟(International Telecommunication Union,ITU)、国际标准化组织(International Organization for Standardization,ISO)和国际电工委员会(International Electrotechnical Commission,IEC)合作努力的成果。JPEG标准正式地称为ISO/IEC IS(国际标准)10918-1:连续色调静态图像数字压缩和编码(Digital Compression and Coding of Continuous-tone Still Images)ITU-T建议T.81。这个标准目的在于支持用于大多数连续色调静态图像压缩的各种各样的应用,这些图像可以是任何一个色彩空间,用户可以调整压缩比,并能达到或者接近技术领域中领先的压缩性能,且具有良好的重建质量。这个标准的另一个目标是对普遍实际的应用提供易处理的计算复杂度。

在 Photoshop软件中以JPEG格式储存时,提供11级压缩级别,以0—10级表示。其中0级压缩比最高,图像品质最差。即使采用细节几乎无损的10 级质量保存时,压缩比也可达 5:1。以BMP格式保存时得到4.28MB图像文件,在采用JPG格式保存时,其文件仅为178KB,压缩比达到24:1。经过多次比较,采用第8级压缩为存储空间与图像质量兼得的最佳比例。

然而,JPEG静止图像压缩标准,中端和高端比特速率上的良好的速率畸变特性,但在低比特率范围内,将会出现很明显的方块效应,其质量变得不可接受。JPEG不能在单一码流中提供有损和无损压缩,并且不能支持大于64×64 K的图像压缩。同时,尽管当前的JPEG标准具有重新启动间隔的规定,但当碰到比特差错时图像质量将受到严重的损坏。

针对这些问题,自1997年3月起,JPEG图像压缩标准委员会开始着手制定新一代的图像压缩标准以解决上述问题。2000年3月的东京会议,确定了彩色静态图像的新一代编码方式JPEG2000图像压缩标准的编码算法。
JPEG2000作为JPEG的升级版,其压缩率比JPEG高约30%左右,同时支持有损和无损压缩。JPEG2000格式有一个极其重要的特征在于它能实现渐进传输,即先传输图像的轮廓,然后逐步传输数据,不断提高图像质量,让图像由朦胧到清晰显示。此外,JPEG2000还支持所谓的"感兴趣区域" 特性,可以任意指定影像上感兴趣区域的压缩质量,还可以选择指定的部分先解压缩。在有些情况下,图像中只有一小块区域对用户是有用的,对这些区域,采用低压缩比,而感兴趣区 域之外采用高压缩比,在保证不丢失重要信息的同时,又能有效地压缩数据量,这就是基于感兴趣区域的编码方案所采取的压缩策略。其优点在于它结合了接收方对压缩的主观需求,实现了交互式压缩。而接收方随着观察,常常会有新的要求,可能对新的区域感兴趣,也可能希望某一区域更清晰些。
JPEG2000和JPEG相比优势明显,从无损压缩有损压缩可以兼容,而JPEG不行,JPEG的有损压缩和无损压缩是完全不同的两种方法。JPEG2000即可应用于传统的JPEG市场,如扫描仪、数码相机等,又可应用于新兴领域,如网路传输、无线通讯等等。

注意:JPEG标准不指定任何固有的文件格式。它只定义压缩比特流的语法。这就产生了一定数量的文件格式来存储JPEG压缩后的图像,例如JPEG文件交换格式(JPEG File Interchange Format,JFIF),JPEG推广到TIFF6.0FlashPix等。但它们中的每一个都不能认为是由国际标准委员会支持的正式定义的国际标准。

1. 部分JPEG标准

  • ⑴核心图像编码系统[3]
    ,为JPEG2000指定了基本的特征集合和码流语法。
  • ⑵扩充(给⑴的核心定义添加更多的特征和完善度)。
  • ⑶运动JPEG2000指定了文件格式(MJ2),它包含用于动态视频的具有JPEG2000核心编码算法的图像序列编码。
  • ISO/IEC15444-4:2002。它指定了使用第一部分的JPEG2000用于编码/解码一致性测试。
  • ⑸参考软件 (包含Java和C实现)。在这一部分中,提供了两个软件源包(使用Java和C编程语言)用于测试和开发商对于JPEG2000系统实现的有效性检验。
  • ⑹复合图像文件格式(用于文件扫描和传真应用程序)指定了其他文件格式(JPM)用于存储复合图像。ITU-TT.441ISO 16485多层混合光栅内容(mixed raster content,MRC)模型用于表示在第6部分的JPEG2000复合图像。
  • ⑺对⑴的最小支持(技术报告)【已摒弃】。
  • ⑻安全JPEG2000(JPSEC)。这一部分设计了用于JPEG2000应用的安全方面,例如加密、数字水印等。
  • ⑼交互工具、API和协议(JPIP)。这一部分定义了一个交互式网络协议,并且它指定了用于JPEG2000图像和相关元数据高效的交换工具。
  • ⑽3D和浮点数据(JP3D)。这一部分开发与三维数据有关的内容,以3D医疗图像重建作为例子。
  • ⑾无线(JPWL)。这一部分开发了用于无线多媒体的应用。主要涉及用JPEG2000在易出错的无线网环境中JPWL的差错保护、检测和修正。
  • ⑿对MPEG-4,ISO基本媒介文件格式(media file format)具有共同的文本ISO/IEC 14496-12

截止于2007年,⑴为完全被认可的ISO标准,定义了核心压缩技术和最小文件格式,⑵~⑹定义压缩和文件格式的扩充。其中,⑺已摒弃。⑻~仍在发展之中


技术概括

在计算机处理中,JPEG是一种广泛适用的压缩图像标准方式。JPEG就是「联合图像专家组」(JointPhotographicExpertsGroup)的首字母缩写。采用这种压缩格式的文件一般就称为JPEG;此类文件的一般扩展名有:.jpeg、.jfif、.jpg或.jpe,其中在主流平台最常见的是.jpg。JPEG只描述一副图像如何转换成一组数据流,而不论这些字节存储在何种介质上。由独立JPEG组创立的另一个进阶标准,JFIF(JPEGFileInterchangeFormat,JPEG文件交换格式)则描述JPEG数据流如何生成适于电脑存储或传送的图像。在一般应用中,我们从数码相机等来源获得的“JPEG文件”,指的就是JFIF文件,有时是ExifJPEG文件。

JPEG/JFIF是互联网上最常见的图像存储和传送格式。但此格式不适合用来绘制线条、文字或图标,因为它的压缩方式对这几种图片损坏严重。PNGGIF文件更适合以上几种图片。不过GIF每像素只支持8bits色深,不适合色彩丰富的照片,但PNG格式就能提供JPEG同等甚至更多的图像细节。

JPEG(发音为/jay-peg/)是一种针对相片影像而广泛使用的一种失真压缩标准方法。使用这种压缩的档案格式一般也被称为JPEG;虽然在所有平台上.jpg是最普遍的,但是针对这种格式一般的扩展名是.jpeg、.jfif、.jpg、.JPG、或是.JPE。

这个名称代表JointPhotographicExpertsGroup(联合图像专家小组)。一个由独立JPEG小组(IndependentJPEGGroup)所建立的额外标准,称为JFIF(JPEGFileInterchangeFormat,JPEG档案交换格式)详细说明如何从一个JPEG串流,产出一个适合于电脑储存和传输(像是在因特网上)的档案。在普遍的用法,当有人称呼一个"JPEG档案",一般而言他是意指一个JFIF档案,或有时候是一个ExifJPEG档案。然而,也有其他以JPEG为基础的档案格式,像是JNG。JPEG/JFIF是最普遍在万维网(WorldWideWeb)上被用来储存和传输照片的格式。它并不适合于线条绘图(drawing)和其他文字或图示(iconic)的图形,因为它的压缩方法用在这些图形的型态上,会得到不适当的结果(PNG和GIF格式通常是用来针对这种目的之图形;GIF每一像素只有8位元,并不很适合于用在彩色照片,PNG可以被用来无失真地储存照片,但是档案太大让它不适合在网页上放照片)。

在ISO公布的JPEG标准方案中,包含了两种压缩方式。一种是基于DCT变换的有损压缩编码方式,它包含了基本功能和扩展系统两部分:一种是基于空间DPCM(差分脉冲编码调制,是预测编码的一种)方法的无损压缩编码方式。


特点

  • 优点:摄影作品或写实作品支持高级压缩。

    • 利用可变的压缩比可以控制文件大小。
    • 支持交错(对于渐近式JPEG文件)。
    • 广泛支持Internet标准。
  • 缺点:有损耗压缩会使原始图片数据质量下降。

    • 当您编辑和重新保存JPEG文件时,JPEG会混合原始图片数据的质量下降。这种下降是累积性的。
    • JPEG不适用于所含颜色很少、具有大块颜色相近的区域或亮度差异十分明显的较简单的图片。

压缩标准

1. 压缩操作模式

基于DCT的连续模式(Sequential DCT-based mode of operation)

1) baseline sequential;
2) extended sequential, Huffman coding, 8-bit sample precision;
3) extended sequential, arithmetic coding, 8-bit sample precision;
4) extended sequential, Huffman coding, 12-bit sample precision;
5) extended sequential, arithmetic coding, 12-bit sample precision.

一次将图像由左到右、由上到下顺序处理。

基于DCT的渐进模式(Progressive DCT-based mode of operation)

1) spectral selection only, Huffman coding, 8-bit sample precision;
2) spectral selection only, arithmetic coding, 8-bit sample precision;
3) full progression, Huffman coding, 8-bit sample precision;
4) full progression, arithmetic coding, 8-bit sample precision;
5) spectral selection only, Huffman coding, 12-bit sample precision;
6) spectral selection only, arithmetic coding, 12-bit sample precision;
7) full progression, Huffman coding, 12-bit sample precision;
8) full progression, arithmetic coding, 12-bit sample precision.

当图像传输的时间较长时,可将图像分数次处理,以从模糊到清晰的方式来传送图像(效果类似GIF在网络上的传输)。

无失真模式(Lossless mode of operation)

1) lossless processes with Huffman coding;
2) lossless processes with arithmetic coding.

使用预测性编码代替基于DCT的变换,而且在这个模式中没有涉及量化。

分级模式(Hierarchical mode of operation)

图像以数种分辨率来压缩,其目的是为了让具有高分辨率的图像也可以在较低分辨率的设备上显示。

2. JPEG编解码器

下图为JPEG基本系统的编解码器原理图,输入的彩色图像为Y、U、V三个分量,JPEG对它们分别进行编码。

3. 压缩步骤

由于JPEG的有损压缩方式(Lossy mode of operation)并不比其他的压缩方法更优秀,
因此我们着重来看它的有损压缩中最常用的基线JPEG算法(baseline sequential)。以一幅24位彩色图像为例,JPEG的压缩步骤分为:

颜色转换

JPEG支持图像采用任何一个色彩空间,支持1~4个颜色分量。灰度图像颜色分量数为1。RGB、YUV、YCbCr等拥有3种颜色分量。4种颜色分量的例子是青、洋红、黄和黑(Cyan,Magenta,Yellow,and Black,CMYK)。为了减少色度通道包含的大量的冗余信息,本例中采用YCbCr色彩空间。首先需要进行从RGB到YCbCr的色彩空间变换:

Y = 0.299000R + 0.587000G + 0.114000B
Cb = -0.168736R - 0.331264G + 0.500002B
Cr = 0.500000R - 0.418688G - 0.081312B

其中,Y表示亮度分量,Cb和Cr表示蓝红色度分量。

DC电平偏移

最初,在图像中的像素存储在无符号的整数中。对于数学计算,在图像中任何变换或数学计算开始之前,根本上是将这些采样转换成两个补码表示。DC电平偏移的目的是保证输入图像的采样有近似地集中在零附近的动态范围。DC电平偏移执行的图像采样只通过无符号数表示。

方法:假设图片分量的采样精度为n,那么分量中的每个像素值应减去2的(n-1)次幂。

对于图像而言他的采样由无符号的整数表示,例如CT(X光断层成像)图像,动态范围已经集中于零附近,所以不需要DC电平偏移。

子采样

色彩空间转换之后,图像的大多数空间信息包含在亮度分量Y中。色度分量Cb和Cr包含大量冗余的颜色信息,所以我们运用子采样较少色度数据量以在丢失少量信息的情况下压缩图像。基线JPEG常用的子采样格式为4:2:0,同时支持4:2:2和4:4:4颜色格式。

DCT变换

DCT(DiscreteCosineTransform)是将图像信号在频率域上进行变换,分离出高频和低频信息的处理过程。然后再对图像的高频部分(即图像细节)进行压缩,以达到压缩图像数据的目的。首先将图像划分为多个8*8的矩阵。然后对每一个矩阵作DCT变换。变换后得到一个频率系数矩阵,其中的频率系数都是浮点数。

量化

由于在后面编码过程中使用的码本都是整数,因此需要对变换后的频率系数进行量化,将之转换为整数。由于进行数据量化后,矩阵中的数据都是近似值,和原始图像数据之间有了差异,这一差异是造成图像压缩后失真的主要原因。

在这一过程中,质量因子的选取至为重要。值选得过大,可以大幅度提高压缩比,但是图像质量就比较差;反之,质量因子越小(最小为1),图像重建质量越好,但是压缩比越低。对此,ISO已经制定了一组供JPEG代码实现者使用的标准量化值。

右图的两个量化表的设计是根据由Lohscheller做的心理视觉实验来确定二维基函数的可见阈值。

这些表也不适用于各种各样的图像,但他们为大多8位精度自然图像进行亮度和色度采样提供了合理的、出色的结果。

编码

从前面过程我们可以看到,颜色转换完成到编码之前,图像并没有得到进一步的压缩,DCT变换和量化可以说是为编码阶段做准备。

编码采用两种机制:一是0值的行程长度编码;二是熵编码(EntropyCoding)

  • 之字形排序(Zig-zag ordering)
    • 在JPEG中,采用曲徊序列,即以矩阵对角线的法线方向作“之”字排列矩阵中的元素。这样做的优点是使得靠近矩阵左上角、值比较大的元素排列在行程的前面,而行程的后面所排列的矩阵元素基本上为0值。

具体示意图如下所示:

  • 使用RLE对交流系数(AC)进行编码

    • 行程长度编码是非常简单和常用的编码方式,在此不再赘述。
      需要注意的是,AC系数的之字形序列编码中有两个特殊符号——(0,0)和(15,0)。第一个特殊符号指的是块的结束(end-of-block,EOB),用来表明在之字形块中剩余的元素都是零。另一个特殊符号是指零游程长度(zero-run-length,ZRL),用来表明16个零游程。基线JPEG允许的零游程最大长度是16个。如果这里的零超过16个,那么这个游程分成几个长度为16的零游程。
  • 使用DPCM对直流系数(DC)进行编码

    • DCT系数量化之后,通过差分编码对量化后的DC系数编码。当前块的DC系数减去前个块的DC系数,然后对其差值进行编码,如右图所示。这就利用了邻接块DC值之间的空间相关性。
  • 熵编码:编码实际上是一种基于统计特性的编码方法。在JPEG中允许采用HUFFMAN编码或者算术编码。而基线JPEG算法(baseline sequential)采用的是前者。
    经过RLE编码的AC系数可以映射成两个标志(RUNLENGTH,CATEGORY)和(AMPLITUDE),前者采用的是霍夫曼编码,而后者采用的是VLI编码。同理经过DPCM编码的DC系数同样可以映射成两个标志(CATEGORY)(AMPLITUDE),前者采用霍夫曼编码,后者采用VLI编码。
    基线JPEG允许使用4个霍夫曼表,两个用于AC系数编码,两个用于DC系数编码。

总体上来说,如下图所示。

还可以如下表示:

上面的逆过程就是解码过程。

4. 数据压缩格式

JPEG定义了三种压缩数据格式

  • a) 交换格式 (interchange format)
  • b) 压缩图像数据的缩略格式(abbreviated format for compressed image data)
  • c) 规范表数据的缩略格式(abbreviated format for table-specification data)

压缩数据规范的基本内容(General aspects of the compressed data formatspecifications)

在结构上,压缩数据格式包含一个由参数、标志和熵编码数据段组成的有序集合。参数和标记往往又形成标志段。由于所有这些组成部分是由字节对齐的代码表示的,因此每一个压缩数据格式由一个8-bits字节的有序序列组成。对于每一个字节,都定义了一个最高有效位(MSB)和一个最低有效位(LSB)

插图的语法规定 (Conventions for syntax figures)

为了便于了解JPEG压缩数据流中每一个framescan的内容,必须掌握以下语法

  • 参数/标记指示符:一个细线框包含一个标志或一个单独的参数;
  • 段指示符:一个粗线框包含一个标志段、一个熵编码段或他们的结合;
  • 参数长度指示符:细线框的宽度与其包含的参数或标志的位长成正比。相反,粗线框的宽度是无意义的;
  • 可选的/有条件的指示符:方括号标明,在压缩数据中,当前标志段或标记只是可选的或有条件的。
  • 次序:交换格式中,图中所示的参数或标志都先于其右边所示的参数或标志,并跟在它左边的参数后面。
  • 熵编码数据指示符:尖括号标明,其包围的内容是已经经过了熵编码的。

参考文章

1. JPEG原理详细
2. 百度百科
3. JPEG编码原理

后记

未完,待续~~~

推荐阅读更多精彩内容