基于huffman编解码的图像压缩算法matlab仿真

目录

1.算法运行效果图预览

2.算法运行软件版本

3.部分核心程序

4.算法理论概述

4.1 Huffman编码算法步骤

4.2 Huffman编码的数学原理

4.3 基于Huffman编解码的图像压缩

5.算法完整程序工程


1.算法运行效果图预览

2.算法运行软件版本

matlab2022a

3.部分核心程序

.........................................................................
for ij = 1:size(I0,3) I     = I0(:,:,ij);[m,n] = size(I); % 将当前通道的图像展平为一维向量  Ivect = I(:);% 获取当前通道的唯一像素值和它们的频率  symb  = single(unique(Ivect)); cnts  = hist(Ivect, symb); Probs = double(cnts) ./ sum(cnts); % 计算Huffman编码字典和平均长度  [dictionary,Lens(ij)] = func_huffdict(symb,Probs); % 对当前通道的图像进行Huffman编码  Ienc                  = func_huffencode(symb,dictionary,Ivect); % 对Huffman编码进行解码,得到无损压缩后的像素值  Idec                  = func_huffdecode(symb,dictionary,Ienc);% 将解码后的一维向量重塑为二维图像  Iout(:,:,ij)          = reshape(Idec,m,[]);
end% 将无损压缩后的图像保存为JPEG格式  
imwrite(Iout,'cmps.jpeg'); 
% 显示图像及其相关信息 
figure; 
Isize1      = imfinfo(Names).FileSize;
Isize2      = (Isize1*(sum(Lens(:))/3))/8; 
CmpRates    = 100*((Isize1 - Isize2)/Isize1); subplot(1,2,1);
imshow(I0); 
title(sprintf("原图 \n 容量: "+ Isize1/(1024*1024) + " MB"));subplot(1,2,2);
imshow(Iout); 
title(sprintf("压缩图 \n 容量: "+ Isize2/(1024*1024) + " MB \n 压缩率: "+CmpRates+"%%]"));
96

4.算法理论概述

        Huffman编码是一种用于无损数据压缩的熵编码算法。由David A. Huffman在1952年提出。该算法完全依据字符出现概率来构造异字头的平均长度最短的码字,有时称之为最佳编码,一般就叫做Huffman编码。

4.1 Huffman编码算法步骤

初始化:根据符号概率的大小顺序对符号进行排序,即按概率大小排序,得到符号序列。
创建节点:将概率最小的两个节点相加,并作为一个新节点,新节点的概率为这两个节点概率之和。然后,将这两个节点从概率队列中删除,将新节点插入队列中。
更新队列:重复上一步骤,直到队列中只剩下一个节点为止。此时,这个节点就是Huffman树的根节点。
生成编码:从根节点开始,向左的边标记为0,向右的边标记为1。然后,从根节点到每个叶节点的路径就构成了该叶节点对应符号的Huffman编码。


4.2 Huffman编码的数学原理

       Huffman编码的数学原理主要基于信息论中的熵的概念。熵是一个用于度量随机变量不确定性的量。对于一个离散随机变量X,其熵H(X)定义为:

        Huffman编码的主要思想是,对于出现概率高的符号,赋予较短的编码;对于出现概率低的符号,赋予较长的编码。这样,平均码长就会接近熵的下界,从而实现高效的无损压缩。

4.3 基于Huffman编解码的图像压缩

       在图像压缩中,首先需要将图像数据转换为一系列符号。这可以通过多种方式实现,例如可以将像素值作为符号,或者将像素值的差值作为符号。然后,统计这些符号的出现概率,并使用Huffman编码算法生成对应的Huffman编码。最后,将编码后的数据以及Huffman树的结构信息一起存储或传输。

       解码时,首先读取Huffman树的结构信息,重建Huffman树。然后,根据Huffman树对编码后的数据进行解码,得到原始的符号序列。最后,将符号序列转换回图像数据。

       Huffman编码是一种非常有效的无损数据压缩算法,特别适用于处理具有不同出现概率的符号序列。在图像压缩中,通过将图像数据转换为符号序列,并使用Huffman编码对符号进行压缩,可以实现较高的压缩比和较好的图像质量。同时,由于Huffman编码是无损的,因此解压后的图像与原始图像完全一致,不会引入任何失真。

5.算法完整程序工程

OOOOO

OOO

O

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/584504.shtml

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

相关文章

【操作系统】不同操作系统内核架构分析

一、内核架构与操作系统性能之间的关系的分析 1. 适用性和专业化: 不同的内核架构往往会有不同的设计目标和优化点。例如,实时操作系统(RTOS)和通用操作系统(像Linux或Windows)在设计时就有不同的重点&am…

【Python基础011】Python中字符串的具体用法

1、创建 字符串的创建共有3种方式 1)单/双引号创建短字符串 s hello worlds “hello world” 2)三个单/双引号创建短字符串 三个单/双引号一般用于多行文本的注释,如果将这样的字符串用print打印,或者赋给一个变量,…

3D游戏角色建模纹理贴图处理

在线工具推荐: 3D数字孪生场景编辑器 - GLTF/GLB材质纹理编辑器 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎 在本文中,我们将介绍 3D 纹理的基础知识,并讨…

【C语言】数据结构——排序二(快排)

💗个人主页💗 ⭐个人专栏——数据结构学习⭐ 💫点击关注🤩一起学习C语言💯💫 目录 导读:数组打印与交换1. 交换排序1.1 基本思想:1.2 冒泡与快排的异同 2. 冒泡排序2.1 基本思想2.2 …

【Unity动画系统】Animator有限状态机参数详解

👨‍💻个人主页:元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏:Uni…

校园跑腿小程序源码系统:取快递+寄快递+食堂超市跑腿 带完整的搭建教程

现如今,越来越多的校园生活服务需求涌现出来。为了满足学生们的日常需求,校园跑腿小程序应运而生。这款小程序集成了取快递、寄快递、食堂超市跑腿等功能,为学生们提供了一个方便、快捷的生活服务平台。 以下是部分代码的示例: 系…

如何使用工具查看机系统信息,应用管理、文件管理

摘要 克魔助手是一款功能丰富的手机助手软件,提供了诸多实用的功能模块,包括手机系统信息显示、应用管理、文件管理、描述文件安装与测试、崩溃日志、实时日志、截图、活跃程序、性能监控和网络抓包等。本文将对克魔助手的界面概览和各功能模块进行详细…

数据结构面试题目

什么是数据结构?计算机存储、组织数据的方式。数据结构包括逻辑结构、物理结构和对数据的一系列操作。其中逻辑结构包括了线性结构(线性表、栈和队列)和非线性结构(树、图);物理结构包括顺序存储结构和链式…

UGUI:一个轻量级的TFTLCD彩色显示屏GUI库

目录 一、引言 二、移植说明 三、如何使用UGUI函数 2.1 UGUI函数介绍 2.2 窗口控件管理 2.3 如何建立一个按键 四、如何实现触摸控制 一、引言 UGUI是一个经过精心设计的轻量级TFT-LCD彩色显示屏GUI库,旨在为用户提供高效、稳定且易于使用的图形用户界面。该…

邮件营销最佳时段:提升邮件打开率与转化率的策略

在如今数字时代,电子邮件营销已成为企业推广及与客户互动的有效途径。但是,一个普遍的现象是:何时发送电子邮件才能更合理?本文将探讨电子邮件营销的出色推送机会,并提供一些有用的提议,以帮助企业更好地规…

OrientDB使用教程:全面了解图数据库

图数据库在当今数据处理领域中扮演着越来越重要的角色,而OrientDB作为一种多模型的数据库,具有图数据库、文档数据库和对象数据库的特性,为应对不同场景提供了灵活的解决方案。本教程将简要介绍OrientDB的使用,包括基本概念、安装…

python subprocess run 和 Popen 的一些使用和注意事项

文章目录 一、run二、Popen NAME subprocess - Subprocesses with accessible I/O streams MODULE REFERENCE https://docs.python.org/3.9/library/subprocess The following documentation is automatically generated from the Python source files. It may be incomplete, …

QGraphicsItem器件移动及旋转相关问题

一、前言 Qt的图形视图框架中,可以使用如下接口设置图元坐标: void QGraphicsItem::setPos(const QPointF &pos)Sets the position of the item to pos, which is in parent coordinates. For items with no parent, pos is in scene coordinates.…

【数据结构】排序之插入排序

排序目录 1.前言2. 排序的概念及其运用2.1 排序的概念2.2 排序的运用2.3 常见的排序算法 3. 插入排序3.1 基本思想3.2 直接插入排序3.2.1 直接插入排序实现3.2.1.1 分析3.2.1.2 代码实现 3.3 希尔排序3.3.1 希尔排序实现3.3.1.1 分析3.3.1.2 代码实现 4. 附代码4.1 sort.h4.2 s…

Lumerical------按键中断程序执行

Lumerical------中断程序执行 引言正文 引言 在 Lumerical 中,很多时候我们需要通过 sweep 的方式来获取我们想要的结果,然而,有时候当我们运行程序后发现书写的脚本有问题时,我们想要强行终止程序的执行,该怎么办呢&…

K8s攻击案例:组件未授权访问导致集群入侵

K8s集群往往会因为组件的不安全配置存在未授权访问的情况,如果攻击者能够进行未授权访问,可能导致集群节点遭受入侵。比较常见的的组件未授权访问漏洞,主要包括 API Server 未授权访问、kubelet 未授权访问、etcd 未授权访问、kube-proxy 不安…

C++系列-第1章顺序结构-4-整型int

C系列-第1章顺序结构-4-整型int 在线练习: http://noi.openjudge.cn/ https://www.luogu.com.cn/ 总结 本文是C系列博客,主要讲述整型int的用法 整型int 在C中,int 是一个关键字,用于声明整型变量。int 类型用于存储整数&…

01的token的年度总结

​ 大家好,我是token,一个热爱.NET的普通人,同样我来自湖南衡阳,再次之前我已经遇到非常多的湖南衡阳的老乡,比如李哥。 ​ 在这里一年中,我的成长也是非常迅速的,每一年的的每一天&#xff0c…

【Linux】深挖进程地址空间

> 作者简介:დ旧言~,目前大二,现在学习Java,c,c,Python等 > 座右铭:松树千年终是朽,槿花一日自为荣。 > 目标:熟悉【Linux】进程地址空间 > 毒鸡汤&#xff…

Thinkphp+vue+mysql学生作业管理系统21j0r

运行环境:phpstudy/wamp/xammp等 开发语言:php 后端框架:Thinkphp5 前端框架:vue.js 服务器:apache 数据库:mysql 数据库工具:Navicat/phpmyadmin 为设计一个安全便捷,并且使用户更好获取本学院…