图像压缩编码(3)--静止图像JPEG

#灵感# 到了我看这本书的原因——了解一下压缩编码。

目录

图像压缩编码的标准化:

视频编码

H.26x

MPEG

静止图像压缩编码-JPEG

JPEG编码算法的流程:

1)颜色模式转换

2)采样

3)分块

4)DCT

5) 量化

6)Zigzag 扫描排序

7)DC系数的“差分脉冲”编码调制

8)DC系数的中间格式

9)AC系数的行程长度编码

10)AC系数的中间格式计算

11)熵编码

JPEG解码


图像压缩编码的标准化:

JPEG 格式是目前网络上最流行的图像格式,应用非常广泛,特别是在网络和光盘读物上,都能找到它的身影。由于其文件尺寸较小,下载速度快,各类浏览器均支持 JPEG 这种图像格式。

MPEG 致力于制定活动图像(视频)和音频的压缩、处理和播放标准,开发了一系列重要的音视频标准 MPEG一x,如 MPEG一1、MPEG一2、MPEG一4、MPEG一7和 MPEG 21。

VCEG开发制定了一系列与电信网络和计算机网络有关的视频通信协议和标准H.26x,如H.261、H.263、H.263+、H.263++以及与 MPEG 合作并共同发布的 H.264、H.265

JVT 的主要工作目标是推动并发布H.264/MPEG-4 Part 10,2013年,HEVC正式成为国际标准,即 HEVC/H.265 标准。

视频编码

视频编码国际标准有 MPEG一x和 H.26x 两大系列。

从 H.261视频编码标准到 H.262/3、MPEG一1/2/4等都有一个共同的不断追求的目标,即在尽可能低的码率(或存储容量)下获得尽可能好的图像质量。同时,随着市场对图像传输需求的增加,如何适应不同信道传输特性的问题也目益凸现。于是,ISO/IEC 和 ITU—T 两大国际标准化组织联手制定了视频编码新标准 H.264 和 H.265。

H.26x

H.261 是ITU—T制定的第一个视频编码标准,是视频编码的经典之作,被称为视频压缩编码的一个里程碑。它所采用的压缩算法成为以后其他各种压缩标准的基础和核心。采用可减少时间冗余的帧间预测和可减少空间冗余的 DCT 变换相结合的混合编码方法,主要应用于综合业务数字网 (ISDN)、异步传输模式(ATM)等宽带信道上的声音和图像信息的实时传输,不适合在公共交换电话网(PSTN)和移动通信网等带宽有限的网络上应用。

MPEG

MPEG一1标准的码率为 1.2 Mbps 左右,可提供30帧 CIF (352x288)质量的图像,是为 CD-ROM光盘的视频存储和播放而制定的,主要用于家用VCD 的视频压缩。MPEG一1标准中,视频编码部分的基本算法与 H.261、H.263 相似,采用运动补偿的帧间预测、二维 DCT、VLC 行程编码等措施:还引入了帧内帧(I帧)、前向预测帧(P 帧)、双向预测帧(B帧)和直流帧(D帧)等概念,进一步提高了编码效率。

在 MPEG一1的基础上,MPEG—2标准在提高图像分辨率、兼容数字电视等方面做了一些改进,例如它的运动矢量的精度为半个像素;在编码运算(如运动估计和 DCT)中,对“帧”和“场”加以区分;引入了编码的可分级性技术,如空间可分级性、时间可分级性和信噪比可分级性等。
MPEG—2 主要用于数字视频广播(DVB)、家用 DVD 及高清晰度电视(HDTV)。

MPEG—4标准引入了基于视听对象(Audio Visual Object,AVO)的编码技术,大大提高了视频通信的交互能力和编码效率;但 MPEG一4的基本视频编码器仍采用与 H.263相似的混合编码器。

静止图像压缩编码-JPEG

静止图像压缩编码标准是由联合图像专家组JPEG制定的,包括JPEG标准和JPEG200标准。

JPEG 是用于彩色和灰度静止图像的一种完善的有损/无损压缩方法,已广泛应用于多媒体和网络传输中。图片经过转化变为 JPEG 图像后,仅会丢失人眼不易察觉的一些细节, 压缩比高,且无论连续色调图像的维数、彩色空间、像素宽高比或其他特征如何  都能得到良好的压缩效果,在图像的清晰度与文件大小之间找到了一个很好的平衡点。

JPEG 标准有两种基本的压缩算法、两种熵编码方法、四种编码模式。

(1)两种基本的压缩算法是: 有损的离散余弦变换 DCT 和无损的预测压缩技术.

(2)两种熵编码方法是: Huffman 编码和算术编码。

(3)四种编码模式。

  • 基于 DCT 的顺序模式: 编码、解码通过一次扫描完成
  • 基于 DCT 的渐进模式:编码、解码经多次扫描完成,扫描效果由粗到精,逐级递增。
  • 无损模式: 基于 DPCM,保证解码后完全精确恢复原始图像采样值。
  • 层次模式: 也称分级模式,指图像在多个空间分辨率中进行编码,可以根据需要只对低分辨率数据作解码,放弃高分辨率信息。

在实际应用中,JPEG 图像编码算法大多使用 DCT、Huffman 编码、顺序编码模式也称JPEG 的基本系统。

JPEG编码算法的流程:

JPEG 基本系统的编码主要包含 11 个步骤: 颜色模式转换、采样、分块、DCT、量化Zigzag 扫描排序、DC 系数的差分脉冲编码调制、DC 系数的中间格式计算、AC 系数的游程长度编码、AC 系数的中间格式计算、熵编码。

1)颜色模式转换

JPEG 采用的是 YCrCb 颜色空间,而 BMP 采用的是 RGB 颜色空间,要想对 BMP 图片进行压缩,首先需要进行颜色空间的转换。
一般来说,色度值(包括 C 和 Cr) 应该是一个有符号的数字,但一般通过加上 128,使其变为8位的无符号整数,从而方便数据的存储和计算。

2)采样

JPEG 图片中,通常采用两种采样方式 4:2:2或者4:1:1。这两种采样方式虽然都会损失一定的精度,但能够以人眼不太察觉的损失有效减小数据的存储量。当然,JPEG也允许将每个像素点的 Cr、Cb 值都记录下来。

3)分块

由于后面的 DCT变换是对 8x8 的子块进行处理的,因此,在进行 DCT 变换之前必须对源图像数据进行分块。源图像(raw图)中每个像素点的 3 个分量是交替出现的,需要先把这3个分量分开,存放到3 张表中去。然后由左及右、由上到下依次读取 8x8 的子块,存放在长度为64的表中,这样做可以方便执行 DCT 变换。需要注意的是,实际实现时一般从源图像读取一个 8x8 的数据块后,即刻进行 DCT 变换、量化、编码,然后再读取和处理下一个8x8的图像块。
JPEG 编码是以每 8x8 个像素点为单位进行处理的。所以,如果源图像的长、宽不是 8的倍数,就需要将其补成 8 的倍数,以便对其进行分块处理。

4)DCT

DCT是码率压缩中常用的一种变换编码方法。任何连续的实对称函数的傅里叶变换中只含有余弦项,因此,余弦变换同傅里叶变换一样具有明确的物理意义。
如前面所述,DCT 是以 8x8 的图像块为单位逐一进行的。8x8 的二维图像块经过 DCT变换之后,就得到了 8x8 的变换系数矩阵。矩阵的(0,0) 位置代表了均值,也就是直流分量(DC系数); 另外的63 个系数(AC系数) 代表了水平空间频率和垂直空间频率分量(高频分量)的大小,这些 AC 系数多半是一些接近于 0 的正负浮点数。、

经过 DCT 变换后的 8x8 系数矩阵中,低频成分集中在矩阵的左上角,高频成分则集在右下角,由于大多数图像的高频分量比较小,相应的图像高频分量的 DCT 系数往往接近于0。

考虑到高频分量中只包含了图像中细微的细节变化信息,而人眼又对这些高频成分的失真不太敏感,所以,可以考虑将这些高频成分予以抛弃,从而达到压缩图像的目的。这样一来,传送DCT变换系数所需的编码长度就远远小于传送图像像素的编码长度。到接收端之后,通过 IDCT 就可以得到原来的数据。虽然这么做会带来一定的失真,但人眼是可接受的,而且对这种微小的变化并不敏感。

5) 量化

图像数据经 DCT变换转换为 DCT频率系数之后,还要进行量化,之后才能进入扫描、编码过程。在JPEG 算法中,由于亮度和色度的精度要求不同,分别对亮度和色度采用不同的量化矩阵——前者细量化,后者粗量化。这样一来,量化阶段就需要两个8x8 量化矩降,一个专门用于处理亮度(Y)的频率系数,另一个则针对色度(Cr,Cb)的频率系数。

这两个量化矩阵依据心理视觉设计制作,对 8bit 的亮度和色度图像的处理效果比较有效。

6)Zigzag 扫描排序

DCT 将一个8x8 的图像块变换成另一个8x8 的系数矩阵。如果将这64个数据一行行地存放到内存里,那每行的结尾和下行的开始就没有什么关系了。JPEG规定,按图4-1中的顺序依次保存和读取64个DCT 系数值。
不难发现,这种数据的扫描、保存、读取方式,是从8x8矩阵的左上角开始,按照英文字母z的形状进行扫描的,一般将其称为 Zigzag 扫描排序。

7)DC系数的“差分脉冲”编码调制

8x8 的图像块经过DCT 变换、量化之后得到的DC系数有两个特点:
(1)DC 系数的数值比较大;
(2)相邻的8x8 图像块的DC 系数值变化不大。
根据这两个特点,对DC 系数一般采用 DPCM 编码,即取同一个图像分量中每个图像块的DC 系数值 DC_{i};与前一个图像块的DC系数值 DC_{i-1} 的差值 DIFF_{i},来进行编码。对差值进行编码所需要的位数会比对原值进行编码所需要的位数少很多。例如,假设某一个 8x8 图像块的DC 系数值为15,而前一个 8x8 图像块的DC 系数为 12,则两者之间的差值3。

8)DC系数的中间格式

为了进一步节约空间,JPEG 中并不直接保存数据的具体数值,而是将数据按照位数分为若干组(如8bit 精度时分为0~11共12组),保存在表里面。这就是所谓的变长整数编码 (Variable-Lengths Integer code, VLI)。

其中,第0组中保存的编码位数为0,其编码所代表的数值为0:第1组中保存的编码位数为1,编码所代表的数值为-1或者1,如此等等。例如,若某个 DC 差值为3,通过查找表可以发现,整数3位于表中第2组,因此,可以写成(2,3)的形式,该形式称为 DC 系数的中间格式。

9)AC系数的行程长度编码

DCT 系数矩阵经过量化之后,除了(0, 0)位置的DC系数外,其余的63个AC系数中含有很多0。

因此,可以采用行程(游程)编码 (Run Length Coding,RLC)来进一步降低 AC 系数的传输量。利用该编码方式,可以将一个字符串中重复出现的连续字符用2字节来代替,其中,第一字节代表重复的次数,第二字节代表被重复的字符串。例如,(4,6)就代表字符串“6666”。

但是,在JPEG 编码中,对RLC有一点针对性的改变。具体地说,JPEG 中的 RLC 编码结果(M, N)的含义:M是两个非零 AC系数之间连续的0的个数,即0行程长度(ZRL);N是下一个非零的AC 系数值。采用这样的方式进行表示,是因为AC 系数当中有大量的0,而且采用 Zigzag扫描也会使得AC 系数中有很多连续的0存在,这样改进的 RLC编码更适合JPEG。需要注意的是,如果系数之间连续0的个数超过16,则用一个扩展字节(15, 0)来表示16个连续的0。

10)AC系数的中间格式计算

同样,对AC 系数的行程长度编码也根据VLI表(表4-7)计算其中间格式,形式为(M, SSSS)(N)。具体地,只处理每对数(M, N)中的N,对其进行 VLI 编码,得到 SSSS。
例如,对RLC编码结果(1,-30),查找表4-7可以发现,-30在第5组当中,因此,可以将其写成(1,5)(-30)的形式,该形式称为 AC 系数的中间格式。

11)熵编码

在得到 DC 系数和 AC 系数的中间格式后,为进一步压缩图像数据,有必要对两者进行熵编码。JPEG 标准具体规定了两种熵编码方式:Huffman 编码和算术编码。JPEG 基本系统规定采用 Huffman 编码,用查表的方式来高效地完成。
在 JPEG 基本系统中,对 DC 系数和 AC 系数将分别采用不同的 Huffman编码表,对于亮度和色度也采用不同的Huffman编码表。因此,总共需要4张 Huffman编码表才能完成熵编码。

JPEG解码

解码过程需要执行编码过程的所有逆操作。
首先,按照文件格式,将JPEG文件相关的字段信息(如图像的宽度、高度、量化表、Huffman 表等)一一读取出来,并进行相应的解析。
然后,基于 Huffman 表构建 Huffiman树,之后就可以进行 Huffman 解码得到DC系数和AC系数。通过反 Zigzag 扫描,重新排列得到8x8的系数矩阵。经译码得到的8x8 系数矩阵需要进行反量化操作,即将反 Zigzag 扫描得到的8x8 系数矩阵分别乘以相应的8x8量化矩阵。
最后,进行IDCT,将数据从频域变换回空域。
当然,如果图片是以BMP格式保存的,则还需要进行YCrCb 到 RGB 的颜色空间转换。

Over!
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

search7

请为我点赞!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值