Dict.CN 在线词典, 英语学习, 在线翻译

学海苦作舟,书山勤为径

留下点回忆

常用链接

统计

积分与排名

Denoise

English study

Web技术

数据压缩

一些连接

最新评论

JPEG2000中图像单元的定义

JPEG2000 中包括许多既定义的单元,主要有:

1.  画布

2.  分片( Tile

3.  子带( Subband

4.  分辨率层( Resolution

5.  分区 (Precinct)

6.  分区分割( Precinct partition, kakadu 中叫 precinct band

7.  码块( code block

8.  (packet

9.  层( layer

10.              分量( Component

11.              区域( Region

12.              渐进性( Progressive

下面来一一解释这些概念。

画布

画布是整个图像的参考网格,可以想象我们的图像就在这张画布上显示的;但必须明确一点就是,图像的原点未必就正好在画布的原点。可以形象的描述画布为许多网格,如下:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

这里需要注意的另一个问题是:图像的值并不是正好填充在每个网格上,可能以一定的间隔填充的。

在这里假设所有的分量采样间隔 S 都是 1

分量

这里的分量与我们通常所说的颜色分量是相同的,例如:对于 RGB 表示的像素值图像,有三个分量,如果是 24bit RGB ,那么每个分量使用 8bit 来表示。当然整个图像是由三个分量组成,因此每个分量都在画布上,而分量的填充间隔可以不一样。例如:jp2k_component.JPG

上图中包含两个分量的图像,但第一个分量(红色)的采样间隔是 4 ,第二个是 2 。对于我们常用的图像,分量采样的间隔( Subsampling )是一样的。

图像的在画布中使用两对坐标来表示位置:( E1 F1 );( E2 F2

由于分量的采样因子(间隔)不一样,所以每个分量的区域界限是不同的,一般可表示为:

Ec = Ei/Si

贴片(分片)

JPEG2000 引入分片这个概念是为了处理复合文档,因为有些区域包含图形,有些区域包含文字,分片之后对不同的区域采用不同的处理方法。例如:文字区域不需要 DWT ,直接压缩等。

对于一般压缩自然图像采用一个分片就足够了。

这里的分片与图像并非是坐标对齐的,其用 O1 O2 来表示原点在画布上的位置,用 T1 T2 表示每个分片的大小;每个分片必须与图像的区域有重叠。

使用 N1 N2 来表示分片的 Y 方向和 X 的数量,使用 t1 t2 来表示坐标,

其中 0<=t1<N1, 并且 0<=t2<N2

每个贴片在都有一个唯一的标示符号,其通过 t 来表示,计算如下:

t = t2+t1N2

注意:非 0 原点的目的方便于图像的裁剪处理。

 

贴片在画布中的区域

每个贴片在画布中对应的区域为:

E1_t = max (E1, O1+t1*T1); F1_t = min (F1, O1+t1*T1)

E2_t = max (E2, O2+t2*T2) F2_t = min (F2, O2+t2*T2)

O = 0 0

如果 E1 = 100 E2 = 100 F1 = 1000 F2 = 1000

O1 = 10 O2 = 10 T1 = 100 T2 = 100

因此:

N1 = F1-O1 /100 = 9 N2  = 9

那么 E1_t = max(100,10+t1*100), F1_t = min(1000,10+t2*100)

如果 t1 = 2, t2 = 3; 那么

该贴片的唯一表示为: t = t2+t1*N2 = 3+2*9= 21

E1_t = max (100, 10+2*100) = 210 F1_t = min (1000, 10+3*100) = 310

E2_t = max (100, 10+2*100) = 210 F2_t = min (1000, 10+3*100) = 310

jp2k_tile.JPG
当然,如果每个贴片对应到分量上时情况有所不同,因为不同分量的采样间隔不一样导致有的贴片并不包含分量值。

JPEG2000 中, DWT 变换是针对每个贴片分量的,如果有三个分量,那么每个分量调用 DWT 变换。

子带

子带是进行 DWT 子带变换的产物,这里以 2D 树结构为例来说明子带变换产生的子带。图中的每次 DWT 变换在 LLn 子带上进行,最初的图像可以认为是 LL0 子带,对 LL(n-1) 子带进行变化得到 n 级别的子带 4 个,分别是 LLn, HLn, LHn, HHn

HL 子带是水平高通滤波器产生的结果,因此水平方向上高频图像区域被保存了下来。

LH 子带是垂直高通滤波器产生的结果,因此垂直方向上高频图像区域被保存下来。

HH 是垂直和水平方向上都是高通的结果,因此是对角线方向的图像特性被保存下来。

LL 是图像的低频部分,也是图像的低分辨率版本。

LL3

HL3

HL2

HL1

LH3

HH3

LH2

HH2

LH1

HH1

 

子带在画布中的区域

E1_t_b = (E1_t – 2 d-1 b1)/2 d   E2_t_b = (E2_t – 2 d-1 b2)/2 d

F1_t_b = (F1_t- 2 d-1 b1)/2 d   F2_t_b = (F2_t- 2 d-1 b2)/2 d

其中 d 的取值范围是 1 D DWT LEVEL );而 b1 b2 的取值由子带决定:

LL 子带中: b1= b2= 0

HL 子带中: b1= 0 b2= 1

LH 子带中: b1= 1 b2= 0

HH 子带中: b1= 1 b2= 1

 

这里按照上面贴片的位置来计算子带在画布中区域。这里假设是 DWT LEVEL 2 ,也就是 d 等于 2

由于 E1_t = E2_t = 210, F1_t = F2_t = 310 ,那么对于 LL 子带:

E1_t_b_LL = (210-2 2-1 *0)/2 2 = 210/4 = 53

E2_t_b_LL = 53

F1_t_b_LL = (310-2 2-1 *0)/2 2 = 78

F2_t_b_LL = 78

 

对于 HL 子带:

E1_t_b_HL= (210-2 2-1 *0/2 2 = 210/4 = 53

E2_t_b_HL= (210-2 2-1 *1)2 2 = 208/4 = 52

F1_t_b_HL = (310-2 2-1 *0)/2 2 = 78

F2_t_b_HL = (310-2 2-1 *1)/2 2 = 77

 

对于 LH 子带:

E1_t_b_LH= (210-2 2-1 *1/2 2 = 210/4 = 52

E2_t_b_ LH = (210-2 2-1 *0)2 2 = 208/4 = 53

F1_t_b_ LH = (310-2 2-1 *1)/2 2 = 77

F2_t_b_HL = (310-2 2-1 *0)/2 2 = 78

对于 HH 子带:

E1_t_b_ HH = (210-2 2-1 *1/2 2 = 210/4 = 52   E2_t_b_HH = 52

F1_t_b_ HH = (310-2 2-1 *1)/2 2 = 77              F2_t_b_ HH = (310-2 2-1 *1)/2 2 = 77

 

上面的数都是取整数的结果,超出的部分取 1

实际上我们可以计算 d=1 时的 LL 子带边界就知道了:

E1_t_b_LL = (210-2 1-1 *0)/2 1 = 210/2 = 105

E2_t_b_LL = 105

F1_t_b_LL = (310-2 1-1 *0)/2 1 = 155

F2_t_b_LL = 155

 

可以看到 d=2 的子带和 d=1 的各子带之间的关系:

W_HL= F2_t_b_HL - E2_t_b_HL = 77-52 = 25

H_HL= F1_t_b_HL – E1_t_b_HL = 78-53 = 25

 

W_LH = F2_t_b_LH - E2_t_b_LH = 78-53 = 25

H_ LH = F1_t_b_ LH – E1_t_b_ LH = 77-52 = 25

 

W_HH = F2_t_b_HH –E2_t_b_HH = 77-52 = 25

H_HH = F1_t_b_HH – E1_t_b_HH = 77-52 = 25

 

W_LL = 78-53 = 25      H_LL = 78-53 = 25

 

我可以看到对于 d= 1 LL 子带宽度与 d=2 W_LL+W_HL 以及 W_LH+W_HH; 高度也是同样的。

下面来看 d= 3 的各子带参数:

对于 LL 子带有:

E1_t_b_LL = (210-2 3-1 *0)/2 3 = 210/8 = 27

E2_t_b_LL = 27

F1_t_b_LL = (310-2 3-1 *0)/2 3 = 39

F2_t_b_LL = 39

对于 HL 子带:

E1_t_b_HL= (210-2 3-1 *0/2 3 = 210/8 = 27

E2_t_b_HL= (210-2 3-1 *1)2 3 = 206/8 = 26

F1_t_b_HL = (310-2 3-1 *0)/2 3 = 39

F2_t_b_HL = (310-2 3-1 *1)/2 3 = 39

 

对于 LH 子带:

E1_t_b_LH= (210-2 3-1 *1/2 3 = 206/8 = 26

E2_t_b_ LH = (210-2 3-1 *0)2 3 = 210/4 = 27

F1_t_b_ LH = (310-2 3-1 *1)/2 3 = 39

F2_t_b_ LH = (310-2 3-1 *0)/2 3 = 39

对于 HH 子带:

E1_t_b_ HH = (210-2 3-1 *1/2 3= 210/4 = 26   E2_t_b_HH = 26

F1_t_b_ HH = (310-2 3-1 *1)/2 3 = 39              F2_t_b_ HH = (310-2 2-1 *1)/2 2 = 39

 

从这里我可以看到各子带不在一样大了:

LL 子带是: 12*12 HL 子带是 12*13 LH 13*12 HH 13*13 (高度先)。

他们的宽和高的和与 d=2 上的 LL 子带是相等的。

由于 LL_2 上的宽度和高度是 25 (奇数),所以导致这种情况,基本的过滤是:如果计算中的贴片坐标 E i _t 是偶数,那么最终低通部分比高通部分多一个样本,如果是奇数,那么高通子带比低通子带多 1 个样本。

 

另外一个问题必须注意:计算过后的子带边界比原来的贴片小,实际上由于每次子带变换,图像的分辨率都要缩小 1/2 ,所以在 d 级子带变化后,上得到的边界,必须乘上 2 d 才能与原贴片中的位置对应。那么对于 d=2 的情况,必须乘上 4 ,因此对于 d=2 的各子带在原图像中的实际位置为:

LL 子带的位置为:( 212 312 X 212 312

HL 子带的位置为:( 212 312 X 208 308

LH 子带的位置为:( 208 308 X 212 312

HH 子带的位置为:( 208 208 X 208 308

上面的表示方式是高度优先。

这里可以理解为 d 级上的子带是由原图中的 2 d 个样本变换得到。

分辨率层

上图显示的子带变换过程由 DWT LEVEL 来决定,而每个级别都是图像的低分辨率层。分辨率的级别与 DWT Level 的值相反, Level 最的时候,分辨率级别为 0 ,而原图像对应分辨率的最高级别。

每个分辨率级别包含 3 个子带,分别是 HL HH LH 0 层包括一个子带 LL

分辨率的区域边界

假设分辨率用 r 表示,总的 DWT 变换次数用 D 表示,那么对于每个分辨率的边界可表示为:

E i _R = E i _t/2 D-r

F i _R = F i _t/2 D-r

如果 D=3 r=2 ;那么按照上面的计算( E1_t=E2_t = 210, F1_t=F2_t = 310 ),分辨率层 2 的边界为:

E1_R_2 = 210/2 3-2 = 105      F1_R_2 = 310/2 3-2 = 155

E2_R_2 = 105      F2_R_2 = 155

如果 r=0 ,那么该分辨层的边界为:

E1_R_2 = 210/2 3-0 = 27        F1_R_2 = 310/2 3-0 = 39

E2_R_2 = 27        F2_R_2 = 39

每个分辨率级别的原点也是贴边的原点乘上: 2 -(D-r)

分区

为了提供渐进性, JPEG2000 提供了分区和分区分割的概念。

分区与贴片不同的地方在于分区不影响 DWT 变化,甚至不影响编码。另外分区的大小必须是 2 POWER ,而贴片的大小可以是任意的。

其将某个指定的分辨率层上进行分割,当然要求分区的每个块必须与图像的区域重叠。

一般某个分辨率层上有 3 个子带,这三个子带都是通过分区网格来划分的,当然每个子带

分区的大小用 P1 P2 来表示, P1 是高度, P2 是宽度。

N1_P :表示垂直方向分区的数量。

N2_P :表示水平方向分区的数量。

分区的原点用 O1_P,O2_P 表示,其可以不用与分辨率层的原点重叠;分区用垂直和水平方向的索引( p1,p2 )来表示;并且:

0<=p1<N1_P   0<= p2<N2_P

N1_P N2_P 有下面计算得到:

N1_P = (F1_R-O1_P)/P1

N2_P = (F2_R-O1_P)/P2

F1_R F2_R 表示当前分辨率层的右和下边界。如果他们是 0 ,那么 N1_P N2_P 必须是 0

jp2k_precinct.JPG

分区的区域

分区的区域用下面的表达式计算出来:

E1_P = max (E1_R, O1_P+P1*p1)

F1_P = min (F1_R, O1_P+P1*(p1+1))

 

E2_P = max (E2_R, O2_P+P2*p2)

F2_P = min (F2_R, O2_P+P2*(p2+1))

下面计算上面对于 D=3 r=2 分辨率上的分区( 1,3 )的边界;这里假设 O1_P = 90,O2_P = 100 ,并且 P1=8 P2=4

前面的计算中有 E1_R_2 = 105   F1_R_2 = 155  E2_R_2 = 105  F2_R_2 = 155

 

E1_P = max(105 90+1*8)= 105

F1_P = min (155,100+1*8) = 108

 

E2_P =max (105, 90+3*4) = 105

F2_P = min (155,100+3*4) = 112

 

分区分割

分区分割是将同一个分辨率层上三个子代( LL 子带外)上同一个位置的分区合并到一起的总称。实际上可以看出,这三块上的信息合并到一起在加上 LL 子带当前块,就可以恢复上一个分辨率级别上 LL 子带该位置的样本。当然映射到上一个分辨率层的时候需要将区域扩展。

对于特定的 r 分辨率级别上分区,对应到 r-1 分辨率级别上的的三个子带的区域为:

Ei_R-1_b = (Ei_R – bi)/2 Sr

Fi_R-1_b = (Fi_R – bi)/2 Sr

其中 i 等于 1 2 ,而 bi 分别是 0 1 。其组合得到四个子带。

Sr r=0 的时候为 0 r 大于 0 的时候为 1 。如果是 0 表示最低分辨率层也就是最终的 LL 子带,那么其没有映射,而对于其他的分辨率层上的映射是其下一级别的三个子带,因此区域标记需要减少 1/2 。这里的关系同前面子带的映射关系相似,这里不在详细介绍。

另外,新映射的三个子带的原点坐标需要按照下面表达式计算:

Oi_R-1 = (Oi_R –bi)/2 Sr

而分区划分的大小为:

P1_R-1 = 2 -Sr *P1_R

P2_R-1 = 2 -S r*P2_R

码块

编码块是对每个子带中分区的进一步划分;编码块划分具有与同一个子带中分区划分同样的原点 (O1_P,O2_P)

每个码块的大小为 J­1_BC*J2_BC 。默认是 64 ,他们必须是 2 POWER ,并且不能小于 4 ,大于 1024

默认值 J1_BC_D,J2_BC_D COD 参数的 CBLK 中获得,因此 J1_BC,J2_BC 可以通过下面的表达式来计算:

J1_BC = MIN (J1_BC_D, 2 -Sr *P1_R)

J2_BC = MIN (J2_BC_D, 2 -Sr *P2_R)

P1_R P2_R 表示 r 分辨率上的分区大小。如果 2 -Sr *Pi_R Ji_BC_D 要小,说明一个分区只能有一个码块。

每个分区上的垂直和水平方向码块的数目为: N1_BC,N2_BC

N1_BC = (F1_R-1_b – O1_P)/J1_BC

N2_BC = (F2_R-1_b – O2_P)/J2_BC

 

F1_R-1_b F2_R-1_b 表示分区在子带上的下边界和右边界。

 jp2k_block.JPG

码块的编码

如果一个分区有多个码块,需要进行编码,编码的顺序是从左到右,从上到下。 HL 子带码块先出现,最后是 HH 子带。

注意:码块是进行编码的基本单元。所有数据在进行 DWT 之后,然后将对应子带上的系数按照分区来划分,并最终组织成码块,然后将得到的码块数据进行编码。

为了能够是压缩在质量方面采用渐进性,采用包这种结构。包实际上是码块编码的集合;最简单的码块组合方式是顺序的;例如:

每个码块的全部按照长度 + 内容(长度个字节)连续在一起,叫组合流。但这种方式不能够提供失真的伸缩性,但他们也是嵌入式的编码。

为了达到失真伸缩性,需要将码块的编码分为多次(或多个过程),每次为图象质量贡献一部分字节,如下图描述:

这里的 Qi 表示质量层,码块为每层提供一定的长度用 L 表示。这里只描述了两层,因此对于每个码块来说,整体的编码被分配到各质量层上,当然有的码块可能对某些质量层没有任何贡献,也就是空的。另外图中的箭头表示码块组织的方式。在位流中,其需要为每个码块增加一个标志头。

按照上面这种方式组织码流可以达到率失真的伸缩性,这种组织方式下位于某层的码块编码组合就形成一个包,当然这些码块应该是相关的, JPEG2000 中规定这些码块应该在同一个分区内。

例如:上面图中有两个分区, B0-B3 是分区 1 B4-B7 是分区 2 ,那么 B0-B3 Q0 层编码流组合就是一个包。

JPEG2000 中有一个要求就是,将每个码块的头放在一起,组成包头,然后是码块的系数编码流。

 

层(质量层)

层是一个包的集合;每个分区为层贡献一个包,而分区是按照分辨率层来进行划分的。

但它与分辨率层不同的概率,它的每个层都是全分辨率的,也就是说,如果按照层来查看样本,那么每个层的大小都和原来图像是一样大小的。

层的数量并不固定,主要有采用的应用类型决定。

单一层:如果不需要失真的伸缩性,那么就使用简单的组合流,只需要一层。

按照编码过程进行分层也是一个好办法,每层包含码块样本的一个编码过程,这样有多少个编码过程就有多少层。这也是 EBCOT 中采用三个编码过程的原因所在。

因此,从上面的理解我们可以知道,层是全分辨率的,每层都与原来图像一样大小;如果层不断累加,那么质量不断改善,最终得到原来的图像样本。

区域

到目前,前面的例子已经足够告诉我们区域( Region )的含义了,这里不再介绍。

渐进性

最后看一下渐进性。

JPEG2000 最诱人的一点在于渐进性,随着数据的增加图像按照某种方式改善。

渐进性的四维是:质量、分辨率、空间和分量。

质量渐进性是通过上面介绍的层来实现的,随着层的增加,图像的质量不断改善。可以发现的是,每层实际上包括图像的某些部分,随着层的增加,图像越来越完整。

分辨率渐进性是子带变化过程中产生的各分辨率方式来组织数据。

posted on 2006-12-27 21:55 笨笨 阅读(2117) 评论(2)  编辑 收藏 引用 所属分类: 压缩算法

评论

# re: JPEG2000中图像单元的定义 2007-01-11 16:58 suli

你文章中两个贴图地址错误,显示不出来,能否更正一下?谢谢!!  回复  更多评论   

# re: JPEG2000中图像单元的定义 2007-05-12 10:40

其实可以添加一下文章中资料来源的注释,以便更多的了解.  回复  更多评论   


只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理