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

news2025/1/18 9:02:01

原理

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

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

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

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

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

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

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

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

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

python实现下图结果

在这里插入图片描述

提示

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

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.coloradmin.cn/o/1370563.html

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

相关文章

数学建模-Matlab R2022a安装步骤

软件介绍 MATLAB是一款商业数学软件,用于算法开发、数据可视化、数据分析以及数值计算的高级技术计算语言和交互式环境,主要包括MATLAB和Simulink两大部分,可以进行矩阵运算、绘制函数和数据、实现算法、创建用户界面、连接其他编程语言的程…

jenkins构建git项目timeout

问题点: Started by user unknown or anonymous Running as SYSTEM Building in workspace /var/jenkins_home/workspace/test-one using credential f28d956-8ee1-4f20-a32b-06879b487c70 Cloning the remote Git repository Cloning repository http://git.cc.co…

[足式机器人]Part2 Dr. CAN学习笔记 - Ch02动态系统建模与分析

本文仅供学习使用 本文参考: B站:DR_CAN Dr. CAN学习笔记 - Ch02动态系统建模与分析 1. 课程介绍2. 电路系统建模、基尔霍夫定律3. 流体系统建模4. 拉普拉斯变换(Laplace)传递函数、微分方程4.1 Laplace Transform 拉式变换4.2 收…

关于进制在输出时的转换【C语言】

目录 输入输出格式参考文章 1. 十进制整数作为八进制/十六进制输出 2. 八进制整数作为十进制/十六进制输出 3. 十六进制整数作为八进制/十进制输出 我们处理的整数通常用十进制表示,在计算机内存中是以二进制补码形式存储,但通常二进制表示的整数比较…

C#封装服务

C#封装服务 新建服务项目;重构 OnStart 和 OnStop using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Diagnostics; using System.Linq; using System.ServiceProcess; using System.Text; using S…

基础数据结构第十期 哈希表(数组+STL)

前言: 哈希表是一种非常重要的数据结构,希望大家都能够熟练掌握!!! 一、哈希表的基本内容 哈希表(Hash Table),也被称为哈希映射(Hash Map)或字典&#xf…

Redis底层原理

持久化 Redis虽然是个内存数据库,但是Redis支持RDB和AOF两种持久化机制,将数据写往磁盘,可以有效地避免因进程退出造成的数据丢失问题,当下次重启时利用之前持久化的文件即可实现数据恢复。 RDB RDB持久化是把当前进程数据生成快照保存到硬盘的过程。所谓内存快照,就是…

vue2使用文件上传读取本地照片并转化base64格式进行展示

创建个vue2项目,直接把代码放到一个vue2页面内运行就好,下面代码拿来即用 <template><div><div class"replace_menu_mask" click"closeMenu"><img :src"replaceImg" alt"" style"width: 100%;">&l…

企业微信forMAC,如何左右翻动预览图片

1、control commandshifd 进入企业微信的debug调试模式 2、按照如下步骤选择 3、重启企业微信

【漏洞复现】锐捷EG易网关login.php命令注入漏洞

Nx01 产品简介 锐捷EG易网关是一款综合网关&#xff0c;由锐捷网络完全自主研发。它集成了先进的软硬件体系架构&#xff0c;配备了DPI深入分析引擎、行为分析/管理引擎&#xff0c;可以在保证网络出口高效转发的条件下&#xff0c;提供专业的流控功能、出色的URL过滤以及本地化…

【复习】人工智能 第7章 专家系统与机器学习

专家系统就是让机器人当某个领域的专家&#xff0c;但这章专家系统不咋考&#xff0c;主要靠书上没有的机器学习。 一、专家系统的基本组成 二、专家系统与传统程序的比较 &#xff08;1&#xff09;编程思想&#xff1a; 传统程序 数据结构 算法 专家系统 知识 推理 &…

ansible基础概念

一、【写在前面】 前面断更了几天&#xff0c;笔者被流感给干倒了&#xff0c;去拍了个核磁&#xff0c;给我脑子干成脱髓鞘了&#xff0c;也不知道是之前新冠导致的还是如何&#xff0c;哎要变成愚蠢的低级动物了……稍微恢复一点体力&#xff0c;今天赶快来博客水一水文章。…

Javaweb之Mybatis的动态SQLforeach和include的详细解析

3.3 动态SQL-foreach 案例&#xff1a;员工删除功能&#xff08;既支持删除单条记录&#xff0c;又支持批量删除&#xff09; SQL语句&#xff1a; delete from emp where id in (1,2,3); Mapper接口&#xff1a; Mapper public interface EmpMapper {//批量删除public voi…

re:Invent 2023 技术上新|使用管理控制台中的全新 myApplications 简化应用程序资源的管理...

亚马逊云科技支持应用程序操作的 myApplications 正式上线&#xff0c;这组新功能可帮助您在亚马逊云科技上开始使用您的应用程序&#xff0c;以更少的工作量操作应用程序&#xff0c;并更快地进行大规模迁移。使用亚马逊云科技管理控制台中的 myApplication&#xff0c;您可以…

Spark与Elasticsearch的集成与全文搜索

Apache Spark和Elasticsearch是在大数据处理和全文搜索领域中非常流行的工具。在本文中&#xff0c;将深入探讨如何在Spark中集成Elasticsearch&#xff0c;并演示如何进行全文搜索和数据分析。将提供丰富的示例代码&#xff0c;以便更好地理解这一集成过程。 Spark与Elastics…

555断线报警器电路图

电路的核心部分由NE555组成&#xff0c;R1、R2、C1和NE555组成一个频率越为3KHz左右的多谐振荡电路&#xff0c;当电路接通电源时&#xff0c;振荡器开始工作蜂鸣器LS1发出响声&#xff1b;当1和2被短接时&#xff0c;振荡器的工作条件被破坏&#xff0c;LS1停止工作。 电路分…

【动态规划】【矩阵】C++算法329矩阵中的最长递增路径

作者推荐 【动态规划】C算法312 戳气球 题目 给定一个 m x n 整数矩阵 matrix &#xff0c;找出其中 最长递增路径 的长度。 对于每个单元格&#xff0c;你可以往上&#xff0c;下&#xff0c;左&#xff0c;右四个方向移动。 你 不能 在 对角线 方向上移动或移动到 边界外&…

如何正确地理解应用架构并开发

许多同学或多或少都经历过这样的流程&#xff1a; 新同学刚来公司&#xff0c;学习了解团队的一些工程代码&#xff0c;并了解其中的代码风格团队新接手了一些其他团队的项目&#xff0c;需要了解工程结构以及概念如何定义工程项目的工程结构&#xff0c;包目录结构并达成团队共…

IO进程线程 day7 进程间通信

1.使用消息队列完成两个进程之间相互通信 2.信号通信相关代码的重新实现 &#xff08;1&#xff09;signal函数的实例 #include <head.h>//定义信号处理函数 void handler(int signum) {if(signum SIGINT) //表明要处理2号信号{printf("用户按下了ctrl c键…

【数据结构】二叉树的链式实现

树是数据结构中非常重要的一种&#xff0c;在计算机的各方个面都有他的身影 此篇文章主要介绍二叉树的基本操作 目录 二叉树的定义&#xff1a;二叉树的创建&#xff1a;二叉树的遍历&#xff1a;前序遍历&#xff1a;中序遍历&#xff1a;后序遍历&#xff1a;层序遍历&#…