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

原理

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

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

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

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

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

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

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

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

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

python实现下图结果

在这里插入图片描述

提示

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

python代码

import numpy as npprob_table = {'a': 0.1,'b': 0.4,'c': 0.2,'d': 0.3}
msg = 'cadacdb'def process_stage(low, high):stage_len = high - lowstage_prob = {}for key in prob_table:cum_prob = low + stage_len * prob_table[key]stage_prob[key] = [low, cum_prob]low = cum_probreturn stage_problow = 0.0
high = 1.0encoder = []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.mzph.cn/news/609773.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ubuntu 20.04下 Tesla P100加速卡使用

1.系统环境:系统ubuntu 20.04, python 3.8 2.查看cuDNN/CUDA与tensorflow的版本关系如下: Build from source | TensorFlow 从上图可以看出,python3.8 对应的tensorflow/cuDNN/CUDA版本。 3.安装tensorflow #pip3 install tensorflow 新版…

hadoop自动获取时间

1、自动获取前15分钟 substr(from_unixtime(unix_timestamp(concat(substr(20240107100000,1,4),-,substr(20240107100000,5,2),-,substr(20240107100000,7,2), ,substr(20240107100000,9,2),:,substr(20240107100000,11,2),:,00))-15*60,yyyyMMddHHmmss),1) unix_timestam…

Ceph源码分析-s->req_id = store->svc()->zone_utils->unique_id(req->id)

s->req_id store->svc()->zone_utils->unique_id(req->id); 涉及到指针和对象方法的调用。我会逐步为你解释这行代码的含义。 s->req_id ...; s 是一个指针,它指向一个结构或类。req_id 是该结构或类的一个成员变量。这行代码的意思是&#xff…

《管理的实践》商业/企业的目的和功能

笔记 From《管理的实践》彼得德鲁克 企业的目的 企业的目的,只有一个正确而有效的定义:“创造顾客”。 市场不是由上帝、大自然或经济力量创造的,而是由企业家创造的。 企业的功能 由于企业的目的是创造顾客,任何企业都有两个基…

与AI合作 -- 单例工厂2遗留的问题:bard的错误

问题 上一节我们针对函数内静态变量初始化在多线程环境中要不要用锁保护提出了疑问&#xff0c;代码如下&#xff1a; class Singleton { public:static Singleton& getInstance() {std::lock_guard<std::mutex> lock(mutex); // Acquire lock for thread safetysta…

LeetCode[102] 二叉树层序遍历

Description&#xff1a;给你二叉树的根节点 root &#xff0c;返回其节点值的 层序遍历 。 &#xff08;即逐层地&#xff0c;从左到右访问所有节点&#xff09;。解法&#xff1a; vector<vector<int>> levelOrder(TreeNode* root) {vector<vector<int>…

第一次面试总结 - 迈瑞医疗 - 软件测试

&#x1f9f8;欢迎来到dream_ready的博客&#xff0c;&#x1f4dc;相信您对专栏 “本人真实面经” 很感兴趣o (ˉ▽ˉ&#xff1b;) 专栏 —— 本人真实面经&#xff0c;更多真实面试经验&#xff0c;中大厂面试总结等您挖掘 注&#xff1a;此次面经全靠小嘴八八&#xff0c;没…

大数据版本管理工具数据湖文件存储系统LakeFS客户端的安装和配置使用

LakeFS是一个开源的数据湖文件存储系统&#xff0c;它提供了版本控制和数据管理的功能。本文将介绍如何安装和配置LakeFS客户端。 首先&#xff0c;你需要确保已经安装了Python环境。LakeFS的客户端使用Python编写&#xff0c;因此需要安装Python来运行客户端。 安装LakeFS客…

腾讯云最新优惠活动入口整理汇总

随着云计算技术的快速发展&#xff0c;腾讯云作为国内领先的云服务提供商&#xff0c;一直致力于为用户提供高效、稳定、安全的云服务。为了回馈广大用户的支持&#xff0c;腾讯云经常推出各种优惠活动。本文将对腾讯云最新的优惠活动入口进行整理和汇总&#xff0c;帮助用户更…

《系统架构设计师教程(第2版)》第3章-信息系统基础知识-08-典型信息系统架构模型(电子政务、电子商务)

文章目录 1. 企业信息化与电子政务1.1 电子政务的概念1.2 三个组成部分1.3 电子政务的内容(重点)1)政府与政府2)政府对企/事业单位3)政府对居民4)企业对政府5)居民对政府1.4 电子政务的发展阶段。1)起步阶段2)政府与用户单向互动3)政府与用户双向互动4)网上事务处理…

【CV】计算两个向量的夹角,并使用 OpenCV 可视化弧线

背景 基于人体/动物&#xff0c;骨骼点数据&#xff0c;计算关节角度 1. 原理 计算两个向量的夹角&#xff0c;我们已三个点为例&#xff0c;BA 向量和BC向量&#xff0c;求 B 的角度。若为四个点&#xff0c;延长交叉即可。 2. 效果 效果图如下 3. 核心代码 def comput…

【服务器数据恢复】FreeNAS+ESXi数据恢复案例

服务器数据恢复环境&#xff1a; 一台服务器&#xff0c;虚拟化系统为esxi&#xff0c;上层使用iSCSI的方式实现FC SAN功能&#xff0c;iSCSI通过FreeNAS构建。 FreeNAS采用了UFS2文件系统&#xff0c;esxi虚拟化系统里有3台虚拟机&#xff1a;其中一台虚拟机安装FreeBSD系统&a…

[足式机器人]Part3 机构运动学与动力学分析与建模 Ch00-2(2) 质量刚体的在坐标系下运动

本文仅供学习使用&#xff0c;总结很多本现有讲述运动学或动力学书籍后的总结&#xff0c;从矢量的角度进行分析&#xff0c;方法比较传统&#xff0c;但更易理解&#xff0c;并且现有的看似抽象方法&#xff0c;两者本质上并无不同。 2024年底本人学位论文发表后方可摘抄 若有…

开发基础----牛客SQL速成

SQL练习题解 一.单表查询(非技术快速入门)1.基础查询SQL1 查询所有列SQL2 查询多列SQL3 查询结果去重SQL4 查询结果限制返回行数SQL5 将查询后的列重新命名SQL6 查找学校是北大的学生信息SQL7 查找年龄大于24岁的用户信息SQL8 查找某个年龄段的用户信息SQL9 查找除复旦大学的用…

redis的高可用(主从复制、哨兵、群集)

redis的高可用&#xff08;主从复制、哨兵、群集&#xff09; 主从复制&#xff1a;主从复制是高可用Redis的基础&#xff0c;哨兵和集群都是在主从复制基础上实现高可用的。主从复制主要实现了数据的多机备份&#xff0c;以及对于读操作的负载均衡和简单的故障恢复。缺陷&…

使用 LLVM clang C/C++ 编译器编译 OpenSSL 3.X库

1、下载 OpenSSL 3.X 库的源代码放到待编译目录 2、解压并接入 OpenSSL 3.X 库源码的根目录 3、复制 ./Configure 一个取名为 ./Configure-clang 4、修改 ./Configure-clang 找到配置段&#xff1a; CC CXX CPP LD 把它们改成 CC > "/usr/bin/clang-…

JavaScript 地址信息与页面跳转

在JavaScript中&#xff0c;你可以使用各种方法来处理地址信息并进行页面跳转。以下是一些常见的方法&#xff1a; 1.使用window.location对象&#xff1a; window.location对象包含了当前窗口的URL信息&#xff0c;并且可以用来进行页面跳转。 * 获取URL的某一部分&#xf…

【python】爬取豆瓣电影排行榜Top250存储到Excel文件中【附源码】

英杰社区https://bbs.csdn.net/topics/617804998 一、背景 近年来&#xff0c;Python在数据爬取和处理方面的应用越来越广泛。本文将介绍一个基于Python的爬虫程 序&#xff0c;用于抓取豆瓣电影Top250的相关信息&#xff0c;并将其保存为Excel文件。 程序包含以下几个部…

Qt UI框架和Duilib UI框架差别

Qt UI框架和Duilib UI框架在以下几个方面存在差异: 跨平台性:Qt是一个跨平台的UI工具包,可以在不同的操作系统上运行,如Windows、Linux和Mac OS X。而Duilib主要针对Windows系统,其跨平台能力相对较弱。 功能和性能:Qt作为一个成熟的框架,提供了丰富的功能和性能,包括对…

[游戏开发] 两向量夹角计算(0-360度)

上图是Unity左手坐标系&#xff0c;红轴是右&#xff0c;蓝轴是前&#xff0c;绿轴是上 测试目标是黑(3.54,0,4)、黄(-3.85,0,4.8)、灰(0.46,0,-2.6)三个向量&#xff0c;且三个向量都再XZ平面上&#xff0c;Y的值为0 以黑色为起始轴&#xff0c;和其他两周做角度计算 计算角…