第8章 熵编码

article/2025/9/30 8:54:52

http://www.cnblogs.com/xkfz007/archive/2012/07/29/2614250.html

1. 熵编码

  • 熵(Entropy):信源的平均信息量,更精确的描述为表示信源所有符号包含信息的平均比特数
    • 信源编码要尽可能的减少信源的冗余,使之接近熵
    • 用更少的比特传递更多的信源信息
  • 熵编码:数据压缩中根据信源消息的概率模型使消息的熵最小化
    • 无损压缩
    • 变长编码

2. 熵

  • 信息量:

单位:比特

  • 熵:

单位:比特/符号

3. 定长编码

4. 变长编码

  • 变长编码:用不同的比特数表示每一个符号
    • 为频繁发生的符号分配短码字
    • 为很少发生的符号分配长码字
    • 比定长编码有更高的效率
  • 常用的变长编码
    • Huffman编码
    • 算术编码

5. Huffman编码

  • 前缀码:任何码字不是其它码字的前缀
    • 如果011为一个有效码字,则0,1,01,11必不是有效码字
    • 不会引起解码歧义
  • Huffman:
    • 二叉树
    • 树节点:表示符号或符号组合
    • 分支:两个分支一个表示"0",另一个表示"1"

  • Huffman的不唯一性
    • 每次分支有两种选择:0,1

    • 相同的概率产生不同的组合

  • 缺点:
    • 数据的概率变化难于实时统计
    • Huffman树需要编码传输给解码器
    • 只有在p(xi)=1/2ki 时是最优编码
    • 最小码字长度为1比特/符号
  • 如果有二值信源,其两个符号的概率相差很大
    • 例如:p(1)=0.0625,p(0)=0.9375则H=0.3373比特/符号,Huffman编码平均码长=1比特/符号
    • 两个符号联合编码有更高效率

6. 扩展Huffman编码

7. 范式Huffman编码

  • 范式Huffman树的建立规则
    • 节点左支设为0,右支设为1
    • 树的深度从左至右增加
    • 每个符号被放在最先满足的叶子节点

  • 特性
    • 第一个码字是一串0
    • 相同长度的码字的值是连续的
    • 如果所有的码字通过在低位补0的方式,使所有码字的长度相同则有 0000<0100<1000<1010<1100<1110<1111
    • 从码字长度n到n+1有如下关系
      • C(n+1,1)=(C(n,last)+1)<<1
    • 从码字长度n到n+2有如下关系
      • C(n+2,1)=(C(n,last)+1)<<2

8. 一元码

  • 编码一个非负整数n为n个1和一个0
  • 不需要存储码表
  • 可以用Huffman树表示

  • 码长增长太快:n=100,码长101

9. 哥伦布编码

  • 将信源符号等分成几组,每组有相应的编号
  • 编号小的分配码字短,编号大分配码字长
  • 同组的符号有等长的码字,比一元码的码字长度增长慢

  • 码字分配

 

10. 指数哥伦布编码

  • 哥伦布码对信源符号的分组大小相同
  • 指数哥伦布码对信源符号的分组大小按照指数增长
  • 指数哥伦布码依然是一元码加定长码的形式
  • 指数哥伦布码的指数k=0,1,2,…

11. CAVLC( Context-Based Adaptive Variable Length Code)

  • 当前块的系数分布和其邻块的系数分布情况相关
    • N X为块X的非零系数个数,当前块C的第一个系数的编码码表由N C决定, N C=( N A+ N B )/2

  • 当前待编码系数和前面编码系数有相关性
    • 当前块C的其它系数的编码码表由前一个系数的幅值决定cofN-1=>GolombTab_x,用GolombTab_x编码cofN

12. 算术编码

  • 信息量=>符号编码比特数
  • Huffman编码为每个符号分配一个码字,这说明Huffman编码的压缩上限是1比特/符号
  • 算术编码若干个符号可编码成1bit
  • 算术编码是把信源表示为实数轴上[0,1]区间,信源中每个符号都用来缩短这个区间
    • 输出[0,1]区间的一个实数表示一串编码符号
    • 比Huffman编码更有效
  • 编码思想
    • 编码器用熵编码算法编码一串符号产生一个[0,1]区间的实数,将实数的一个二进制表示传给解码器
    • 解码器用熵解码算法解码得到一串符号
  • 小数的二进制表示

  • 信源符号概率分布

  • 字符串:X2 X2 X3 X3 X6 X5 X7
  • Huffman编码,01 01 100 100 00 11 1011,18bit

  • 算术编码更接近熵
  • 有限精度算术编码是次优(Near-optimal)编码,发送整数比特给解码端
  • 算术编码到最后一个字符编码结束才输出码字
  • 编码复杂度也比较高

13. 二值算术编码

13. 自适应二值算术编码

  • 由于信源0和1出现的概率是在不断变化的,因此0和1的概率区间也应该不断改变
  • 自适应二值算术编码每编码一个0或1都重新统计0和1的概率并重新划分[0,1)区间
  • 编解码端的概率统计模型一致,能够得到同样的[0,1)区间划分

 

14. CABAC(Context-Based Adaptive Binary Arithmetic Coding)

  • 当前块的语法元素概率分布和其邻块的语法元素概率分布情况相关
    • 当前块C的邻块A和B的语法元素SA与SB可以为编码C块的语法元素SC选择概率模型
  • 二值化
    • 将语法元素值转换成二进制值串
  • 概率模型更新
    • 根据已经编码的比特,重新估计二进制值串的概率并更新概率模型,用新的概率模型编码下一个比特

15. Run Length 编码

  • 利用信源字符的重复性来编码的技术
  • 对有很长,很多重复字符的信源编码非常有效
  • 重复字符称为run,重复的字符个数称为run length
  • Run-length编码能够和其它熵编码一起来压缩数据

16. 字典编码

  • 字典编码:根据信源符号(消息)的组合特点,建立包含各种符号组合的字典,编码这些符号组合的索引
    • LZ78=>Winzip
    • LZW=> GIF
  • 适合一般意义上的数据压缩,去除数据的统计冗余

17. LZW

  • 将信源输出的字符串中,每个第一次出现的字符或者字符串用索引来表示,并将字符或字符串对应的索引编码到码流中
  • 解码端根据从码流中解码的字符,在线的建立和编码器完全一样的字典,并恢复出信源输出的字符串
  • 适用于字符串中有大量的子字符串多次重复出现,重复次数越多,压缩效果越好
  • 单个符号被分配为0-255之间的值
  • 初始码表,使其包含值为0-255的256个符号,值大于255的符号为空
  • 编码器将根据编码的符号情况确定字符组合为从 256 到 4095 之间的值
  • 编码时,编码器识别新的字符组合,并将他们增加到码表中
  • 编码器用码表中的符号组合所对应的值编码

  • 解压时LZW解码器能够产生和编码器完全一样的码表
  • 和编码器一样先初始化所有的单字符,将0-255之间的值分配给它们
  • 除了解码第一个字符外,解码其它字符时都要更新码表
  • 通过读码字并根据码表中的值将它们解码为对应的字符或字符组合

18. LZ78

参考资料:

  • LZW:http://www.cs.usyd.edu.au/~loki/cs2csys/gif-info/lzw.html
  • LZ78:http://www.cs.usyd.edu.au/~loki/cs2csys/gif-info/lz78.html

http://chatgpt.dhexx.cn/article/WYrUk75Z.shtml

相关文章

熵编码之CABAC

CABAC&#xff08;Context-based Adaptive Binary Arithmetic Coding&#xff09;&#xff0c;基于上下文的自适应二进制算术编码。CABAC是H.264/AVC标准中两种熵编码中的一种&#xff0c;它的编码核心算法就是算术编码&#xff08;Arithmetic Coding&#xff09;。 算术编码 传…

信息熵、编码冗余/信息熵冗余、压缩与解压缩速度

信息熵&#xff1a;是指数据所带的信息量。信息量与信源包含的事件发生的概率有关&#xff0c;事件概率越大&#xff0c;信息量越小&#xff1b;事件概率越小&#xff0c;信息量越大。将信源所有可能事件的信息量进行平均&#xff0c;就得到信息的熵&#xff08;Entropy&#x…

信息熵和压缩编码

目录 一、信息熵是什么&#xff1f;二、两种编码压缩2.1 香农-范诺编码简述2.2 特例详解 三、哈夫曼编码3.1 哈夫曼编码简述3.2 特例详解 四、RGB图像压缩 一、信息熵是什么&#xff1f; 信息&#xff1a;信息&#xff0c;指音讯、消息、通讯系统传输和处理的对象&#xff0c;…

6.信息论(一):信息量、熵和最优编码

前言 信息论是由克劳德香农发展&#xff0c;用来找出信号处理与通信操作的基本限制&#xff0c;如数据压缩、可靠的存储和数据传输等。自创立以来&#xff0c;已被应用多个领域&#xff0c;例如自然语言处理(NLP)、机器学习等领域。 定长编码(Block Codes) 让我们从一个例子…

信息熵与编码

文章目录 一、信息熵的概念二、利用编码求压缩率1.香农-凡诺编码2.霍夫曼编码 三、实验证明图像字节四、文献参考 一、信息熵的概念 信息是个很抽象的概念。人们常常说信息很多&#xff0c;或者信息较少&#xff0c;但却很难说清楚信息到底有多少。比如一本五十万字的中文书到…

熵编码原理

熵编码原理 一.熵编码原理1.原理介绍2.常见方案3.整数位元法4.熵编码模型二.熵编码CABAC介绍1.二进制化2.上下文建模3.二进制算术编码常规编码区间重归一化旁路编码 一.熵编码原理 1.原理介绍 熵编码即编码过程中按熵原理不丢失任何信息的编码。信息熵为信源的平均信息量&…

熵编码:CABAC

基于上下文的二进制算术编码&#xff08;Context-Based Adaptive Binary Arithmetic Coding,CABAC&#xff09;将自适应二进制算术编码和上下文模型相结合。是H.265/HEVC的主要熵编码方案。 主要包括三个步骤&#xff1a; 二进制化&#xff1b; 上下文建模&#xff1b; 二进…

熵编码:算术编码

算术编码不是简单的将每个信源符号映射成一个码字&#xff0c;而是对整个输入序列分配一个码字&#xff0c;所以平均意义上可以为每个信源符号分配长度小于1的码字。 算术编码操作简单&#xff0c;下面以一个实例讲解算术编码的原理&#xff1a; 设信源有a,b,c,d四种符号&…

GitLab-CI基础使用总结

思路梳理 下图是GitLab-ci的实现结构图&#xff1a; (实际结构会有出入&#xff0c;画成这样只是便于理解) GitLab:是一个基于 Git 的代码托管平台&#xff0c;提供了代码仓库管理、问题跟踪、CI/CD 等功能。它可以用于团队协作开发、版本控制、代码审查等场景。GitLab-runne…

Git --- Git Gui

目录 1. 创建和删除分支(了解即可) 2. Git Gui 3. 什么是ssh key 4. git/gitee生成密钥并通过 第一步&#xff1a;本地电脑配置 第二步&#xff1a;远程gitee仓库配置 第三步&#xff1a;修改你本地的ssh remote url. 不用https协议&#xff0c;改用git 协议 第四步&#x…

git与gerrit基础概念

序 本文记录了 git 与 gerrit 学习所得 重点关注于当前所用到的实际操作部分&#xff0c;其余理论部分以及更复杂用法留待将来用到时继续补充 1 Git 与 Gerrit Git 是当前全世界流行的分布式版本控制工具&#xff0c;但是只适用于纯文本文件&#xff0c;包括markdown、网页、…

Git入门|Git的基本用法(一)

1. Git的安装 首先在安装之前确认一下系统有没有安装Git。在Terminal中输入&#xff1a; git --version若确认系统没有安装git&#xff0c;可通过以下指南安装&#xff1a; Getting Started - Installing Git 2. 创建本地Git库 每次进行新项目时&#xff0c;都需要创建一个…

Gitlab-CI入门配置

Gitlab-CI使用及.gitlab-ci.yml配置 Gitlab-CI/CD 持续集成测试篇 Gitlab-CI/CD使用场景在这里插入代码片 首先&#xff0c;公司使用Gitlab作为工作仓库进行代码发布及版本控制&#xff0c;Gitlab内置了CI/CD的工具&#xff0c;这些工具可以用于代码提交的同时完成镜像构建、…

Gitlab CI/CD:入门指南

功能概览 CI/CD工作流 上图是基本的CI/CD工作流&#xff0c;与之对应的&#xff0c;gitlab几乎提供了上述流程节点所需的所有相关功能&#xff1a; 阶段功能 1. Verify 通过持续集成自动构建和测试你的应用程序 使用GitLab代码质量&#xff08;GitLab Code Quality&#xff09…

GitLab-CI 基础介绍

转载自 kubeclub GitLab-CI 工作原理 将代码托管到 git 仓库在项目的根目录下创建 .gitlab-ci.yml 文件&#xff0c;在文件中包含了构建、测试以及部署等脚本&#xff0c;这些脚本被分组为 stage&#xff0c;共同组成了 pipelineGitLab 检测到 ci.yml 文件&#xff0c;使用 G…

GitLab CI Pipeline

GitLab 不单单只是作为一个代码版本控制的仓库&#xff0c;很多场景下使用 GitLab 作为整合 CI 持续集成就 CD 持续发布的工作平台&#xff0c;那么就是 GitLab 的 CI Pipeline 功能了。 CI Pipeline 试想一下&#xff0c;如果开发人员只需要编写代码&#xff0c;而编译、打包…

CICD之 gitlab和gtilab runner

gitlab官网地址 官网文档地址 https://docs.gitlab.com/runner/install/docker.html 一。gitlab 1。gitlab安装 方式一&#xff1a;rpm包安装&#xff08;centos&#xff09;1,下载rpm包清华源软件镜像站https://mirrors.tuna.tsinghua.edu.cn/linux命令wget https://mirror…

gitlab-CI入门

gitlab-CI 代码管理自动化部署及消息推送 (1) 通过在项目根目录下配置**.gitlab-ci.yml**文件&#xff0c;可以控制ci流程的不同阶段&#xff0c;gitlab平台会扫描.gitlab-ci.yml文件&#xff0c;并据此处理ci流程。 (2) ci流程在每次团队成员push/merge后之后触发。每当你pu…

Gerrit介绍

谷歌 Android 开源项目在 Git 的使用上有两个重要的创新&#xff0c;一个是为多版本库协同而引入的 repo&#xff0c;这在之前我们已经详细讨论过。另外一个重要的创新就是 Gerrit —— 代码审核服务器。Gerrit 为 Git 引入的代码审核是强制性的&#xff0c;就是说除非特别的授…

Git--GUI

前言 上一篇文章简单的分享了Git 的 Bash Here的使用&#xff0c;以及一些Git常用的命令等。本篇文章要分享的内容为Git GUI Here 的使用。 一、GUI GIT官方网站为了解决部分用户通过命令行对git工具使用时的怨声载道的现象&#xff0c;因此推出了一个GIT的可视化工具Git Gui …