JPEG2000标准中的编码算法详解
1. 引言
在离散小波变换(DWT)和量化之后,JPEG2000的编码阶段分为两个步骤:一级编码(Tier - 1 coding)和二级编码(Tier - 2 coding)。一级编码中,每个码块独立进行熵编码;二级编码则使用标签树编码机制对一级编码生成的压缩码字信息进行编码。
JPEG2000中的熵编码是分数位平面编码(BPC)和二进制算术编码(BAC)的结合,即一级编码。下面将详细介绍分数位平面编码技术。
2. 编码数据分区
在熵编码过程中,每个小波子带会进一步划分为多个码块。此时,所有子带中的元素都以整数的符号和幅度表示,而非二进制补码。码块的维度始终是2的幂次方,最小高度和宽度为4,最大高度和宽度为1024。并且,如果码块的高度为$2^x$,宽度为$2^y$,则$x + y$限制为小于或等于12。典型的码块大小选择是64 x 64或32 x 32。实验发现,当码块尺寸选择小于16 x 16时,压缩性能会下降。JPEG2000第1部分修正案的0配置文件进一步将码块大小限制为32 x 32或64 x 64。
在编码阶段,每个码块会分解为多个位平面。如果子带的精度为P位,则子带中的每个码块会分解为P个位平面。位平面编码(BPC)应用于码块的每个位平面,生成上下文和二进制决策值形式的中间数据,这些中间数据作为二进制算术编码(BAC)的输入,生成最终的压缩比特流。
3. JPEG2000中的一级编码
JPEG2000采用了David S. Taubman的嵌入式块编码与优化截断(EBCOT)算法来实现位平面编码。该算法利用位平面内和位平面间的对称性和冗余性,以最小化需要维护的统计信息,并减少二进制算术编码生成的编码比特流。
EBCOT对每个位平面进行三次编码,每次编码一部分位平面,且各部分不重叠,因此也称为分数位平面编码。三次编码的顺序和内容如下:
1.
重要性传播编码(Significance Propagation Pass,SPP)
:对首次出现幅度为1的位位置(即对应样本系数的最高有效位)进行编码。
2.
幅度细化编码(Magnitude Refinement Pass,MRP)
:对在重要性传播编码中未编码且在之前位平面中幅度为1的位位置(即当前位不是对应样本系数的最高有效位)进行编码。
3.
清理编码(Cleanup pass,CUP)
:对前两次编码中未编码的位位置进行编码。此过程还采用了一种游程编码形式,以帮助编码连续的零。
4. 分数位平面编码
为了便于理解这个复杂的算法,下面先给出相关术语的定义,然后解释四种基本编码操作和三次编码过程。
4.1 术语定义
- 码块(y) :二维数组,由整数(小波系数,可能经过量化)组成。每个码块有指定的宽度和高度,其中的整数可以是正数、零或负数。码块的每个元素与$\sigma$、$\sigma’$和$\tau$相关联,用于表示其编码状态。
- 符号数组(x) :二维数组,与码块维度相同,用于表示码块元素的符号。对于码块中的元素$y[m, n]$,符号数组元素$x[m, n]$定义如下:
- 当$y[m, n] < 0$时,$x[m, n] = 1$;
-
否则,$x[m, n] = 0$。
当在编码或解码过程中引用$x[m, n]$时,如果$m$或$n$超出码块范围,$x[m, n]$始终设为0。 - 幅度数组(w) :二维无符号整数数组,与码块维度相同。每个元素表示码块中对应位置整数的绝对值,即$w[m, n] = |y[m, n]|$。$w^P[m, n]$表示$w[m, n]$的第P位。
- 位平面 :幅度数组$w$可以看作三维数组,第三维是整数的位序列。每个特定顺序的位构成一个单独的位平面,也可将$w$视为由多个位平面组成的一维数组。只有包含至少一个1的最高有效位平面以及后续的所有位平面才会被编码,全为0的位平面(除非有更高有效位平面包含至少一个1)会被忽略,这些未编码的位平面称为“前导零位平面”。用$v^P[m, n]$表示码块位平面P中空间位置$(m, n)$的位。
- 扫描模式 :定义了对码块位平面进行编码或解码的顺序。码块的扫描模式可概念上分为多个部分(或条带),每个部分包含连续的四行(从码块的第一行开始)。如果码块的总行数不是4的倍数,除最后一部分外,其他部分都有四行。扫描从第一部分开始,向下到最后一部分,直到对码块的所有元素进行编码或解码。每个部分从第一列的第一行开始扫描,按列依次进行。JPEG2000第1部分还规定了另一种扫描模式——垂直因果模式,在该模式下,每个部分(4行x N列)被视为独立模块,即当前部分不会使用同一码块中不同部分的相邻元素信息。
- 状态变量$\sigma$、$\sigma’$和$\tau$ :三个二维“二进制”数组,与码块维度相同,用于表示编码过程中码块每个元素的编码状态。初始时,所有元素都设为0。编码过程中,$\sigma[m, n]$和$\sigma’[m, n]$的值可能根据特定条件变为1,但在整个码块编码完成前不会再变回0;而$\tau[m, n]$在每个位平面编码完成后会重置为0。具体解释如下:
- 当$\sigma[m, n] = 1$时,表示$v[m, n]$在第m行和第n列的第一个非零位已被编码;否则为0。当在编码或解码过程中引用$\sigma[m, n]$时,如果$m$或$n$超出范围或值无效,$\sigma[m, n]$等于0。
- 当$\sigma’[m, n] = 1$时,表示对$v[m, n]$应用了幅度细化编码操作;否则为0。
- 当$\tau[m, n] = 1$时,表示在重要性传播编码中对$v^P[m, n]$应用了零编码操作;否则为0。
- 首选邻域 :如果码块中的元素$y[m, n]$的八个相邻邻域中至少有一个值为1,则称该元素处于首选邻域。
- 零编码表 :有三个零编码表,用于零编码操作。零编码操作中生成的上下文信息基于被编码元素的八个邻域的重要性状态($\sigma$)的值。
以下是零编码表的示例:
| 子带类型 | 上下文标签 |
| ---- | ---- |
| LL和LH子带 | 具体值(根据邻域情况确定) |
| HL子带 | 具体值(根据邻域情况确定) |
| HH子带 | 具体值(根据邻域情况确定) |
4.2 编码操作
EBCOT中有四种可能的编码操作,用于生成上下文(CX)和决策(D)值,作为二进制算术编码的中间数据。CX是非负整数,D是二进制值(0或1)。这四种编码操作共使用19种不同的上下文值(0 - 18)。当前位平面的索引假设为P,这些操作的应用时机和位置取决于当前编码过程、当前元素的位置以及状态变量的状态。
-
零编码(ZC)
:决策位$D$等于$v^P[m, n]$,上下文$CX$从与码块所属子带(LH、HL或HH)相关的三个“零编码上下文表”中选择。每个上下文表有九个条目,根据当前系数位$v^P[m, n]$的八个周围邻域的重要性状态值推导得出。
-
符号编码(SC)
:$D$和$CX$由水平参考值$H$和垂直参考值$V$确定。假设当前扫描位置为$(m, n)$,$H$和$V$的值通过以下公式获得:
- $H = min[1, max(-1, v[m, n - 1] \times (1 - 2x[m, n - 1]) + v[m, n + 1] \times (1 - 2x[m, n + 1]))]$
- $V = min[1, max(-1, v[m - 1, n] \times (1 - 2x[m - 1, n]) + v[m + 1, n] \times (1 - 2x[m + 1, n]))]$
$H$和$V$的值表示三种可能情况:
- 0表示两个邻域都不重要,或两个邻域都重要但符号相反。
- 1表示一个或两个邻域重要且为正号。
- -1表示一个或两个邻域重要且为负号。
如下面的表格所示,$H$和$V$共同确定上下文(CX)和二进制值$z$,$D$的值通过$D = z \oplus x[m, n]$计算,其中$\oplus$表示异或操作。
| H \ V | -1 | 0 | 1 |
| ---- | ---- | ---- | ---- |
| -1 | 12 | 特定值 | 特定值 |
| 0 | 特定值 | 特定值 | 特定值 |
| 1 | 特定值 | 特定值 | 11 |
-
幅度细化编码(MRC)
:在第P位平面中,位置$(m, n)$的$D$等于位值$v^P[m, n]$。$CX$的值由$\sigma’[m, n]$和状态变量$\sigma$的八个相邻值的总和确定:
- 如果当前位置$\sigma’[m, n] = 1$,表示不是对该元素的第一次幅度细化,则$CX = 16$。
- 当$\sigma’[m, n] = 0$且其八个相邻邻域的$\sigma$值总和也为0时,$CX = 14$。
- 当$\sigma’[m, n] = 0$且其八个相邻邻域的$\sigma$值总和大于0时,$CX = 15$。
| $\sigma’[m, n]$ | $\sigma$相邻值总和 | CX |
| ---- | ---- | ---- |
| 1 | 任意 | 16 |
| 0 | 0 | 14 |
| 0 | >0 | 15 |
-
游程编码(RLC)
:与其他三种编码操作不同,游程编码可以对当前扫描模式条带中的一到四个连续位进行编码。具体编码的位数取决于四个连续位中第一个1位(如果有)的位置。如果所有位都是0,则对所有四位进行编码;如果其中一个(或多个)位是1,则对扫描模式中的第一个1位以及当前扫描位置与该1位之间的所有前导0进行编码。
- 游程编码操作可能生成一个或三个$D$值,取决于四个连续位是否全为0。如果全为0,第一个$D$等于0;否则等于1。在这两种情况下,$CX$都等于唯一的游程上下文值17。即$(CX, D)$对为$(17, 0)$表示四个连续的0位,$(CX, D)$对为$(17, 1)$表示当前扫描模式条带中至少有一个1位。
- 如果当前扫描模式中的四个位中至少有一个1位,还会使用两个额外的$D$值和“均匀”上下文值18来表示4位扫描模式中第一个1位的位置。由于扫描模式的高度为4,使用两位的零基索引足以表示第一个1位从顶部开始的位置。这两个$D$值分别表示该距离的最高有效位和最低有效位。
以下是一个简单的mermaid流程图,展示编码操作的大致流程:
graph TD;
A[开始] --> B{选择编码操作};
B -->|零编码| C[确定D和CX(根据零编码表)];
B -->|符号编码| D[计算H和V,确定D和CX];
B -->|幅度细化编码| E[根据σ'和邻域σ值确定CX,D = v^P[m, n]];
B -->|游程编码| F[根据位情况确定D和CX];
C --> G[输出D和CX];
D --> G;
E --> G;
F --> G;
G --> H[结束];
4.3 编码过程
有三种编码过程:重要性传播编码(SPP)、幅度细化编码(MRP)和清理编码(CUP)。
-
重要性传播编码(SPP)
:对首次出现幅度为1的位位置(即对应样本系数的最高有效位)进行编码。
-
幅度细化编码(MRP)
:对在重要性传播编码中未编码且在之前位平面中幅度为1的位位置(即当前位不是对应样本系数的最高有效位)进行编码。
-
清理编码(CUP)
:对前两次编码中未编码的位位置进行编码。此过程还采用了一种游程编码形式,以帮助编码连续的零。
下面是编码过程的简单表格总结:
| 编码过程 | 编码内容 |
| ---- | ---- |
| 重要性传播编码(SPP) | 首次出现幅度为1的位位置 |
| 幅度细化编码(MRP) | 之前未编码且之前位平面幅度为1的位位置 |
| 清理编码(CUP) | 前两次未编码的位位置,含游程编码 |
通过以上对JPEG2000中编码算法的详细介绍,我们可以看到其在数据分区、编码操作和编码过程等方面的设计,旨在实现高效的图像压缩。这些算法充分利用了图像数据的特点,通过合理的编码策略和操作,减少了数据冗余,提高了压缩性能。
JPEG2000标准中的编码算法详解
5. 二级编码(Tier - 2 coding)
在一级编码完成后,会得到各个码块的压缩码字信息。二级编码使用标签树编码机制对这些信息进行进一步编码。标签树编码机制能够有效地组织和编码一级编码产生的信息,以实现更高效的数据存储和传输。
6. 编码算法的优势与应用场景
JPEG2000的编码算法具有诸多优势,使其在不同的应用场景中表现出色。
1.
高压缩比
:通过EBCOT算法利用位平面的对称性和冗余性,减少了需要编码的数据量,从而实现了较高的压缩比。这使得在存储和传输图像时,可以节省大量的空间和带宽。
2.
渐进式传输
:由于采用了分数位平面编码,JPEG2000支持渐进式传输。在传输过程中,接收方可以先接收到图像的低分辨率版本,随着数据的不断传输,图像的质量逐渐提高。这种特性在网络带宽有限的情况下非常有用,用户可以在等待完整图像传输的同时,先对图像有一个大致的了解。
3.
感兴趣区域编码
:JPEG2000可以对图像中的特定区域(感兴趣区域)进行优先编码。通过调整编码参数,可以在保证感兴趣区域图像质量的前提下,对其他区域进行更高程度的压缩。这种特性在医学图像、遥感图像等领域有广泛的应用。
JPEG2000编码算法适用于以下应用场景:
1.
数字图书馆
:数字图书馆中存储了大量的图像资料,如古籍、地图等。JPEG2000的高压缩比和渐进式传输特性可以有效地节省存储空间,并提高用户查看图像的体验。
2.
医学影像
:医学影像(如X光、CT、MRI等)对图像质量要求较高,同时需要存储大量的图像数据。JPEG2000的感兴趣区域编码功能可以帮助医生更清晰地观察病变部位,同时减少数据存储和传输的压力。
3.
遥感图像
:遥感图像通常具有较大的尺寸和丰富的细节。JPEG2000的高压缩比和多分辨率特性可以有效地处理这些图像,便于数据的存储和分析。
7. 编码算法的实现要点
在实现JPEG2000编码算法时,需要注意以下几个要点:
1.
码块大小的选择
:码块大小对压缩性能有重要影响。实验表明,当码块尺寸小于16 x 16时,压缩性能会下降。JPEG2000第1部分修正案的0配置文件进一步将码块大小限制为32 x 32或64 x 64。在实际应用中,需要根据具体的图像特点和需求选择合适的码块大小。
2.
状态变量的维护
:在编码过程中,需要准确维护状态变量$\sigma$、$\sigma’$和$\tau$的值。这些变量用于记录每个元素的编码状态,对编码操作的选择和执行有重要影响。例如,在符号编码和幅度细化编码中,需要根据状态变量的值来确定上下文和决策值。
3.
扫描模式的选择
:JPEG2000支持两种扫描模式:常规模式和垂直因果模式。垂直因果模式在某些情况下可以提高编码效率,因为它将每个部分视为独立模块,减少了相邻部分之间的依赖。在实际应用中,需要根据图像的特点和编码需求选择合适的扫描模式。
8. 总结
JPEG2000标准中的编码算法通过一级编码和二级编码的结合,实现了高效的图像压缩。一级编码采用EBCOT算法进行分数位平面编码,利用位平面的对称性和冗余性,减少了编码数据量。二级编码使用标签树编码机制对一级编码产生的信息进行进一步编码。
以下是对整个编码过程的总结表格:
| 编码阶段 | 编码算法 | 编码内容 | 特点 |
| ---- | ---- | ---- | ---- |
| 一级编码(Tier - 1 coding) | EBCOT(分数位平面编码) | 对每个码块的位平面进行三次编码(SPP、MRP、CUP) | 利用位平面对称性和冗余性,减少编码数据量 |
| 二级编码(Tier - 2 coding) | 标签树编码机制 | 对一级编码产生的压缩码字信息进行编码 | 有效组织和编码信息 |
下面是一个mermaid流程图,展示JPEG2000编码的整体流程:
graph TD;
A[输入图像] --> B[离散小波变换和量化];
B --> C[一级编码(Tier - 1 coding)];
C -->|码块熵编码| D[生成压缩码字信息];
D --> E[二级编码(Tier - 2 coding)];
E -->|标签树编码| F[最终压缩比特流];
F --> G[输出压缩图像];
通过合理选择码块大小、维护状态变量和选择扫描模式等实现要点,可以进一步提高JPEG2000编码算法的性能。JPEG2000编码算法的高压缩比、渐进式传输和感兴趣区域编码等优势,使其在数字图书馆、医学影像、遥感图像等领域有广泛的应用前景。
超级会员免费看

4万+

被折叠的 条评论
为什么被折叠?



