图像压缩JPEG标准
JPEG是应用最广泛的静态图像压缩标准。
- JPEG是针对标准彩色图像和灰度图像压缩的程序;
- JPEG针对真实环境中的压缩效果较好,对工程图、卡通图、其他非真实感的图像压缩效果较差(原因在于其中利用到DCT线性变换,而DCT变换主要针对自然图像);
- JPEG即可以是有损压缩,也可以是无损压缩;
有损压缩:实际上是基于DCT变换的方法(与原始图像相比,在像素级别是不同的,但人眼的视觉系统看不出差异);
无损压缩:基于预测方法,不能使用DCT变换(DCT变换的数学公式中有些无理数,一般计算机计算位数有限,在一定的位数上面会做截断,必然会导致像素级别上的差异)。
压缩与解压缩
以上为压缩的大致流程。
以上为解压缩的大致流程。
前处理
Color sub-sampling
- 彩色图像:RGB空间 ==> YUV空间(Y表示亮度分量,U与V是两个色差的分量);
- 之后对U、V进行采样(该步实际已经在做压缩。Why 只对色差分量做采样?人眼的视觉系统对亮度分量比较敏感,对两个色差分量并不敏感 ==> 尽量保持亮度分量不变,色差分量砍数据);
- 对于16x16的图像块,经过操作之后,会包含6个8x8的块(1个16x16的亮度分量块,2个8x8的色差分量块,亮度分量是U、V的两倍大小 ==> 共形成4个8x8的亮度块,因此共组成6个8x8的块)。
Level shifting:
- 每个像素减去128,将(0, 255) ==> (-128, 127)(Why?自然灰度图中间的灰度值出现概率大,即靠近128的值非常多,减去128之后,图像中的大多数值会接近0,而在压缩的过程中,最希望看到的就是0,0可以采用巧妙的方式去处理,不会占用存储空间)。
2D DCT
图像块的尺寸是8x8,做8x8的DCT变换;
- 经过8x8DCT变换之后,8x8的图像块(共64个数字) ==> 得到的仍是64个数字,但空间已经发送了变化,前者表示像素点的灰度值,变换后表示该图像块在不同空间频率上的投影值,得到64个空间频率值,即在两个不同的domain当中,前者空间域,后者频率域,通常称为输入8x8图像块的“频谱”。
输入的8x8图像块,与上图中每一个子图像块做内积(点对点相乘再相加,最终得到标量),最终得到64个系数,表示该图像块在不同空间频率域上的投影,即频谱。
DCT变换在压缩中起什么作用?
- 自然图像中,图像块中的点与点之间的灰度变化不是那么剧烈,变换相对光滑、缓慢,DCT变换刚好可以把这种光滑、缓慢的变换趋势,可以将该信号的能量集中在少数几个所谓的低频率的成分上。
- 理论上,DCT变化是一种无损变换,但实际上由于DCT变换包含一个“cosine”,是一个无理数,计算机只能计算有限位的数,但这一阶段不会有任何的信息丢失,信息丢失主要是在量化阶段。
量化:将视觉上不重要的信息丢失掉。
- 从数学角度:多对一的映射(0-1之间,0.9经过量化为0.5,0.1经过量化为0.5,即一个线段变成了一个点,自然信息必然丢失 ==> 引入量化误差(量化噪声))
对于8x8的图像块,除第一个系数之外,将其他的系数按照第一个系数做变换,也进行了一定程度的压缩。
其他63个系数称为交流分量(AC Coefficients)
人眼视觉系统对低频信号更敏感。
- (a)灰度值变换平滑,需要减去128(在空间域当中);
- (b)做DCT变换,变为64个系数(在频域当中,直流分量占绝大部分235.6,右下角数值都很小);
- (c)量化表:右下角的值比左上方的值更大
(用(b)中的每个元素除以(c)中的每个元素); - (d)量化之后绝大多数数值都变成了0(类似于稀疏矩阵),直流分量单独处理;
- (e)去量化:(d)与量化表相乘,非零时才会有数值;
- (f)DCT的逆变换,像素级的灰度值会有细微的变化,人眼视觉系统无法感知差异,即在压缩后节省了很多存储空间,但图像视觉质量不变。
视频压缩MPEG标准
静态图像压缩 vs 视频序列压缩
- 从一帧的角度看,两者相同;
- 视频帧与帧之间时域的相关性大,利用时域的冗余性做更大强度的压缩;
不考虑时域的冗余性(AVI格式实际上为帧内编码),即每一帧独立地按照图像JPEG标准进行编码。
相邻两帧相减,大部分像素值为0。
运动补偿
- 为基于前一帧的预测帧。
- 注意,参考帧是解码后的前一帧,并非原始帧。
不做运动补偿与做运动补偿的差异
运动补偿后的残差量相比直接相减更小,更有利于做压缩,原因在于0出现更多。
MPEG编码的大致流程
- 对于第一帧,没有参考帧,直接按照JPEG的方法进行压缩(流程中上半部蓝色支路);
- 黄色支路:去量化 ==> DCT逆变换 ==> 得到;
Why 不与前一帧的raw对比?解码端接收到的是第二帧的压缩帧,而不是第二帧的原始帧,若接收端已有第二帧的原始帧,就无需压缩了。
MPEG解码的大致流程
帧分三类:
- 帧内编码;
- 预测帧;
- 双向预测帧。
一种典型的帧安排:
- 、是来自于的前向预测的帧,、可以双向的进行估计,即其来自和的插值;
- 每隔一段时间会插入一个帧,阻断误差的弥漫,帧类似基石,后续的帧均要以其为标准来进行编码。
帧即为JEPG编码。
帧的每一块都要在前一帧参考帧中寻找匹配块,二者相减获得残差,对残差进行编码。
帧的参考帧有两个,最后编码的也是残差。
Reference
中国大学MOOC 数字图像处理与应用 浙江大学 陆系群