zoukankan      html  css  js  c++  java
  • 格伦布编码——rice编码无非是golomb编码M为2^x的特例

    格伦布编码 

    格伦布编码是一种无失真资料压缩方法,由数学家所罗门·格伦布在1960年代提出。

    Rice编码

    Robert F. Rice提出Rice 编码,是以哥伦布编码为基础做改良而更简易的前置码。Rice编码可视为适应性编码的一种或是哥伦布编码的特例之一。哥伦布编码有一个可调整参数,可以是任一正整数。而Rice编码则是此调整参数为2的次方情况时。这让Rice编码在电脑运算上快速许多,因为电脑上是已二进制运算为主。 Rice编码是一种熵编码技术,可用在影像及图像压缩上。

    编码的建立

    哥伦布编码使用可调整参数M把输入值分成两部分: 商数q, 除以M的结果及余数r。 商数当做一元编码而余数放在后面做为可缩短的二进制编码。当{displaystyle M=1}哥伦布编码等同于一元编码。

     

    哥伦布-Ric编码可想成用bin(q) 指示位置而bin (r)代表偏移。上述图片显现使用哥伦布-Ric对整数 N编码,另有位置q、偏移r、参数M。 而这两部分如下式表达,x是要被编码的数字。

    {displaystyle q=leftlfloor {frac {left(x-1
ight)}{M))
ight
floor } and {displaystyle r=x-qM-1} 最后偏码结果: {displaystyle left(q+1
ight),r}

    r 是变化的位元数,在Rice编码r则只有b位元数,而在哥伦布编码, r会是b-1或b bits. 假设 {displaystyle b=lceil log _{2}(M)
ceil }. 如果 {displaystyle 0leq r<2^{b}-M},则用b-1 位元数编码r. 相反的,如果 {displaystyle 2^{b}-Mleq r<M},用b位元数编码r'. 当M 是2的次方时,{displaystyle b=log _{2}(M)},则所有的r值都是b个位元.

    参数M是伯努利试验函数,其中{displaystyle p=P(X=0)}M则是中位数或中位数+/-1,如下式:

    {displaystyle (1-p)^{M}+(1-p)^{M+1}leq 1<(1-p)^{M-1}+(1-p)^{M}.} M愈大愈难抓取{displaystyle M=leftlfloor {frac {-1}{log _{2}(1-p)))
ight
floor }.

    哥伦布编码在分布上跟霍夫曼编码有相同概率。

    使用记号整数

    哥伦布原本是用来编码非负整数,但也可改良用来编码任意整数,利用重新排列数值使正整数排在特定的位置。例如一串数字0, -1, 1, -2, 2, -3, 3, -4, 4 ... ,-n排在nth奇数(2n-1),而mth正数排在mth偶数(2m)。 正数x对应({displaystyle x^{prime }=2|x|=2x,xgeq 0}),负数对应({displaystyle y^{prime }=2|y|-1=-2y-1,y<0})。

    算法

    1. 选择整数作为M
    2. 要编码数值N,找出下列式子
      1. 商数: q = int[N/M]
      2. 余数: r = N除以M
    1. 产生整体编码
      1. 编码形式 : < 商数编码 > < 余数编码 >
      2. 商数编码
        1. 写 q长度位元的1
        2. 写一个0位元
      3. 余数编码
        1. 如果M'是2的次方,编码是二进制形式,需要{displaystyle log _{2}(M)}。(Rice 编码)
        1. 如果M'不是2的次方,令b = lceillog_2(M) ceil</math>
          1. If {displaystyle r<2^{b}-M} 使用b-1 个位元编码 r.
          2. If {displaystyle rgeq 2^{b}-M} 使用b个位元 编码{displaystyle r+2^{b}-M}

    范例

    M = 10. 则 {displaystyle b=lceil log _{2}(10)
ceil =4}{displaystyle 2^{b}-M=16-10=6}

    当选42作为编码时,42会被拆成q=4及r=2,从上表中为q(4),r(2),编码为11110,010,实际上不需要逗号去分隔两部分,因为商数编码最后的0能代表 余数编码的起始位置。

    参考:http://www.wikiwand.com/zh-sg/%E6%A0%BC%E5%80%AB%E5%B8%83%E7%B7%A8%E7%A2%BC

  • 相关阅读:
    Sql server
    分布式爬虫
    爬取某电影网站最新电影
    随笔写一个简单的爬虫
    python的os模块
    基于python的文件处理
    mysql习惯及主从复制参数设置
    git常用命令
    git实习笔记
    微信公众平台开发接口PHP SDK完整版
  • 原文地址:https://www.cnblogs.com/bonelee/p/6879315.html
Copyright © 2011-2022 走看看