580 likes | 724 Views
本节课内容. QM 编码器 Golomb 编码. QM 编码器. 二进制信源算术编码 只处理二进制信源符号 设计目标:简单、快速 对乘法操作进行近似 定点精度的整数算术编码 不断标定概率区间,使得近似结果接近于真正的乘法 在现代图像和视频压缩算法中广泛应用: JBIG, JPEG, JPEG2000, H.263, H.264. QM 编码器. 很多二值图像都存在局部结构 在某个部分,大部分向素值为 1 (如背景区域) 而在另外某个部分,大部分向素值为 0 (如文字区域) 通过观察邻域状态,可以合理猜测当前像素的值
E N D
本节课内容 • QM编码器 • Golomb编码
QM编码器 • 二进制信源算术编码 • 只处理二进制信源符号 • 设计目标:简单、快速 • 对乘法操作进行近似 • 定点精度的整数算术编码 • 不断标定概率区间,使得近似结果接近于真正的乘法 • 在现代图像和视频压缩算法中广泛应用:JBIG, JPEG, JPEG2000, H.263, H.264
QM编码器 • 很多二值图像都存在局部结构 • 在某个部分,大部分向素值为1(如背景区域) • 而在另外某个部分,大部分向素值为0(如文字区域) • 通过观察邻域状态,可以合理猜测当前像素的值 • 如邻域像素值为1,则当前像素值极有可能为1; • 反之亦然 • 每种情况都是一个分布很不均衡的概率模型适合算术编码 • 对每种情况都分别采用一个算术编码器,以得到更好的性能(与对所有像素只用一个编码器相比)
QM编码器 • 例:像素值为0的概率 ,像素值为1的概率 • 则熵为: • 即只有一个算术编码器编码的话,平均码率将接近0.722比特 • 若假设分为两个集合,分别包含80%和20%的像素 • 第一个集合:95%的像素值为1 • 第二个集合:70%的像素为0 • 则两个集合的熵分别为0.286和0.881。如果对两个集合分别采用不同的算术编码器,则平均码率接近 • JBIG/JPEG中采用多个模型(上下文),每个上下文对应不同的算术编码器,每个算术编码器的计算机制相同,只是概率模型不同。
QM编码器 • 基本思想:将输入符号(一个bit)分为大概率符号(More Probable Symbol, MPS)或小概率符号(Less Probable Symbol, LPS) • 在输入下一位之前,编码器先利用一个统计模型(通常是上下文信息,如在黑-白图像编码中用二维的上下文)来预测MPS是0还是1,然后再输入该位并按其实际值分类 • 模型预测的MPS与实际值不一致,则编码器将该位归为LPS;否则继续归为MPS • 输出流为MPS或LPS的流,MPS和LPS的概率动态更新,为算术编码器所用 • 解码器所知道的信息也是当前处理的位是MPS还是LPS,然后利用与编码器相同的统计模型得到信源符号的原值
QM编码器 • 令qc表示LPS的概率,并将较低的区间赋予MPS 1 1- qc 0
A A(1- qc) 0 QM编码器 • 算术编码中的 的更新用 代替 • 出现MPS的迭代的规则为: • 出现LPS的迭代的规则为 区间内的任何数字都可以作为输出,为简单起见,QM编码器将子区间的下界l作为输出
QM编码器 • 例: • 初始化: • 注意:当输入序列越来越长,区间越来越窄,l越来越大
重新标定 • 在上例中,若 ,最后l=0.981,A=0.0081 • 当A太小,需要很高的精度才能将其与0分开 • 重新标定:对A和l同时放大一倍(对二进制数左移一位) • 若A<0.5,可能需要重新标定多次(如上例中A=0.1,需重新标定3次,变成0.8) • 输入LPS,肯定需要重新标定;输入MPS,可能需要重新标定,取决于A的具体值。
重新标定 • 问题:找到一个阈值t,当A<t时,对A放大一倍; • 另:A和2*A应尽量接近1,即: • 找到t>0.5,使得 (max(1-t, 2t -1))最小 • t=0.75. • 另外,A的更新需要乘法 • A := A (1 – qc) 或A := Aqc • JBIG委员会推荐用近似代替乘法 • A 接近1时,A (1 – qc) 用 (A– qc)代替,Aqc用qc代替。 • 当采用最佳阈值t = 0.75, A 的值总是在区间 [0.75, 1.5)内
条件交换 • 通过重新标定进行近似带来一个问题:分配给MPS的子区间可能比LPS分配的子区间还小 • 由于用A= A- qc去近似 A=A(1- qc) • 例: qc =0.45,输入4个MPS • 初始化:A=1,l=0 • 第1个MPS:A=0.55 A=1.1, l=0 • 第2个MPS:A=0.65 A=1.3, l=0 • 第3个MPS:A=0.85, l=0 • 第4个MPS:A=0.40, l=0 • 分配给MPS的区间为0.4,而分配给LPS的区间为qc =0.45 • 当接近0.5时会出现这种情况 A=A– qc
重新标定 • 发生这种情况的条件为: • 解决办法:有条件交换(conditional exchange) • 当满足上述条件时,交换两个区间 • 由于有条件交换只发生在重新标定时的近似过程中,只需在决定要重新标定后才测试交换的条件是否满足
重新标定 • 采用标定,修改后的编码器为: 总是要重新标定
重新标定 • 带有条件交换的重新标定近似的伪代码为:
A QM解码器 A(1- qc) 0 • 解码过程为编码的逆过程 • 初始化: ,分割线为A(1- qc)=1(1-0.5)=0.5,因此MPS和LPS对应的区间分别为 • 输入码字为C,对应编码中的l
QM解码器 • 解码器的伪代码为:
主要内容 • 游程编码 • Golomb码 • 一元码 • Golomb码 • Golomb-Rice码 • 指数Golomb ( Exp-Golomb )码 • 自适应Golomb码 • 在JPEG-LS (Lossless JPEG)中的应用
游程编码 • 许多0和不太多的1 • 传真 • 图形 • 简单游程码: • 00000010000000001000000000010001001..... • 6 9 10 3 2 ... • 对整数序列进行编码
一元码(Unary Code) • 对非负整数n,用n个1和一个0表示(或者n个0和一个1) • 为前缀码 • 在什么情况下是最佳码? • 当概率为1/2、1/4、1/8、1/16、1/32… • 此时Huffman码就是一元码
实现 • 编码(Encoding): • 解码(Decoding):
一元码 • 如果输入时负整数呢? • 可能的解决方案: • 在JPEG-LS部分再详述
几何分布(Geometric Distribution, GD) • 参数为 的几何分布: • 在Bernoulli实验中,在第一次成功之前失败次数为x的概率,失败的概率为 • 当参数 时,一元码为最佳前缀码: • Huffman编码:不需要重新排序等价于一元码 • 一元码为最佳前缀码,但效率不高 • Huffman编码需要重新排序,一元码不是最佳前缀码 • 平均长度=熵 • 一元码不仅是最佳前缀码,而且是所有熵编码中是最佳的(包括算术编码)
为什么用几何分布? • 几何分布对图像/视频压缩很有用 • 例:游程编码 • i.i.d. 分布的二值序列 • 例:0000010000000010000110000001 • 熵<<1,前缀码的性能不好 • 游程编码对压缩数据很有效: • r: 在两个1中间连续的0的个数:5,8,4,0,6 • 游程r的概率分布: • n个0接着一个1 • 参数为 的单边几何分布
为什么用几何分布? • 例2:预测误差 • 大多数的 的值都很小,在0附近可用双边几何分布(GD)建模 • 双边GD可用单边GD近似: • 减少自适应熵编码中上下文的数目 • 将负数映射成正数: • 映射可能不止一个 • 在JPEG-LS中再详述
为什么用几何分布? • GD分布是对指数分布的离散近似。指数分布为: • 双边几何分布为Laplacian分布(亦称为双边指数分布)的离散近似。Laplacian分布为:
Golomb码 • 对例如游程的几何分布,一种方式对游程用Huffman编码得到前缀码。 • 但游程的数目很大,而且可能不能预知,所以一个更好的办法是构造一个无限族的最佳前缀码,使得对无论多大的游程,在该前缀码族中都可以找到一个码字对该游程进行编码 • 该前缀码族与概率 有关,称为参数前缀码。Golomb码就是这样一组码,且对几何分布而言是最佳码 • 参数 越大,大的游程比较可能 • 参数 越小,大的游程不太可能出现
Golomb码 • 一种多分辨率的方法: • 将所有数字分为等大小为m的组:表示为Golomb(m)或Golomb-m • 符号值较小的组分配的码长较短 • 同一组内符号码长基本相等:码长的增长比一元码要慢得多 • 码字:(一元码,固定长度) 组号:一元码 每组内的索引编号:固定长度码 S. Golomb, Run-length encodings, IEEE Trans. Information Theory, Vol. 12, No. 3, Jul 1966, pp. 399 - 401.
q: 商,用一元码 r:余数,“固定长度”码 当 时,k比特: m=8: 000, 001, …, 111 当 时, m=5: 00, 01, 10, 110, 111 Golomb码
Golomb码 • m=5时的Golomb码(Golomb-5):
Golomb码 • m较小,Golomb码初始很短,但增长很快,适合RLE中 较小,即大游程很少的情况 • m较大,初始Golomb码很长,但增长很慢,适合RLE中 较大,即大游程较多的情况
Golomb-Rice码 • 特定的Golomb码: • 余数r为n的k低位 • m=8:
实现 • 编码(Encoding): • 解码(Decoding):
指数Golomb码(Exp-Golomb) • Golomb码将字母分为等大小的组 • 在Exp-Golomb码中,组的大小呈指数增长 • 码字仍然包括两部分: (一元码,固定长度码)
实现 • 编码(Encoding): • 对 的组的码字: • 对x用一元码编码 • 用X比特表示组内索引 • 组号(GroupID):
实现 • 解码(Decoding):
为什么用Golomb码 • Golomb码的重要性: • 对任何几何分布(GD),可以找到一个Golomb码为最佳前缀码,且和熵尽可能接近(在所有的前缀码中) • 问题: • 怎样确定Golomb的参数? • 怎样将其应用到实际的编码器中?
几何分布的最佳码 • 参数为 的几何分布 • 当参数 时,一元码为最佳前缀码 • 当 时,在所有的熵编码是最佳的 • 当 时,怎样构造最佳一元码? • 转化为 的几何分布(尽可能接近) • 怎样转化?:将m个事件组成一组
几何分布的最佳码 • 当 时,每个x可以写成: 为参数为 的几何分布 若 ,一元码为 的最佳码 为最小的可能整数
几何分布的最佳码 • 怎样对 编码? • 对 ,如果 ,则 • 的码字比 多一个比特 • 的码长相等 • 这正好是Golomb码的格式: • 对q用一元码编码 • 对余数用(近似)等长码编码 问题:怎样找到最佳的参数
Golomb参数估计(JPEG-LS) • 自适应Golomb编码的目的: • 对给定数据,寻找最佳的参数m,使得 • 怎样根据过去的数据估计 ? 对每个像素来说,计算费用太高
Golomb参数估计(JPEG-LS) • 一种快速方法:假设
自适应Golomb编码 初始估计的均值 • 初始化: • For each • 对每个符号 ,用参数为k的Golomb码编码 • 在编码后更新: • If //重新归一化 • End 防止溢出 慢慢忘记过去
JPEG-LS中的应用 • JPEG-LS: 无失真JPEG(Lossless JPEG) • JPEG中也有无失真算法,但没有被广泛采用 • JPEG-LS: • 开始于1995,完成于1999 • 目标:只用最小的复杂性提高性能 • 基于HP实验室的LOCO-I (LOw COmplexity LOssless COmpression for Images))算法:对图像进行低复杂性压缩 • JPEG-LS比无失真JPEG 2000的性能更好 • 采用的技术: • 预测 • 自适应Golomb码 • 上下文自适应编码 • 游程编码
JPEG-LS流程图 • 对输入样本以光栅顺序编码 • 游程模型: • 在平坦区域采用(所有4个邻居都相等),此时前缀码不是很有效 • 预测模型: • 在其他区域采用 • 根据上下文预测 • 确定上下文 • 在每个上下文中,对预测残差找到一个概率模型 • 对残差用自适应Golomb码编码
预测 • 根据3个邻居预测每个样本x的值 • 基于简单的边缘检测: • 预测残差:
预测 • 此时,预测值在a, b, c确定的平面上 • JPEG-LS中预测规则的一个等价表示为:
残差分布 • 若预测设计得很好,则可以用一个双边的几何分布来对残差进行建模: • 由于使用整数预测,通常会出现偏差 T • 偏差T可被分为其整数部分C和小数部分s: • T = C - s. • 可以估计并取消C • 因此剩余的偏差为: • s的值决定双边几何分布向单边几何分布的映射
情况1: 情况2: 残差分布:映射到单边GD
上下文模型 • 根据局部条件概率 对每个预测残差进行自适应Golomb码 • 上下文:邻域内样本的每个配置 • 可以利用高阶条件获得较小的熵(更好的压缩) • 条件会降低熵 • 问题: • 为了跟踪更多的上下文文会增加费用 • 对每个上下文没有足够多的训练数据来训练 • JPEG-LS中的上下文:基于4个邻居的3个局部梯度 • g1 = d – b, • g2 = b – c, • g3 = c – a.