目录

编解码过程

1. 预处理和后处理

3 量化

4 EBCOT(核心)


编解码过程

编解码过程,参看如下两图。接下来是,每个部分的详细介绍。

 

android jpeg 解码 jpeg2000解码_算法

android jpeg 解码 jpeg2000解码_计算机视觉_02

1. 预处理和后处理

 

android jpeg 解码 jpeg2000解码_android jpeg 解码_03

a. 图像分块与拼接

与JPEG不同,JPEG 2000算法并不需要将图像强制分成8×8的小块。但为了降低对内存的需求和方便压缩域中可能的分块处理,可以将图像分割成若干互不重叠的矩形块(tile)。分块的大小任意,可以整个图像是一个块,也可以一个像素是一个块。一般分成2 ^6~12×2 ^6~12(即64~1024像素宽)的等大方块,不过边缘部分的块可能小一些,而且不一定是方的。
图像分块的大小会影响重构图像的质量。一般来说,分块大比分块小的质量要好一些。 在解码过程的后处理中,需要将分块的图像数据,重新无缝地拼接在一起.
b. 数据偏移和归一化处理

android jpeg 解码 jpeg2000解码_图像处理_04

android jpeg 解码 jpeg2000解码_计算机视觉_05

c. 图像数据划分和分片(可选)

参见简述JPEG2000中网格划分

d. 分量变换(可选)

android jpeg 解码 jpeg2000解码_图像处理_06

指对具有多个分量的图像先经过某种变换来降低各分量之间的相关性。将传统的RGB(红绿蓝)色域转换至其他色彩空间。Cr和Cb是差值图像,直方图在零点附近有很高的峰值。

2. 小波变换

无损压缩,采用整数小波变换,初始数值范围

android jpeg 解码 jpeg2000解码_小波变换_07

 有损压缩,采用实数型小波变换,初始数值范围

android jpeg 解码 jpeg2000解码_小波变换_08

 小波变换作用:生成大量0或者接近0的的小波变换系数。
JEPG2000中小波变换采用了两种实现方式:基于卷积和提升机制。还采用了基于行的变换。基于卷积的小波变换,得到的图像小波系数是浮点数,是有损编码。基于提升机制的小波变换,是整数到整数的小波变换,第二代小波。
流程:小波变换——阈值处理——逆小波变换。 阈值处理:小波细节系数低于一个阈值,当做0处理。

android jpeg 解码 jpeg2000解码_小波变换_09

android jpeg 解码 jpeg2000解码_图像处理_10

3 量化

嵌入式恒域标量量化。有损压缩时,进行。

4 EBCOT(核心)

最佳截断嵌入码块编码 (embedded block coding with optimized truncation,EBCOT)是David Taubman在1999年发表的一种编码算法。

JPEG2000的小波系数量化编码采用EBCOT编码,EBCOT量化编码是JPEG2000标准的核心,是一种小波系数的嵌入式比特层编码方法。

EBCOT编码分为两部分:第1部分tierl,将每个子带划分为独立的编码块,然后对每个编码块独立进行嵌入式编码扫描,每个编码块的比特层编码,最后对编码扫描结果进行MQ算术编码,得到嵌入式码流;第2部分tier2,根据输出码率的要求组合每个编码块的嵌入式码流,对所有编码块的编码流进行优化截断排序打包等处理,得到JPEG2000码流

EBCOT嵌人式比特层编码主要包括嵌入式比特层编码、优化截断位流排序和MQ算术熵编码。MQ编码 MQ(Multiple Quantization多路量化)编码是一种用于二进制数据的自适应算术编码。

简述JPEG2000中网格划分
JPEG2000中,Component, Tile, Layer, Packet, Tile-part, Sub-band, Code-block, Precinct, Bit-plane之间的关系如下图所示:

关系图

android jpeg 解码 jpeg2000解码_计算机视觉_11

每个图像由不同的分量(component)组成。

每个分量又可以划分为若干个分量片(tile-component)。对于每个分量片进行小波变换,进行不同层次的分解,从而得到不同分辨率级别的子带(sub-band)(一般分解层次D=5就足够获得对于全分辨率图像的近于理想的压缩性能),如下图所示。

n级小波变换后就有n+1个分辨率,每个分辨率有3个子带(除去最低分辨率只有1个子带)。

android jpeg 解码 jpeg2000解码_计算机视觉_12


区(precinct)的划分是对特定的片、分量和分辨率进行的。比如说我们定义的区大小为(2PPx,2PPy),将分辨率r划分如图3所示,其中分辨率r的原点是(trx0,try0),右下角是(trx1-1,try1-1)。实际上,可以在分辨率级别上直接进行区的划分,而码块(code-block)则是在区上进行划分的。如下图所示。

android jpeg 解码 jpeg2000解码_计算机视觉_13

android jpeg 解码 jpeg2000解码_小波变换_14

区的划分

区的实际划分

注意:虽然我们说得分辨率r划分为3个子带(最低分辨率为1个子带),但实际上我们的分辨率是一个矩形,对于r不是最低分辨率时,实际包含了nHH、nHL、nLH、nLL这四个子带,但由于nLL是分配给下一分辨率的,所以实际上只处理nHH、nHL、nLH这三个子带。

数据包为单位记录在码流中。每个数据包就包含了特定的切片、层、分量、分辨率和区的数据。对于给定的切片、层、分量和分辨率r,这个分辨率r中的每个HL、LH、HH都相应分成区。每个区独立划分编码块和独立编码、打包。这样,万一在传输中一个数据包发生了误码,也不至于影响了其它包的数据。
参考:

introduction ondata compression,fourth edition.David Taubman和MichaelMarcellin 都非常参与JPEG 2000开发,写了JPEG2000:Image Compression Fundamentals,Practice andStandards,Kluwer Academic Publishers,2001,它都是一本关于图像压缩的教科书,并且是标准的解释。不仅,但它附带了早期版本的kakadu软件,包括源代码。