信息论基础:图像压缩

本文介绍了图像压缩的重要性,探讨了无损和有损压缩的区别,并详细阐述了图像压缩的几种方法,包括游程编码、量化、预测编码和变换编码。特别提到了JPEG压缩标准,以及其利用离散余弦变换和量化实现不同质量图像压缩的过程。文章还讨论了压缩性能的衡量指标和图像压缩在不同场景下的应用。
摘要由CSDN通过智能技术生成

引言

图像需要压缩

各种图像传感器的空间和时间分辨率越来越高。

以手机为例,不少手机的后置摄像头已达到5000万像素。原始数字图像表示为二维数组,一幅彩色图像占3𝑀𝑁字节,𝑀和𝑁为宽和高。一张照片占143M字节,一段10分钟4K视频(3840×2160像素,30帧/秒)占7.44G字节。

再以3D+t的心脏CT图像数据为例。一个心动周期采集20个时相,每个时相为512×512×402矩阵。CT值不同于一般灰度图像的灰度,其变化范围较大,一般为−1000~1000,因此采用有符号16位整型存储。因此,可算出一个时相占据内存:512×512×402×2=201 MB,那么20个时相共计4.02 GB。同时,由于文件还要保存除了像素值以外的其他一些信息,实际图像大小达到4.10 GB。

因此,图像数据量越来越大。然而用于存储图像的空间有限。一块5T字节的硬盘只够7.4小时手机视频(未压缩)。嵌入式系统的存储空间非常有限,例如二代身份证只给指纹1K字节的存储空间。用于传输图像的通信带宽也有限。如果使用手机无线流量看原始视频的话,质量和费用都难以承受。因此图像压缩技术非常有价值。

图像压缩分为无损和有损。某些领域的图像需要无损压缩,如医疗图像(防止误诊、漏诊)、现场指纹(防止误识别、漏识别)。而大多数领域的图像允许有损压缩,如手机照片、互联网图片、监控视频、聊天视频。

为什么图像可以压缩?

为什么图像可以压缩?因为图像原始的2D数组表示具有三种冗余:

  1. 编码冗余:对所有像素值做定长编码,未考虑不同值的概率。
  2. 空间冗余:对各像素独立编码,未考虑相邻像素值的相关性。
  3. 不重要信息:所有像素一视同仁,未考虑人视觉系统的特点。

下面这幅图像的特点:

  1. 灰度直方图为均匀分布。因此无法用前面的变长编码来压缩。
  2. 垂直方向的灰度值相互独立。
  3. 水平方向的灰度值恒定。

游程编码(run-length coding)非常适合这幅图像。它用一对数字(灰度值,数量)表示一连串相同灰度值,达到压缩目的。对于该图像,每一行只需要两个数字,各占一个字节。压缩比为(256×256×8)/(256×2×8)=128:1。

对于人眼,下图几乎为恒定灰度。其实,其灰度范围为[125,131]。由于人眼对于细微灰度变化的分辨能力很有限,此图可以只需用一个平均灰度值128表示,压缩比为65536:1。将所有[125,131]的灰度值表示为128,称为量化。不同于前两种冗余(编码冗余和空间冗余)的去除方法,量化会带来信息损失,是不可逆的。

图像压缩的性能指标

图像压缩属于数据压缩(视频、音频、文本、其他)。数据是用来表示信息的,相同信息可以用不同的表示方式,有的数据量较大,有的较小。假设图像原始的2D数组表示需要b比特,而另一种高效的表示需要b’比特,压缩比 C = b / b ′ C=b/b' C=b/b。原始表示的冗余度 R = 1 − 1 / C R=1-1/C R=11/C。例如,某压缩算法的压缩比为10:1( C = 10 C=10 C=10),那么原始表示的冗余度为0.9。

如何评价不同的无损压缩算法?如果不考虑算法的时空复杂度等指标,压缩比是唯一指标。

如何评价不同的有损压缩算法(不考虑算法复杂度)?可以固定压缩比,看谁损失小。或者固定损失,看谁压缩比大。相比损失,更常用的术语为保真度准则。损失小,保真度高;损失大,保真度低。保真度分为客观和主观。

客观的保真度准则有2个不足:1)很多应用中,图像是给人看的,人的评价才是最终标准;2)很难找到理想的客观的保真度准则。例如,轻微的图像几何变形会使均方根误差非常大。

因此实际中也会采样主观评价方法。邀请一组观察者,观看解压图像和原始图像,独立打分(比如5个质量等级:优秀、良好、可用、差、极差),最后取平均。如果是对比2种压缩算法,可以同时显示各自解压图像,由观察者评价相对优劣。

下图的例子对比了三种压缩算法。人的主观判断会倾向于认为第二幅优于第三幅,因为图二的细线结构没有破坏。但是第三幅的均方根误差更小。

图像压缩系统

这是通用的图像/视频压缩系统的方框图。两大模块:编码器(encoder)和解码器(decoder) 。图像查看软件只有解码器;图像编辑软件有编解码器(codec)。原始图像 f ( x , y ) f(x,y) f(x,y),原始视频 f ( x , y , t ) f(x,y,t) f(x,y,t),解压图像 f ^ ( x , y ) \hat{f}(x,y) f^(x,y),解压视频 f ^ ( x , y , t ) \hat{f}(x,y,t) f^(x,y,t)

  • 映射器(Mapper)对进行变换以减少空时冗余。通常该变换是可逆的,有可能减少数据量(游程编码),也可能不减少、甚至增加数据量(变换编码:数组大小不变,BYTE --> DOUBLE)。
  • 量化器(Quantizer)根据保真度要求,降低映射器输出的精度。这步是不可逆的。
  • 符号编码器(Symbol coder)按照适当的码本对量化器输出值进行编码(如霍夫曼编码)。这步是可逆的。
  • 符号解码器(symbol decoder)根据对应码本进行解码。
  • 逆映射器(inverse mapper)将数据恢复为空域图像(如离散余弦逆变换)。

差分编码

声音、图像等信源的相邻样本之间存在很强的相关性。利用过去的样本值预测新样本值,然后传输预测误差。预测误差可以做标量量化。

为什么无损预测编码可以实现压缩?下图显示了原图和预测误差图的直方图。预测方法很简单,就是认为右侧像素值等于当前像素值。从直方图可见,相比原图的直方图,预测误差图的直方图非常集中,也就是说熵很小。如果对原图和预测误差图分别使用无损编码(如霍夫曼编码),那么后者的压缩比会很高。

错误的求差方法

下面看一个差分编码的例子。
某信源输出以下序列:6.2 9.7 13.2 5.9 8 7.4 4.2 1.8
计算样本差:6.2 3.5 3.5 -7.3 2.1 -0.6 -3.2 -2.4
如果对差序列做无损编码,可以精确恢复原序列。假设做有损编码,具体用7级标量量化器,重构值为-6,-4,-2,0,2,4,6。
量化后的差序列为:6 4 4 -6 2 0 -4 -2
重构序列:6 10 14 8 10 10 6 4
原序列与重构序列的误差为:0.2 -0.3 -0.8 -2.1 -2 -2.6 -1.8 -2.2

似乎量化误差有增大的趋势。为什么?

序列{𝑥_𝑛 },取差值𝑥_𝑛−𝑥_(𝑛−1),得到差序列{𝑑_𝑛 }
对差序列量化得到序列{𝑑 ̂_𝑛 }: 𝑑 ̂_𝑛=𝑄[𝑑_𝑛 ]=𝑑_𝑛+𝑞_𝑛,其中𝑞_𝑛为量化误差
解码器得到重构序列{𝑥 ̂_𝑛 }: 𝑥 ̂_𝑛=𝑥 ̂_(𝑛−1)+𝑑 ̂_𝑛
假设编码器和解码器都从𝑥_0开始,
即𝑥 ̂_0=𝑥_0
计算重构值:
𝑥 ̂_1=𝑥 ̂_0+𝑑 ̂_1=𝑥_0+𝑑_1+𝑞_1=𝑥_1+𝑞_1
𝑥 ̂_2=𝑥 ̂_1+𝑑 ̂_2=𝑥_1+𝑞_1+𝑑_2+𝑞_2=𝑥_2+𝑞_1+𝑞_2
𝑥 ̂_𝑛=𝑥_𝑛+∑_(𝑘=1)^𝑛 𝑞_𝑘
可见量化误差不断累积!

正确的求差方法

让编码器和解码器使用同样的减数
解码器只有重构序列{𝑥 ̂_𝑛 },没有原序列{𝑥_𝑛 }
而编码器可以有原序列{𝑥_𝑛 }和重构序列{𝑥 ̂_𝑛 }
因此编码器求差𝑑_𝑛时用𝑑_𝑛=𝑥_𝑛−𝑥 ̂_(𝑛−1)
而不是用𝑑_𝑛=𝑥_𝑛−𝑥_(𝑛−1)
计算重构值: 𝑑_1=𝑥_1−𝑥_0, 𝑑 ̂_1=𝑑_1+𝑞_1 𝑥 ̂_1=𝑥 ̂_0+𝑑 ̂_1=𝑥_0+𝑑_1+𝑞_1=𝑥_1+𝑞_1 𝑑_2=𝑥_2−𝑥 ̂_1, 𝑑 ̂_2=𝑑_2+𝑞_2 𝑥 ̂_2=𝑥 ̂_1+𝑑 ̂_2=𝑥 ̂_1+𝑑_2+𝑞_2=𝑥_2+𝑞_2 𝑥 ̂_𝑛=𝑥_𝑛+𝑞_𝑛
量化误差没有累积。

下面给出前面所述差分编码系统的方框图。编码器虚线框内为模拟的解码器,以得到重构样本,用来计算下一个差值。

用2种求差方法量化并重构正弦波 差值的动态范围分别为[−0.2,0.2], [−0.4,0.4] 量化级数都是4,步长分别为0.1和0.2

假设:相邻样本值存在很强的相关性方法:使用历史样本值预测当前样本值,对误差做标量量化与矢量量化(上节课)相比,差分编码的压缩比小,但简单、速度快,在语音、图像压缩中应用很广。

变换编码

假设某信源输出的序列如下,是一系列身高体重值。如果把点显示在二维坐标系,发现它们聚集在直线𝑦=2.5𝑥附近。


对这些点做旋转变换:用矩阵𝐀乘以每个点的坐标向量𝐱得到新的坐标向量𝜃。将所有的点旋转之后,得到下图的点。其中在𝑦方向的动态范围很小。

删除不重要维度,重构误差小。这就是变换编码的思想。

差分编码(预测编码)在空间域进行,而变换编码在变换域进行。变换将系数之间的相关性减弱,重要和不重要系数分开。下图给出了图像变换编码和解码的流程。

常见的变换(基函数)有:傅里叶变换、Walsh-Hadamard变换、离散余弦变换。下面是尺寸4X4的Walsh-Hadamard变换和离散余弦变换的基函数。

下面是尺寸8X8的离散余弦变换的基函数。

下图对比了三种基函数的压缩效果。三行分别对应傅里叶变换、Walsh-Hadamard变换、离散余弦变换。对于每一种变换,把一半不重要的系数置为0,然后做反变换得到重建图。最右边一列显示了两幅图像之间的差异。其中,第三行的误差最小。

JPEG图像压缩

JPEG是最常见的一种图像压缩技术,其核心是变换编码。将图像划分为许多子图(如 8 × 8 8 \times 8 8×8大小)。

将子图减去128,减小数值的动态范围。然后执行离散余弦变换,得到下面的矩阵 T T T

量化操作 T ^ ( u , v ) = round [ T ( u , v ) / Z ( u , v ) ] \hat T(u,v)= \text{round} [T(u,v)/Z(u,v) ] T^(u,v)=round[T(u,v)/Z(u,v)]。下面左侧为 Z Z Z矩阵,右侧为 T ^ \hat T T^

沿着下面的扫描顺序将矩阵元素转化为数列:
[-26 -3 0 -3 -2 -6 2 -4 1 -3 1 1 5 1 …-1 -1 EOB]。

这里EOB是End of Block的含义,表示后面全为0。第一项称为直流成分,其余项称为交流成分。交流成分使用霍夫曼编码。直流成分和其余 8 × 8 8\times8 8×8块的直流成分一起,进行预测编码。


直流成分实际上是块的均值,而相邻块的均值具有很高的相关性,可以被预测编码利用。下图为原图和放大八倍的块均值图像。

JPEG的解码步骤依次是符号解码、乘以量化矩阵 Z Z Z、离散余弦逆变换。下图对比了原始图像块和解压后的图像块,视觉上很相似,说明损失很小。

在用图像编辑软件保存JPEG图像时,会提示选择质量。质量高的JPEG图像,压缩比低;而质量低的JPEG图像,压缩比高。如何实现不同质量的压缩?一种简单的方法是调整 Z Z Z矩阵。例如,给 Z Z Z乘以一个正数q。q越大,压缩比越高。下图对比了 q = 1 q=1 q=1 q = 10 q=10 q=10时的压缩比和RMSE值。

下图对比了两幅图像的JPEG压缩效果。Lena图像的压缩比设为16:1,RMSE为6.6。指纹图像的压缩比设为6:1,RMSE为8.7。尽管指纹的压缩比低,但是误差却更大。原因是指纹的局部图中存在较高频率的成分,因此 T ^ \hat T T^的0比较少,压缩比不大。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值