Kakadu中实现的JPEG2000量化和界定参数
JPEG2000 的压缩方式有可逆和不可逆两种方式,这里分别介绍。
界定
在可逆和不可逆方式中,需要为块编码器提供待编码整数的绝对范围一致的解释,这叫界定。简单的说,也就是 DWT 变化后的系数在什么范围内,用多少二进制位来表示。
不可逆方式
不可逆 DWT 变化后,通过量化将样本映射到量化索引中,然后再进行编码。因为量化本身是不可逆的,所以可逆方式中不存在量化。
不可逆方式中,界定与量化的参数有关。
量化
不可逆方式采用的是恒域( deadzone )标量量化,量化操作由步长参数 (△ b )定义:
q b [n] = sign(y b [n]) [|y b [n]|/ △ b ] -------------------------- ( 1 )
其中 y b [n] 表示子代样本,被归一化到标称范围: -1/2 到 1/2 , q b [n] 表示量化之后的索引。每个子带可以有不同的步长参数 △ b 。
可以将上面的表达式理解符号部分和量值部分:
符号部分由 X b [n] = sign(y b [n]) 给出,而量值部分由 v b [n] =[|y b [n]|/ △ b ] 给出。
这里需要注意的是步长参数由指数 E b (Epsilon) 和尾数 u b 给出 :
△ b = 2 -E b (1+u b /2 11 )-------------------------------------------------------- ( 2 )
E b 和 u b 都是非负整数;范围为:
0<=Eb <25, 0<=ub <211----------------------------------------------------- ( 3 )
界定
编码器和解码器一般取相同的位数来表示子代 b 中的量化索引 v b [n] ,这个值是 K b max 。
当然子带的样本值可能会超出规定的标称范围,因此引入一个参数 G ,来规定所有子带样本遵从下面的界限:
-2 G -1 < y b [n] < 2 G -1 -------------------------------------------------------------- ( 4 ) -
这里的 G 叫做保护位( guard bits )。取 0 到 7 之间的值。
结合前面的量化步骤,这里来推导几个参数。
由( 2 )和( 4 )得到:
vb[n] =[|yb[n]|/ △ b ]<2Eb+G-1
具体如下:
v b [n] =[|y b [n]|/ △ b ]= v b [n] =[|y b [n]|/ ( 2 -E b (1+u b /2 11 ) ) ]
而 y b [n] < 2 G -1 因此:
[|y b [n]|/ ( 2 -E b (1+u b /2 11 ) ) ] < [ 2 G -1 / ( 2 -E b (1+u b /2 11 ) ) ]
另外, 2 -E b (1+u b /2 11 ) < 2 -E b ,因为 E b >0 ,切 u b /2 11 小于 1 且大于 0 。
从而:
v b [n]< [ 2 G -1 / 2 -E b ] = 2 Eb+G-1
那么这里的 K b max 也可以表示为 0 和 Eb+G-1 的最大值了。
因此可以看到
Eb + G = K b max +1
K b max = Eb + G -1---------------------------------------------------- ( 5 )
反量化
如果采用恒域标量量化,反量化操作将一个量化索引重建一个位于对应量化间隔中某个确定的位置。用 ^y b 表示,那么:
^y b [n] = 0, 如果 vb[n] = 0
^y b [n] = X b [n]*(v b [n]+& b, v b[n] )* △ b , 如果 vb[n] != 0
& b, v =1/2 对应于中间点的重建。
可逆方式
量化
可逆方式中实际上没有量化,因此提供给块编码器的量化索引与整数的子代样本是相等的;用不可逆方式中的符号来表示为:
q b [n] =y b [n] ----------------------------------------------------------------(6)
界定
可逆方式中样本值的标称范围可以使用原来样本深度 B 和线性化小波核的增益来确定。如下:
-2 B-1+Xb+G <y b [n] < 2 B-1+Xb+G
G 是额外的保护位,而 X b 是线性化小波核的标称增益的不一定都为 1 ;具体情况是:
X LLd = 0, X LHd = X HLd = 1, X HHd = 2
那么因此可以得到 vb[n]] 的位数为:
K b max =B-1+X b +G---------------------------------------------------------------- (7)
在 JPEG2000 中使用 G 和 Eb 来表示 K b max 的。不可逆与可逆方式有相同的表现,但对于不可逆方式中 Eb 表示量化步长指数,而可逆方式中是界定参数,同时由编码器设置 Eb 来保证有足够的位数来表示每个样本的大小。
那么由( 5 )和( 7 ),这里可以得到:
Eb = B + Xb---------------------------------------------------------------- (8)
在可逆变换中,我们使用如下的转换方式:
X Y [n] = [(X R [n] + 2X G [n] +X B [n])/4]
X Db [n] = X B [n] –X G [n]
X Dr [n] = X R [n] –X G [n]
由于在进行变换之前需要对样本进行水平偏移,因此如果假设数据的样本值是 B 位,那么变换之前的 R , G , B 的样本范围是:
-2 B-1 <= X[n] <= 2 B-1 -1
而变换之后可以看出:
X Y [n] 的最小值为: [-2 B-1 +2*(-2 B-1 ) + (-2 B-1 )]/4 = -2 B-1
X Y [n] 的最大值为: [2 B-1 -1 +2*(2 B-1 -11 ) + (2 B-1 -1 )]/4 = 2 B-1 -1
因此 X Y [n] 仍然用 B 位可以表示
而 X Db [n] 和 X Dr [n] 的最大值和最小值为:
最小值: -2 B-1 -(2 B-1 -1 ) = 1-2 B
最 大 值: 2 B-1 -1 -(-2 B-1 ) = 2 B -1
因此对于他们需要 B+1 位来表示。
从上面的推论我们知道在( 8 )中,对于色度分量, B 需要用 B+1 来提到计算。
反量化
虽然可逆方式没有明确的量化过程,但对于有编码块码流被截断的情况可以等同于量化。
对于码流的截断导致解码出来的样本值 ^v i [j] 与原样本值 v i [j] 仅仅在低 p i [j] 个位不同;实际上这些 LSB 都是 0 。因此可以将其看成等效的步长为 △ i [ j ]=2pi[j] 的恒域标量量化。
因此反量化表示为:
在 ^v i [j]=0 的时候, ^yi[j] = 0,
其他时候, ^yi[j] = 符号 * ( ^v i [j]+ [2pi[j]*&] )
Kakadu 中表示
在 JPEG2000 中使用 QCD 和 QCC 码流标记参数来表示量化和界定的参数。这里看一下 Kakadu 代码中如何表示的。
JPEG2000 中 QCD 叫默认量化参数,而 QCC 是量化分量参数。对于到 Kakadu 中的 qcd_params 参数类。
Kakadu 中的 QCD 参数类
Kakadu 为 qcd_params 类定义下列参数属性。
参数名称 |
说明 |
默认值 |
Qguard |
保护位;前面已经介绍了其作用。 |
1 |
Qderived |
量化步骤从 LL 子带参数中继承吗?如果是继承,那么所有量化步长都通过 2 的相应幂与 LL 子带步长关联,并且只有 LL 子带的步长会写到码流标记中;否则必须为每个子带写步长参数。对于可逆压缩不能使用。 |
不能继承 |
Qstep |
不可逆量化中每个子带使用的基础量化步长。应该在 0 到 2 之间。 |
1/256 |
Qabs_steps |
每个子带的绝对量化步长。用每个子带的动态范围来表示。范围等于 2^B ( B 是深度)乘上每个低通滤波器的 DC 增益以及高通滤波器的 AC 增益。用下面的顺序描述: LL_D,HL_D,LH_D,….,HL_1,LH_1,HH_1 。这里的 D 是 DWT 的级别。如果不是继承的,每个子带都要有步长参数。如果 Qstep 使用了,这个参数就忽略。 |
|
Qabs_ranges |
可逆压缩过程子带编码中使用的位数。子带的顺序同上面。 Qabs_ranges +Qguard = 1+ K_max 。因此这正是 (7) 中 Xb+B , ( 5 )的 Eb 。 通常情况下,这里使用默认的不上溢出和下溢出的最小值。如果显式设置一个值,需要为每个子带都指定。 这个就是前面说的界定 。 |
|