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

1.算法运行效果图预览

2.算法运行软件版本

matlab2022a

3.算法理论概述

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

3.1 Huffman编码算法步骤

初始化:根据符号概率的大小顺序对符号进行排序,即按概率大小排序,得到符号序列。

创建节点:将概率最小的两个节点相加,并作为一个新节点,新节点的概率为这两个节点概率之和。然后,将这两个节点从概率队列中删除,将新节点插入队列中。

更新队列:重复上一步骤,直到队列中只剩下一个节点为止。此时,这个节点就是Huffman树的根节点。

生成编码:从根节点开始,向左的边标记为0,向右的边标记为1。然后,从根节点到每个叶节点的路径就构成了该叶节点对应符号的Huffman编码。

3.2 Huffman编码的数学原理

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

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

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

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

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

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

4.部分核心程序 `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+"%%\]"));\`

相关推荐
跨境猫小妹5 分钟前
2025 TikTok Shop:从内容爆发到系统化深耕的商业跃迁
大数据·人工智能·算法·产品运营·亚马逊
不穿格子的程序员7 分钟前
从零开始写算法 —— 二叉树篇 1:二叉树的三种遍历(递归实现法)
算法·深度优先·二叉树遍历·fds
子夜江寒23 分钟前
逻辑森林与贝叶斯算法简介
算法·机器学习
xu_yule1 小时前
算法基础-背包问题(01背包问题)
数据结构·c++·算法·01背包
我不是小upper1 小时前
从理论到代码:随机森林 + GBDT+LightGBM 融合建模解决回归问题
人工智能·深度学习·算法·随机森林·机器学习·回归
budingxiaomoli1 小时前
分治算法-快排
数据结构·算法
云泽8081 小时前
C++ STL 栈与队列完全指南:从容器使用到算法实现
开发语言·c++·算法
前端小白在前进2 小时前
力扣刷题:复原IP地址
tcp/ip·算法·leetcode
yaoh.wang2 小时前
力扣(LeetCode) 94: 二叉树的中序遍历 - 解法思路
python·算法·leetcode·面试·职场和发展·二叉树·跳槽
Evand J2 小时前
【课题推荐】基于视觉(像素坐标)与 IMU 的目标/自身运动估计(Visual-Inertial Odometry, VIO),课题介绍与算法示例
人工智能·算法·计算机视觉