无失真编码之算术编码的python实现——数字图像处理

news/2024/7/21 7:38:39 标签: python, 开发语言, 图像处理, 计算机视觉, opencv

原理

无失真编码中的算术编码是一种用于将输入数据进行高效压缩的方法,同时保留了原始数据的完整性。
算术编码的实现过程如下:

  1. 数据分段:首先,将要进行编码的数据划分为一个个符号或字符。每个符号可以是文本中的一个字母、一幅图像中的一个像素或其他数据单元,具体取决于应用场景。

  2. 计算符号概率:对于每个符号,需要计算其在数据中出现的概率。通常,这些概率是基于统计数据中每个符号的出现频率来估计的。

  3. 构建累积概率表:根据符号的概率,构建一个累积概率表。这个表将每个符号映射到一个累积概率区间,其长度与符号的概率相关。通常,累积概率表是一个包含0到1之间所有可能区间的表格。

  4. 编码过程:算术编码的编码过程从0到1的一个初始区间开始。然后,根据输入数据中的每个符号,不断地缩小当前区间,使其逐渐趋近于一个特定的数值。编码的方式是根据当前符号的累积概率区间来调整当前区间的大小。具体步骤如下:

  5. 对于每个输入符号,找到其在累积概率表中对应的区间。

  6. 将当前区间按照符号的概率进行分割,使得当前区间缩小到符号对应的区间范围内。

  7. 重复以上两步,直到处理完所有输入符号。

  8. 编码结果:最终,算术编码会产生一个介于0和1之间的小数,这个小数可以用二进制或其他形式的编码表示。通常,这个编码是一个无限小数,但实际上会截断为有限长度,以方便存储或传输。编码后的数据可以通过解码过程来还原成原始数据。

python_17">python实现下图结果

在这里插入图片描述

提示

所示结果图中有两部分内容,一是对消息序列中最后一个符号编码后得到的各符号子区间,二是对消息序列编码完成后得到的子区间的上下边界。信源符号及概率分布可由一个字典表示,待编码消息序列为”cadacdb”,如
在这里插入图片描述

python_25">python代码

python">import numpy as np

prob_table = {'a': 0.1,
              'b': 0.4,
              'c': 0.2,
              'd': 0.3}
msg = 'cadacdb'

def process_stage(low, high):
    stage_len = high - low
    stage_prob = {}
    for key in prob_table:
        cum_prob = low + stage_len * prob_table[key]
        stage_prob[key] = [low, cum_prob]
        low = cum_prob

    return stage_prob

low = 0.0
high = 1.0

encoder = []

for ch in msg:
    stage_prob = process_stage(low, high)
    low = stage_prob[ch][0]
    high = stage_prob[ch][1]

    encoder.append(stage_prob)

for key, value in encoder[-1].items():
    print(key, ': ', value)
print(low, high)

结果展示

在这里插入图片描述

总结

算术编码的本质是为整个输入序列分配一个码字,而不是给每个字符分别指定码字,因此平均意义上可以为单个字符分配码长小于1的码字。
算术编码用到两个基本的参数:符号的概率和它的编码间隔。信源符号的概率决定压缩编码的效率,也决定编码过程中信源符号的间隔,而这些间隔包含在L到H之间。编码过程中的间隔决定了符号压缩后的输出。
给定事件序列的算术编码步骤如下:
1.编码器在开始时将“当前间隔”设置为[ L, H);
2.对每一事件,编码器按步骤a)和b)进行处理:
a) 编码器将“当前间隔”分为子间隔,每一个事件一个;
b) 一个子间隔的大小与下一个将出现的事件的概率成比例,编码器选择子间隔对应于下一个确切发生的事件相对应,并使它成为新的“当前间隔”;
3.最后输出的“当前间隔”的下边界和上边界之间的一个合适的值就是该给定事件序列的算术编码。


http://www.niftyadmin.cn/n/5314465.html

相关文章

Linux:linux计算机和windows计算机 之间 共享资源

在前面章节已经介绍过,NFS用于Linux系统之间的文件共享,windows 并不知道 NFS ,而是使用 CIFS (Common Internet File System) 的协议机制 来 “共享” 文件。在1991年,Andrew Tridgell 通过逆向工程 实现了 CIFS 协议&#xff0c…

Spring MVC组件

1.DispatcherServlet前端控制器 用户请求到达前端控制器,它就相当于mvc模式中的c,dispatcherServlet 是整个流程控制的中心,由它调用其它组件处理用户的请求,dispatcherServlet 的存在降低了组件之间的耦合性。 2.HandlerMappin…

sympy质点模型

文章目录 质点动能和动能势能角动量 质点 粒子,或者说质点,堪称经典物理中的核心模型了,其所具备的重要物理量,包括质量、能量、动量、角动量之类,也早已从经典力学蔓延出去,成为内涵更加深刻的物理概念。…

软件测试|MySQL算术运算符使用详解

简介 MySQL是一种流行的开源关系型数据库管理系统,广泛用于各种应用程序和网站的数据存储和管理。在MySQL中,算术运算符是执行数学计算的特殊符号,用于处理数字类型的数据。本文将详细介绍MySQL中常用的算术运算符及其使用方法。 常用算术运…

vue2源码解析之第一步(对数据进行劫持)

###环境搭建 第一步 创建项目: npm init -y 第二步 安装对应的插件: npm i rollup rollup-plugin-babel babel/core babel/preset-env --save-dev 第三步 全局下创建rollup配置文件 rollup.config.js import babel from rollup-plug…

陶瓷碗口圆度检测案例-原理概述

检测概述 随着社会的发展和人民生活水平的提高,现在市场不仅对陶瓷产品数量提出新的要求,还在质量上提出了更加严苛的标准。然而,由于日用陶瓷制品韧性较低,生产工艺比较特殊,成批生产时质量不易控制等特点&#xff0…

Apache ECharts | 一个数据可视化图表库

文章目录 1、简介1.1、主要特点1.2、使用场景 2、安装方式一:从下载的源代码或编译产物安装方法二:从 npm 安装方法三:⭐定制安装echarts.js 3、使用 官网: 英语:https://echarts.apache.org/en/index.html 中文&a…

解决vscode无法运行npm和node.js命令的问题

第一次安装npm和node.js想要在vscode中直接输入控制台命令会因为权限问题无法执行。 这里可以修改本机权限来解决。 搜索powershell并且以管理员权限运行 打开之后输入下面的命令即可 PS C:\Users\Administrator> Get-ExecutionPolicy Restricted PS C:\Users\Administra…