[数字图像处理笔记] 第七章 图像压缩编码

您所在的位置:网站首页 图像压缩的几种方法 [数字图像处理笔记] 第七章 图像压缩编码

[数字图像处理笔记] 第七章 图像压缩编码

2024-07-13 04:19| 来源: 网络整理| 查看: 265

1. 概述

数字图像的压缩是指在不同用途的图像质量要求下,用最少的比特数表示一幅图像的技术。

数字图像的压缩是 实现图像存储和传输的基础。目的是 节省图像存储容量、减少传输信道容量、缩短图像加工处理时间。

1.1 信息量与信息熵 1.1.1 信息量

设信息源 \(X\) 可发出的消息符号集合为 \(A = \{a_i | i = 1, 2, ... , m\}\)

设符号 \(a_i\) 的概率为 \(p(a_i)\),则定义符号出现的自信息量为:

\[I(a_i) = -\text{log} \; p(a_i) \]

特别地,上式中的 对数取2为底,这时定义的信息量单位为 “比特”(bit) 。

1.1.2 信息熵

对信息源 \(X\) 的各符号的自信息量 取统计平均,可得平均自信息量为:

\[H(X) = -\sum_{i=1}^m p(a_i) \text{log}_2 \; p(a_i) \]

\(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 压缩比

为了表明某种压缩编码的效率,引入 压缩比 这一概念:

\[c = \frac{b_1}{b_2} \]

其中 \(b_1\) 表示 压缩前 图像的 每个像素 的 平均比特数,\(b_2\) 表示 压缩后 图像的 每个像素 的 平均比特数。

一般情况下,压缩比 \(c\) 总是大于 \(1\) 的,\(c\) 越大则也压缩程度越高。

如图所示,为压缩前的 png 文件,和压缩后的 jpg 文件。

相关代码:

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}\))为:

\[L = \sum_{k=1}^mp(c_k)l(c_k) \]

1.4.3 编码效率

在一般情况下,编码效率往往可用下列简单公式表示:

\[\eta = \frac{H}{L} \]

其中,\(H\) 是原始图像的熵,\(L\) 是实际编码图像的平均码字长度。

1.4.4 冗余度

\(R\) 越小,说明可压缩的余地越小。

\[R = 1 - \eta \]

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。

一直搜索到叶子节点,构成该信号源符号的编码。

典型示例:

计算编码效率:

信息熵:\(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) = \int \int p(x, y)d(x, y) \text{d}x \text{d}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)\)。

3.2 预测编码和变换编码 3.2.1 预测编码

在图像压缩中,预测编码 建立在去除图像空间冗余和时间冗余的基础上,利用邻近像素间或相邻帧之间图像的高度相关性,在编码时,只对新的信息(预测误差信息)进行编码,从而提高压缩率。

预测编码器由 预测器、量化器 和 编码器 构成。

预测器(帧内和帧间预测)的目的是由过去的信息预测当前的信息。

量化器(有损和无损预测编码)是用来表示如何看待误差的问题的。

编码器 的目的在于对量化后的误差进行压缩,减少数据量。

预测器可分为 线性预测器 和 非线性预测器。

在图像编码中,为了提高预测效率,一般采用线性预测器。目前用得较多的是差值脉冲编码调制(DPCM)。

3.2.2 变换编码

基本原理和步骤如下:

变换编码基于图像变换技术,首先将一幅 \(N×N\) 大小的图像 分割 成 \((N/n)^2\) 个子图像。

然后对子图像进行 变换 操作,解除子图像像素间的相关性,达到 用少量的变换系数 包含 尽可能多的图像信息 的目的。

接下来的 量化 步骤是有选择地 消除或粗量化 带有 很少信息的变换系数 ,因为它们对重建图像的质量影响很小。

最后是 编码,一般用变长码对量化后系数进行编码。

基于 \(\text{DCT}\) 的图像压缩编码:

DCT具有把高度相关数据能量集中的能力,这一点和傅里叶变换相似,且DCT得到的变换系数 实数,因此广泛用于图像压缩。

DCT系数集中在 低频区域 ,越是 高频区域系数值越小。

通过设置不同的视觉阈值或量化电平,将 许多能量较小的高频分量量化为0,可以增加变换系数中“0”的个数,同时 保留能量较大的系数分量,从而获得进一步的压缩。

3.3 矢量量化编码

矢量量化编码技术 是一种 有损压缩技术,根据一定的失真测度 在码书中搜索 出与输入矢量失真 最小的码字的索引,传输时 仅传输这些码字的索引,接收方根据码字索引在码书中查找对应码字,再现输入矢量。

矢量量化的过程如图所示,可以分为 量化 和 反量化 两部分。

矢量量化中的一个 关键问题 就是 码书的设计。

码书的设计越适合待编码的图像的类型,矢量量化器的性能就越好,因为实际中不可能为每一幅待编码的图像单独设计一个码书,所以通常是以一些代表性的图像构成的训练集为基础,为一类图像设计出一个码书。

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,未经允许严禁转载



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3