Glomb编码
Glomb编码使⽤可调整参数M把待编码值分成两部分: 商数q及余数r。 商数当做⼀元编码⽽余数放在后⾯做可缩短的⼆进制编码。当M=1哥伦布编码等同于⼀元编码。
示例:设M = 10. 则 b = (向上取整)ceil[log2(10)] = 4; 2^b-M=16-10=6}当选42作为编码时,42会被拆成q=4及r=2,根据上述算法对q(4)、r(2)编码为11110 010。
算法过程
1. 选择整数作为M
2. 得到编码数值N,
1.商数:q = int[N/M]
2.余数:r
3. 整体编码: <商数编码><余数编码>
1.商数编码 :写q⻓度位元的1,再写⼀个0位元
2.余数编码:如果M’是2的次⽅,编码是⼆进制形式,需要log2(M)
如果M’不是2的次⽅,令b = ceil[log2(M)]
- If { r < 2^b-M} 使⽤b-1 个位元编码 r.
- If { r > 2^b-M} 使⽤b个位元编码r+2^b-M
Glomb-rice编码
Golomb-Rice是Golomb编码的⼀个变种,它给Golomb编码的参数m添加了个限制条件:
- M必须是2的次幂。这样有两个好处:
- 不需要做模运算(和取余区别在于负整数除法运算)即可得到余数r,r = N&(m -1);取模运算在计算商的值时,向负⽆穷⽅向舍⼊(floor()函数),例如-7 / 4 = -2(向负⽆穷⽅向舍⼊)
- 对余数r编码更为简单,只需要取r⼆进制的低log2(m)位即可。则Golomb-Rice的编码过程更为简洁:初始化参数m,m必须为2的次幂计算q和r,q = N / m ; r = N & (m - 1)使⽤⼀元编码编码q取r的⼆进制表示的低log2(m)位作为r的码字。
示例:设M=8 则log2(M)=3 当对42进⾏编码时,42被拆分成q=5 r=2,则编码为111110 010
Exp-Glomb编码
Rice的编码方式和Golomb的方法是大同小异的,只是选择m必须为2的次幂。而Exp-Golomb则有了一个很大的改进,不再使用M这样固定大小的分组,而使组的大小呈指数增长。如下图:
Exp-Golomb需要一个非负整数K作为参数,称之为K阶Exp-Golomb。其中当K = 0时,称为0阶Exp-Golomb,目前比较流行的H.264视频编码标准中使用的就是0阶的Exp-Golomb。
- Exp-Golomb的码元结构是:
** [M zeros prefix] [1] [Offset] **
m=[ log2(num+1) ]
Offset=num+1−2m
- 首先使用公式计算组号m,m=[ log2(num+1) ]
- 对组号m进行编码,连续写入m个0,最后写入一个1作为结束。
- 计算组内偏移量offset, Offset=num+1−2m取offset二进制形式的低m位作为offset码元
1之前的0的个数就是该数字所在的组的编号,因此同一组内的编码长度是相同的。
0阶Exp-Golomb的编码后的长度是:2∗m+1,其解码过程和上面的Rice码类似,读入bit流,是0则继续,1则停止,然后统计0的个数m;接着读入m位的bit,就是offset,最后解码后的数值是:N=2m−1+offset
K阶Exp-Golomb编码,Exp-Golomb的组的大小实际上是呈2的指数增长,不同的参数k,实际控制的是起始分组的大小
不同的k造成了其起始分组的大小不同,所以对于任意的k阶Exp-Golomb编码都可以转化为0阶来进行实现,具体如下:
- 设待编码数字为N,参数为k使用0阶Exp-Golomb编码 N+2^k−1
- 从第一步的结果中删除掉高位的k个0
自适应rice编码方法
自适应Rice编码的算法思想是由取2指数的Golomb方法确定k的系数,这样就避免进行选择多个k值所需要的数据缓存。该算法与JPEG-LS中采用的Golomb-rice编码方法类似,但进行了改进。
图中的k表示的是对最低位至k位不进行编码,对高于k位的数据进行rice编码。最后将编码之后的数据长度进行比较,然后选择最短的输出。因此从自适应rice编码方法可以看出,在进行rice编码过程中的自适应过程是通过将k的值进行遍历实现,这势必要求对硬件提出缓存的要求。
CCSDS自适应rice编码方法
CCSDS自适应rice编码方法与JPEG-LS的Golomb-rice编码方法不同,一是该编码过程进行了删除了游程编码,这是因为在高光谱图像预测中,几乎不存在全为‘0’或一定值的情况。二是该算法采用k值的选取与JPEG-LS不同,JPEG-LS算法是通过预测后的上下文更新,而CCSDS中的k值选取是通过自适应统计选取。下面介绍k值的计算过程。自适应编码k选择由累加器和计数器决定,并在编码过程中自动更新。
通过上述函数实现将累加器和计数器不断的累加,但如果按照累加器除计数器,当计算平均值的时,码流是按照不断的有数据读进来进行计算,就会造成后读进的数据权重过高,通过不断除2降低对计算均值的影响。
例如在上图中2^k_z(t)的范围在16与32之间,从而求出k_z(t)为4,确定k_z(t)之后,再进行指数rice编码,对最低位至k位不进行编码,对高于k位的数据进行一元编码。
对于42来说,假设此时k=4,42的二进制表示为00101010,最低位到第k=4位保持不变,对高于第4位的数据进行编码,编码结果是001 1010,假设k=5此时编码结果为010 1010