[数字图像处理笔记] 第七章 图像压缩编码
1. 概述
数字图像的压缩是指在不同用途的图像质量要求下,用最少的比特数表示一幅图像的技术。
数字图像的压缩是 实现图像存储和传输的基础。目的是 节省图像存储容量、减少传输信道容量、缩短图像加工处理时间。
1.1 信息量与信息熵
1.1.1 信息量
设信息源 \(X\) 可发出的消息符号集合为 \(A = \{a_i | i = 1, 2, ... , m\}\)
设符号 \(a_i\) 的概率为 \(p(a_i)\),则定义符号出现的自信息量为:
特别地,上式中的 对数取2为底,这时定义的信息量单位为 “比特”(bit) 。
1.1.2 信息熵
对信息源 \(X\) 的各符号的自信息量 取统计平均,可得平均自信息量为:
\(H(X)\) 称为信息源 \(X\) 的 熵 (entropy),用以 衡量信息的不确定性。
可以理解为信息源发出的一个符号所携带的平均信息量,单位为比特/符号。
在无失真信源编码中,信息熵给出了 无失真编码时每个符号所需平均码长的下限。
相关代码:
I = imread('1.png');
I = imresize(I, [256 256]);
I = im2double(I);
xh = hist(I(:), 256);
xh = xh / sum(xh(:));
i = find(xh);
h = -sum(xh(i) .* log2(xh(i)));
fprintf("%f\n\n", h);
例如运行结果为 h = 7.3333。
说明对该图像进行无失真编码,其平均码长一定不会小于7.3333。
1.2 数据冗余
通常 一副图像中的各像素点之间存在一定的相关性。特别是 在活动图像 中,由于两幅相邻图像之间的时间间隔很短,因此这 两幅图像信息中包含了大量的相关信息。这些就是图像信息中的 冗余。
-
空间冗余
图像数据中最基本的冗余。要去除这种冗余,人们通常将其视为一个整体,并用极少的数据量来表示,从而减少邻近像素之间的空间相关性,以达到数据压缩的目的 。
-
时间冗余
活动图像和语音数据 中经常存在的一种冗余。由于活动图像序列中的任意两相邻的图像之间的时间间隔很短,因此 两幅图像中存在大量的相关信息。
-
信息熵冗余
针对数据的信息量而言。设某种编码的平均码长为:
\[L = \sum_{i=0}^{k-1}p(s_i)l(s_i) \]其中 \(l(s_i)\) 为分配给第 \(s_i\) 符号的比特数,及对应的信息量。
\(p(s_i)\) 为符号 \(s_i\) 出现的概率。此压缩的目的是要使 \(L\) 接近 \(H(X)\) ,但实际上 \(L ≥ H(X)\) ,即描述某一信息的比特数 大于 理论上表示该信息所需要的最小比特数。
-
视觉冗余
由于人眼的视觉特性所限,人眼不能完全感觉到图像画面的所有细小的变化。
图像压缩 后,虽然 丢了一些信息,但从人眼的 视觉上 并 未感受到其中的变化,而仍认为图像具有良好的质量。
-
结构冗余
存在着非常强的纹理结构,使图像在结构上产生了冗余。
-
知识冗余
随着人们认识的深入,某些图像所具有的先验知识,如人脸图像的固有结构(包括眼、耳、鼻、口等)为人们所熟悉。这些由先验知识得到的规律结构就是知识冗余。
1.3 图像压缩编码方法
从 信息论 的角度区划分:
-
无失真压缩编码
利用图像信源概率分布的不均匀性,通过 变长编码来减少信源数据冗余,使编码后的图像数据接近其信息熵而不产生失真,因而也通常被称为 熵编码。
-
\(\text{Huffman}\) 编码
-
算术编码
-
游程编码
-
-
有限失真编码
根据人眼视觉特性,在 允许图像产生一定失真 的情况下,利用图像信源在空间和时间上具有较大的相关性这一特点,通过某一种 信号变换来消除信源的相关性、减少信号方差,达到压缩编码的目的。
-
预测编码
-
变换编码
-
矢量量化编码
-
1.4 图像压缩性能指标
1.4.1 压缩比
为了表明某种压缩编码的效率,引入 压缩比 这一概念:
其中 \(b_1\) 表示 压缩前 图像的 每个像素 的 平均比特数,\(b_2\) 表示 压缩后 图像的 每个像素 的 平均比特数。
一般情况下,压缩比 \(c\) 总是大于 \(1\) 的,\(c\) 越大则也压缩程度越高。
如图所示,为压缩前的 png 文件,和压缩后的 jpg 文件。
![](https://img2023.cnblogs.com/blog/3039354/202312/3039354-20231212230358327-502660291.png)
![](https://img2023.cnblogs.com/blog/3039354/202312/3039354-20231212230412748-1875007082.png)
相关代码:
I = imread('1.png');
imwrite(I, '11.jpg');
info1 = dir('1.png');
info2 = dir('11.jpg');
b1 = info1.bytes;
b2 = info2.bytes;
c = b1 / b2;
subplot(1, 2, 1);
imshow('1.png');
subplot(1, 2, 2);
imshow('11.jpg');
fprintf("%d %d %f\n\n", b1, b2, c);
1.4.2 平均码字长度
设 \(l(c_k)\) 为数字图像第 \(k\) 个码字 \(C_k\) 的长度(编码成二进制码的位数),其相应出现的概率为 \(p(c_k)\) ,则该数字图像所赋予的平均码字长度(单位为\(\text{bit}\))为:
1.4.3 编码效率
在一般情况下,编码效率往往可用下列简单公式表示:
其中,\(H\) 是原始图像的熵,\(L\) 是实际编码图像的平均码字长度。
1.4.4 冗余度
\(R\) 越小,说明可压缩的余地越小。
1.5 保真度准则
-
客观保真度准则
当损失的信息量 可表示成输入图像,或者 先被压缩而后又被解压缩获得的输出图像 时,称该函数是基于 客观保真度准则 的。
假设 \(f(x, y)\) 表示原图像,\(\hat f(x, y)\) 表示先被压缩后又被解压缩的输出图像。
对于任意 \(x, y\) ,\(f(x, y)\) 和 \(\hat f(x, y)\) 之间的误差定义如下:
\[e(x, y) = \hat f(x, y) - f(x, y) \]两幅图像的总误差定义如下:
\[E = \sum_{x=0}^{M-1} \sum_{y=0}^{N-1}[\hat f(x, y) - f(x, y)] \]\(f(x, y)\) 和 \(\hat f(x, y)\) 之间的均方根误差:
\[e_{ms} = \sqrt{\frac{1}{MN}\sum_{x=0}^{M-1} \sum_{y=0}^{N-1}[\hat f(x, y) - f(x, y)]^2} \]\(f(x, y)\) 和 \(\hat f(x, y)\) 之间的均方根信噪比:
\[SNR_{ms} = \frac{\sum_{x=0}^{M-1}\sum_{y=0}^{N-1}\hat f(x, y)^2}{\sum_{x=0}^{M-1}\sum_{y=0}^{N-1}[\hat f(x, y) - f(x, y)]^2} \]
-
主观保真度准则
通过一组观察者提供的原图像和解压缩图像的质量评价,并综合他们的评价结果进行平均,得出 统计平均意义 下的结果。
2. 无失真图像压缩编码
2.1 Huffman 编码
基本步骤:
-
把输入的信号源按照概率值大小排序从上到下排列。
-
取出 两个最小概率 的,进行概率相加,并重新加入到序列中。
-
重复步骤2,直到最后剩下两个概率为止。
-
从形成的二叉树的根节点开始,逐步向前编码。一般情况下,概率较大的一个分支为 0,概率较小的一个分支为 1。
-
一直搜索到叶子节点,构成该信号源符号的编码。
典型示例:
![](https://img2023.cnblogs.com/blog/3039354/202312/3039354-20231212230431485-1533273374.png)
![](https://img2023.cnblogs.com/blog/3039354/202312/3039354-20231212230442551-585654085.png)
计算编码效率:
信息熵:\(H = -\sum_{k=1}^Mp_k \text{log}(p_k)\)
平均码长:\(L = \sum_{k=1}^Mp_k \; l_k\)
编码效率:\(\eta = \frac{H}{L}\)
特点:
-
哈夫曼编码所构造的码并 不是唯一 的,但其 编码效率是唯一的。
-
对不同信源,其编码效率是不同的。
-
实现电路复杂,且存在误码传播问题。
-
哈夫曼编码只能用 近似的整数 而不是理想的小数来 表示单个符号。
2.2 游程编码
当图像不太复杂时,往往存在着灰度或颜色相同的图像子块。
由于图像编码是按照顺序对每个像素进行编码的,因而会存在多行的数据具有相同数值的情况,这样可只保留两连续相同像素值和像素点数目。这种方法就是 游程编码。
以一个具体的二值序列为例。已知一个二值序列00101110001001,根据游程编码的规则,可知其游程序列为21133121。可见图像中具有相同灰度(或颜色)的图像块越大、越多,压缩的效果就越好,反之当图像越复杂,即其中的颜色层次越多时,则其压缩效果越不好,因此对于复杂的图像,通常采用游程编码与哈夫曼编码的混合编码方式,即首先进行二值序列的游程编码,然后根据“0”游程与“1”游程长度的分布概率,再进行哈夫曼编码。
2.3 算术编码
算术编码 不是将单个信源符号映射成一个码字,而是把 整个信源表示为实数线上的0到1之间的一个区间,其 长度等于该序列的概率。
采用算术编码,每个符号的平均编码长度可以为小数。
基本步骤如下:
-
初始化数据,为每个可能输入的符号分配一个概率。设置初始 编码区间 为 \([0.0, 1.0)\),左区间记为 \(low\),右区间记为 \(high\),当前的编码区间的长度记为 \(range = high - low\)
-
对于每个输入的编码,找到当前符号对应的 初始概率区间 \([low_p, high_p)\),进行 编码区间 的更新:
\[\begin{cases} low = low + range \times low_p \\ high = low + range \times high_p \end{cases} \]即
-
更新后的 \(low\) 等于 上一次的 \(low\) 加上 上一次的编码区间长度 \(range\) 乘 当前符号对应的初始概率区间 的 \(low_p\)
-
更新后的 \(high\) 等于 上一次的 \(low\) 加上 上一次的编码区间长度 \(range\) 乘 当前符号对应的初始概率区间 的 \(high_p\)
-
-
对于输入序列的符号,重复步骤2,不断减小编码区间
-
当所有输入符号已经被编码,选择编码区间内的任何一个数作为整个输入序列的编码。为了解码方便,通常选择区间的中点。
典型示例:
已知四个符号 \(X1、X2、X3、X4\),它们出现的概率分别为 \(1/5、1/5、2/5、1/5\),假设输入的消息序列为:\(X1、X3、X4、X3\),求其算术编码的小数形式。
由题意可以将符号初始概率区间划分为:
\(X1: [0, 0.2)\)
\(X2: [0.2, 0.4)\)
\(X3: [0.4, 0.8)\)
\(X4: [0.8, 1)\)
初始情况编码区间 \(low = 0,high = 1, range = 1\)。
-
第一个输入的符号 \(X1\),其对应的初始概率区间是 \([low_p, high_p) = [0, 0.2)\):
\[\begin{cases} low = low + range \times low_p = 0 + 1 \times 0 = 0 \\ high = low + range \times high_p = 0 + 1 \times 0.2 = 0.2 \end{cases} \]更新得到当前的编码区间为 \([low, high) = [0, 0.2), range = 0.2\)
-
第二个输入的符号 \(X3\),其对应的初始概率区间是 \([low_p, high_p) = [0.4, 0.8)\):
\[\begin{cases} low = low + range \times low_p = 0 + 0.2 \times 0.4 = 0.08 \\ high = low + range \times high_p = 0 + 0.2 \times 0.8 = 0.16 \end{cases} \]更新得到当前的编码区间为 \([low, high) = [0.08, 0.16), range = 0.08\)
-
第三个输入的符号 \(X4\),其对应的初始概率区间为 \([low_p, high_p) = [0.8, 1)\):
\[\begin{cases} low = low + range \times low_p = 0.08 + 0.08 \times 0.8 = 0.144 \\ high = low + range \times high_p = 0.08 + 0.08 \times 1 = 0.16 \end{cases} \]更新得到当前的编码区间为 \([low, high) = [0.144, 0.16), range = 0.016\)
-
第四个输入的符号 \(X3\),其对应的初始概率区间为 \([low_p, high_p) = [0.4, 0.8)\):
\[\begin{cases} low = low + range \times low_p = 0.144 + 0.016 \times 0.4 = 0.1504 \\ high = low + range \times high_p = 0.144 + 0.016 \times 0.8 = 0.1568 \end{cases} \]更新得到最后的编码区间为 \([0.1504, 0.1568)\)
故可以选取这个区间内的任意值作为最终的算术编码,可取 \(0.1536\)
算术编码的特点:
-
由于实际的计算机 精度 不可能无限长,运算中 会出现溢出问题。
-
算术编码器对整个消息只产生一个码字,这个码字是在 \([0,1)\) 之间的一个实数,因此译码器必须在接收到这个实数后才能译码。
-
算术编码也是一种对错误很敏感的方法。
3. 有限失真图像压缩编码
无失真图像压缩编码 的 平均码长存在一个下限,就是信息熵。
无失真编码的压缩比不可能很高,而在 有限失真图像编码方法中,则 允许有一定的失真存在,因而可以 大大提高压缩比。
需要关注的是,在失真不超过某种极限的情况下,所允许的编码比特率的下限是多少。
3.1 率失真函数
率失真函数 是指在信息源一定的情况下使信号的失真 小于或等于 某一值 \(D\) 所必需的最小的信道容量,率失真函数 常用 \(R(D)\) 表示。\(D\) 代表所允许的失真,对连续信息源的编码与传输,可以用 失真度量函数 \(d(x,y)\) 和 失真函数 \(D(x,y)\) 表示,即:
失真度量一般有如下几种:
-
均方误差
\[d(x, y) = \frac{1}{T}\int_{0}^T [x(t) - y(t)]^2 \text{d}t \] -
绝对误差
\[d(x, y) = \frac{1}{T} \int_{0}^{T} |x(t) - y(t)| \text{d}t \] -
频域率加权误差
-
超视觉阈值均方误差
率失真函数的一些性质:
-
当 \(D < 0\) 时,不存在 \(R(D)\)。
-
当 \(D ≥ D_{max}\) 时, \(R(D) = 0\), 表示此时所传输的数据信息毫无意义。
-
当 \(0 < D < D_{max}\) 时, \(R(D)\) 是一个下凸型连续函数。
-
连续信源,当 \(D\) 趋于 \(0\)时, \(R(D)\) 趋于无穷大。
-
离散信源, \(R(D) = H(X)\)。
![](https://img2023.cnblogs.com/blog/3039354/202312/3039354-20231212230521142-290262022.png)
3.2 预测编码和变换编码
3.2.1 预测编码
在图像压缩中,预测编码 建立在去除图像空间冗余和时间冗余的基础上,利用邻近像素间或相邻帧之间图像的高度相关性,在编码时,只对新的信息(预测误差信息)进行编码,从而提高压缩率。
预测编码器由 预测器、量化器 和 编码器 构成。
-
预测器(帧内和帧间预测)的目的是由过去的信息预测当前的信息。
-
量化器(有损和无损预测编码)是用来表示如何看待误差的问题的。
-
编码器 的目的在于对量化后的误差进行压缩,减少数据量。
预测器可分为 线性预测器 和 非线性预测器。
在图像编码中,为了提高预测效率,一般采用线性预测器。目前用得较多的是差值脉冲编码调制(DPCM)。
3.2.2 变换编码
基本原理和步骤如下:
变换编码基于图像变换技术,首先将一幅 \(N×N\) 大小的图像 分割 成 \((N/n)^2\) 个子图像。
然后对子图像进行 变换 操作,解除子图像像素间的相关性,达到 用少量的变换系数 包含 尽可能多的图像信息 的目的。
接下来的 量化 步骤是有选择地 消除或粗量化 带有 很少信息的变换系数 ,因为它们对重建图像的质量影响很小。
最后是 编码,一般用变长码对量化后系数进行编码。
![](https://img2023.cnblogs.com/blog/3039354/202312/3039354-20231212230535513-544478225.png)
基于 \(\text{DCT}\) 的图像压缩编码:
DCT具有把高度相关数据能量集中的能力,这一点和傅里叶变换相似,且DCT得到的变换系数 实数,因此广泛用于图像压缩。
DCT系数集中在 低频区域 ,越是 高频区域系数值越小。
通过设置不同的视觉阈值或量化电平,将 许多能量较小的高频分量量化为0,可以增加变换系数中“0”的个数,同时 保留能量较大的系数分量,从而获得进一步的压缩。
3.3 矢量量化编码
矢量量化编码技术 是一种 有损压缩技术,根据一定的失真测度 在码书中搜索 出与输入矢量失真 最小的码字的索引,传输时 仅传输这些码字的索引,接收方根据码字索引在码书中查找对应码字,再现输入矢量。
矢量量化的过程如图所示,可以分为 量化 和 反量化 两部分。
![](https://img2023.cnblogs.com/blog/3039354/202312/3039354-20231212230552486-277125188.png)
矢量量化中的一个 关键问题 就是 码书的设计。
码书的设计越适合待编码的图像的类型,矢量量化器的性能就越好,因为实际中不可能为每一幅待编码的图像单独设计一个码书,所以通常是以一些代表性的图像构成的训练集为基础,为一类图像设计出一个码书。
4. 图像编码新技术
4.1 子带编码
子带编码 是一种在频率域中进行数据压缩的算法。
首先在发送端将图像信号在频率域 分成若干子带,然后分别对这些子带信号进行 频带搬移,将其转换成 基带信号,再根据奈奎斯特定理对各基带信号进行 取样、量化和编码,最后 合并成为一个数据流进行传送。
4.2 模型基编码
模型基编码 是一种参数编码方法。
它与基于保持信号原始波形的所谓波形编码相比有着本质区别。相对于对像素进行编码而言,对参数的编码所需的比特数要少得多,因此可以节省大量的编码数据。
模型基编码主要依据对图像内容的先验知识的了解。
编码器 对图像内容进行复杂的分析,并借助于一定的模型,用一系列模型的参数对图像内容进行描述,并把这些参数进行编码传输到解码器。
解码器 根据接收到的参数和用同样方法建立的模型可以重建图像的内容。
4.3 分形编码
分形编码 中,使用了 迭代函数(IFS)理论、仿射理论和拼贴定理。
5. 图像压缩技术标准
5.1 JPEG压缩
JPEG是用于彩色和灰度静止图像的一种完善的有损/无损压缩方法,对 相邻像素颜色相近的连续色调图像的效果很好,而用于 处理二值图像效果较差。
5.2 JPEG 2000
JPEG2000 主要由6个部分组成,其中,第一部分为 编码的核心部分,具有最小的复杂性,可以满足80%的应用需要,其地位相当于JPEG标准的基本系统,是公开并可免费使用的。
第二至第六部分则定义了压缩技术和文件格式的扩展部分,包括 编码扩展,MotionJPEG2000,一致性测试,参考软件,混合图像文件格式。
一切都是命运石之门的选择,本文章来源于博客园,作者:MarisaMagic,出处:https://www.cnblogs.com/MarisaMagic/p/17898087.html,未经允许严禁转载