本节为opencv数字图像处理(15):图像压缩的第二小节,图像压缩中的编码方法:霍夫曼编码、Golomb编码、Rice编码、算术编码及其实现,主要包括:霍夫曼编码、Golomb编码、Rice编码、算术编码的原理与实现代码。

1. 霍夫曼编码

  霍夫曼编码对每个信源符号产生可能最小数量的编码符号。第一步是通过对所考虑的符号的概率进行排序,并将具有最小概率的符号合并为一个符号代替下次信源化简过程的符号,从而创建一个简化信源系列,过程如下图所示,重复合并直到信源只有两个符号的简化信源为止:

  第二步是对每个化简后的信源进行编码,从最小的信源开始,直到遍历原始信源。对两个符号信源的最小长度的二值码是0和1,这些符号被分配给最右边的两个符号(并不规定顺序,谁0谁1无所谓),整个过程如下图所示:

  这样编码的平均长度为:Lavg=0.4∗1L_{avg}=0.4*1Lavg​=0.4∗1+03∗2+0.1∗3+0.1∗4+0.06∗5++03*2+0.1*3+0.1*4+0.06*5++03∗2+0.1∗3+0.1∗4+0.06∗5+0.04∗5=2.20.04*5=2.20.04∗5=2.2比特/像素。之后也可以通过从左到右的顺序对串中每个符号进行分析来解码,对于一个编码串010100111100进行从左到右扫描,对应上表中的编码,可以发现,第一个有效码字为01010,对应a3a_3a3​,下一个是011对应a1a_1a1​,最终完全解码的消息为a3a1a2a2a6a_3a_1a_2a_2a_6a3​a1​a2​a2​a6​。

  当对大量符号进行编码时,最佳霍夫曼编码的构造也比较复杂。对于有JJJ个信源符号的通常情况,需要JJJ个符号概率,J−2J-2J−2次信源简化和J−2J-2J−2次编码赋值,当事先信源符号的概率可以估计时,使用预计算的霍夫曼编码可以达到接近最佳的编码,一些通用的图像压缩标准比如JPEG和MPEG,都规定了默认的霍夫曼编码表。同样适用霍夫曼编码的压缩标准还有CCITT、JBIG2、H.261、H.262、H.263、H.264等。

2. Golomb编码

  哥伦布编码时具有指数衰减概率分布输入的非负整数编码。给定一个非负整数和一个正整数除数m,表示为Gm(n)G_m(n)Gm​(n)的n关于m的Golomb编码时商下取整n/m下取整{n/m}下取整n/m的一元编码和nmodmn mod mnmodm的二进制表示的一个合并,Gm(n)G_m(n)Gm​(n)构建如下:

  • 形成商下取整n/m下取整{n/m}下取整n/m的一元编码(整数q的一元编码定义为q个1紧跟着一个0)
  • 令k=上取整log2mk= 上取整{log_2m}k=上取整log2​m,c=2k−m,r=nmodmc=2^k-m,r=n\ mod\ mc=2k−m,r=n mod m,并计算截短的余数r′r'r′使其满足0≤r<c0\leq r< c0≤r<c时r′=k−1r'=k-1r′=k−1,其他情况r′=k−cr'=k-cr′=k−c
  • 连接上两步的结果

  例如G4(9)G_4(9)G4​(9),下取整9/4=2下取整{9/4}=2下取整9/4=2的一元编码110,令k=上取整log24=2k=上取整{log_24}=2k=上取整log2​4=2,c=22−4=0,r=9mod4c=2^2-4=0,r=9 mod 4c=22−4=0,r=9mod4,r‘=k−c=2r‘=k-c=2r‘=k−c=2。所以最后的结果就是110和01的连接即G4(9)=11001G_4(9)=11001G4​(9)=11001,可以看到这种编码计算上要比最佳霍夫曼简单很多。

  当m=2k,c=0m=2^k,c=0m=2k,c=0时,产生的编码又称为Golomb-Rice编码或Rice码。当被表示的整数具有概率质量函数的集合分布时:P(n)=(1−ρ)ρn,0<ρ<1P(n)=(1-\rho)\rho^n,0<\rho<1P(n)=(1−ρ)ρn,0<ρ<1,可以证明Golobm码是最佳的,即当m=log2(1+ρ)log2(1/ρ)m=\frac{log_2(1+\rho)}{log_2(1/\rho)}m=log2​(1/ρ)log2​(1+ρ)​时,Gm(n)G_m(n)Gm​(n)为所有唯一可判度的编码提供了最短的平均码长。

3. 算术编码

  算术编码也是一种熵编码但生成的是非块码,假设有一个来自四符号信源的五符号序列a3a1a2a3a4a_3a_1a_2a_3a_4a3​a1​a2​a3​a4​,其中信源的概率分别为0.1、0.2、0.3和0.4,则按照信号的概率可以将[0,1)[0,1)[0,1)区间划分为[0,0.1)、[0.1,0.3)[0,0.1)、[0.1,0.3)[0,0.1)、[0.1,0.3)、[0.3,0.6)、[0.6,1)[0.3,0.6)、[0.6,1)[0.3,0.6)、[0.6,1)四部分。然后读入信号,第一个符号a3a_3a3​,占据区间[0.3,0.6)[0.3,0.6)[0.3,0.6),这样编码间隔变为[0.3,0.6)[0.3,0.6)[0.3,0.6);然后读入第二个符号a1a_1a1​,占原始区间的前10%,则编码间隔进一步变化,变为[0.3,0.33)[0.3,0.33)[0.3,0.33);然后读入a2a_2a2​,占原始区间的10%—30%,则编码间隔进一步变化,变为[0.303,0.309)[0.303,0.309)[0.303,0.309);然后读入a3a_3a3​,占原始区间的30%—60%,编码间隔变为[0.3048,0.3066)[0.3048,0.3066)[0.3048,0.3066);最后读入a4a_4a4​,占原始区间的60%—100%,编码间隔变为[0.30588,0.3066)[0.30588,0.3066)[0.30588,0.3066),然后从这个区间上任选一个数作为编码输出,比如取0.306。

  解码的时候同样需要知道信源的概率0.1、0.2、0.3和0.4,编码输出为0.306,原始符号序列长度为5。开始解码:0.306在区间[0.3,0.6)[0.3,0.6)[0.3,0.6),所以第一个符号为a3a_3a3​;而0.306在[0.3,0.6)[0.3,0.6)[0.3,0.6)的前10%[0.3,0.33)[0.3,0.33)[0.3,0.33),所以第二个符号为a1a_1a1​;而0.306在[0.3,0.33)[0.3,0.33)[0.3,0.33)的10%—30%[0.303,0.309)[0.303,0.309)[0.303,0.309)上,所以第三个编码为a2a_2a2​;而0.306在区间[0.303,0.309)[0.303,0.309)[0.303,0.309)的30%—60%[0.3048,0.3066)[0.3048,0.3066)[0.3048,0.3066),所以第四个符号为a_3;而0.306在区间[0.3048,0.3066)[0.3048,0.3066)[0.3048,0.3066)的%60—100%,所以最后一个符号为a4a_4a4​。


欢迎扫描二维码关注微信公众号 深度学习与数学   [每天获取免费的大数据、AI等相关的学习资源、经典和最新的深度学习相关的论文研读,算法和其他互联网技能的学习,概率论、线性代数等高等数学知识的回顾]

opencv图像分析与处理(15)- 图像压缩中的编码方法:霍夫曼编码、Golomb编码、Rice编码、算术编码及其实现相关推荐

  1. 【图像压缩重建】基于霍夫曼算法实现图像压缩重建matlab代码

    1 简介 哈夫曼编码是一种数据编码方式,以哈夫曼树--即最优二叉树.用带杈路径长度最小的二叉树,对数据进行重编码,经常应用于数据压缩.在计算机信息处理中,"哈夫曼编码"是一种一致性 ...

  2. JPEG编码过程中的霍夫曼编码

    JPEG编码过程中的霍夫曼编码 jpeg文件中的霍夫曼编码分两个部分对DC系数编码和对AC系数的编码. DC系数的编码 编码过程 DC系数的编码由两部分组成, huffman 编码的bitlen + ...

  3. OpenCV中的图像处理 —— 霍夫线 / 圈变换 + 图像分割(分水岭算法) + 交互式前景提取(GrabCut算法)

    OpenCV中的图像处理 -- 霍夫线 / 圈变换 + 图像分割(分水岭算法) + 交互式前景提取(GrabCut算法)

  4. 【第 13 章 基于霍夫曼图像压缩重建--Matlab深度学习实战图像处理应用】

    基于霍夫曼图像压缩重建 部分参考来源: https://blog.csdn.net/qq_59747472/article/details/121890265 为了节省空间,在对数据进行编码时,可以对 ...

  5. 基于霍夫曼(Huffman)图像编码的图像压缩和重建-含Matlab代码

    目录 一.引言 二.霍夫曼Huffman编码 2.1 霍夫曼编码流程 2.2 输入数据的编码 三.霍夫曼解码 四.实验结果 五.参考文献 六.Matlab代码(GUI界面)获取 一.引言 随着通信与信 ...

  6. jpg图片与jpeg图片格式的区别(没有区别,.jpg只是扩展名.jpeg的缩写)JPEG图像压缩(YUV4:2:0 缩减采样、缩减取样)(离散余弦变换 DCT算法)(量化)(熵编码)(霍夫曼哈夫曼)

    文章目录 20191026 20220414 更新,更系统去了解里面的编码压缩流程 科普:关于图像格式JPG和JPEG你知多少? 一.前言 二.JPEG和JPG的关系 三.色彩空间转换 缩减取样 离散 ...

  7. OpenCV学习——直方图、边缘检测、模板匹配以及霍夫变化

    OpenCV学习--直方图.边缘检测.模板匹配以及霍夫变化 OpenCV学习--直方图.边缘检测.模板匹配以及霍夫变化 直方图 图像直方图 直方图的术语和意义 掩膜的应用 直方图均衡化 自适应的直方图 ...

  8. matlab霍夫曼图像压缩,用matlab仿真huffman编码在jpg图像压缩中的应用崔微微

    <用matlab仿真huffman编码在jpg图像压缩中的应用崔微微>由会员分享,可在线阅读,更多相关<用matlab仿真huffman编码在jpg图像压缩中的应用崔微微(3页珍藏版 ...

  9. opencv 霍夫曼变换 直线提取

    import cv2 import numpy as np img = cv2.imread("hd.jpeg", 0)img = cv2.GaussianBlur(img,(3, ...

  10. OpenCV之imgproc 模块. 图像处理(3)霍夫线变换 霍夫圆变换 Remapping 重映射 仿射变换

    霍夫线变换 目标 在这个部分您将学习到: 使用OpenCV的以下函数 HoughLines 和 HoughLinesP 来检测图像中的直线. 原理 Note 以下原理的说明来自书籍 学习OpenCV  ...

最新文章

  1. 【跃迁之路】【495天】程序员高效学习方法论探索系列(实验阶段252-2018.06.15)...
  2. VTK:可视化之Visualize2DPoints
  3. Python xlrd 读取xls文件
  4. 多线程进一步的理解------------线程的创建
  5. 算法与数据结构(part2)--Python内置类型性能分析
  6. string 方法 java_java中常用的String方法
  7. 【Calcite】Cilcate编译
  8. Hashtable 和 HashMap 的区别
  9. 如何使用HttpContext对象
  10. cisco ADSL配置
  11. python如何创建一个列表,在python中创建一个由列表索引的字典
  12. python编程100例-一,python编程100例
  13. mybatis~动态SQL(1)
  14. Codeforces 57C Array dp暴力找到规律
  15. H3C交换机设备使用QOS策略方式实现报文过滤
  16. TCP/IP网络知识点总结
  17. Java对象内存分配流程
  18. html5地图定位高德,JS使用高德地图定位
  19. NANDFLASH与PSRAM
  20. iastora怎么改成ahci_WIN7系统硬盘IDE模式转AHCI模式

热门文章

  1. Python 学习笔记 - 不断更新!
  2. 在阿里云上创建带gpu的ecs实例
  3. 2、linux网络编程--无连接与面向连接的区别
  4. QQ连连看 逆向分析外挂制作报告【脱壳ASPPack】【模拟点击】【内联HOOK】
  5. Xamarin University-----Xamarin Mobile Certification Exam考试经历(还没写完)
  6. WPF 自己动手来做安装卸载程序
  7. spark架构设计编程模型 02
  8. 测试一下各浏览器对CSS3的支持
  9. python字符串注意点
  10. 如何解决ADB server didn't ACK