基于MATLAB的图像Huffman编码研究.docx

合集下载

哈夫曼编码及Matlab实现

哈夫曼编码及Matlab实现

哈夫曼编码及Matlab 实现
哈夫曼编码是一种所得码字是异前置的变长码,其平均码长最短,被称为最佳变长码,也称为哈夫曼编码。

其具体编码方法如下:
(1)将信源信息(符号)按概率大小排队;
(2)从最小概率的两个消息开始编码,并给予一定的编码规则,如小概率的下支路编为1(或0),大概率的上支路变为0(或1),若两者概率相等,仍是下支路为1上支路为0;
(3)将已经编码的两个消息对应概率合并,并重新按概率大小排队,重复步骤(2);
(4)重复步骤(3),直至合并概率归一为止;
(5)变成的变长码是按后出先编方式,即从概率归一的树根沿编码路线逆行至对应的消息。

实验内容:
给定离散信源:
⎥⎦⎤⎢⎣⎡=⎥⎦⎤⎢⎣⎡01.010.015.017.018.019.020.07654321
u u u u u u u p U 对其进行哈夫曼编码,其理论结果如下:
运行结果:
该结果与理论结果相符,满足实验要求。

matlab 霍夫曼编码

matlab 霍夫曼编码

matlab 霍夫曼编码一、背景介绍二、霍夫曼编码原理三、matlab实现霍夫曼编码1. 建立霍夫曼树2. 构建编码表3. 压缩文件4. 解压文件四、应用举例一、背景介绍在信息传输和存储中,数据的压缩是一个重要的问题。

其中,霍夫曼编码是一种常用的无损压缩算法,通过对不同字符出现频率进行编码,可以将数据压缩到较小的空间中。

在matlab中,可以通过代码实现对数据的霍夫曼编码。

二、霍夫曼编码原理1. 需要进行压缩的数据由若干个字符组成。

2. 统计每个字符出现的频率,并根据频率构建霍夫曼树。

3. 根据霍夫曼树构建每个字符对应的编码表。

4. 将原始数据中每个字符按照对应的编码表进行编码,并将所有编码拼接为一个字符串。

5. 将字符串转换为二进制数列,并将其写入文件中。

解压时,需要读取二进制数列,并按照相应的编码表进行解码还原原始数据。

三、matlab实现霍夫曼编码1. 建立霍夫曼树在matlab中,可以通过以下代码实现霍夫曼树的构建:```matlabfunction [T, f] = huffmantree(p)n = length(p);f = p;T = zeros(n-1, 3);for i=1:n-1[f, j] = sort(f);T(i, 1:2) = j(1:2);T(i, 3) = f(1) + f(2);f(2) = T(i, 3);end```其中,p为每个字符出现的频率,n为字符数。

函数返回的T为霍夫曼树的结构矩阵,f为每个节点的权值。

2. 构建编码表在得到霍夫曼树之后,可以通过以下代码构建每个字符对应的编码表:```matlabfunction codebook(T)n = size(T, 1) + 1;codebook = cell(n, 2);for i=1:ncodebook{i, 1} = i;endfor i=1:n-1j = T(i, 1:2);for k=1:length(j)codebook{j(k), 2}=[codebook{j(k), 2},num2str(mod(k-1,2))]; if ~isempty(codebook{j(k), 2})codebook{j(k), 3}=[codebook{j(k), 3},i];elsecodebook{j(k), 3}=i;endendend```其中,codebook为编码表,第一列为字符编号,第二列为对应的编码。

(完整word版)huffman编码的matlab实现

(完整word版)huffman编码的matlab实现

Huffman编码的matlab实现一、信源编码介绍为了减少信源输出符号序列中的剩余度、提高符号的平均信息量,对所施行的变换。

具体说,就是针对信源输出符号序列的统计特性来寻找某种方法,把信源输出符号序列变换为最短的码字序列,使后者的各码元所载荷的平均信息量最大,同时又能保证无失真地恢复原来的符号序列。

既然信源编码的基本目的是提高码字序列中码元的平均信息量,那么,一切旨在减少剩余度而对信源输出符号序列所施行的变换或处理,都可以在这种意义下归入信源编码的范畴,例如过滤、预测、域变换和数据压缩等。

当然,这些都是广义的信源编码。

一般来说,减少信源输出符号序列中的剩余度、提高符号平均信息量的基本途径有两个:①使序列中的各个符号尽可能地互相独立;②使序列中各个符号的出现概率尽可能地相等。

前者称为解除相关性,后者称为概率均匀化。

信源编码的一般问题可以表述如下:信源编码若某信源的输出为长度等于M的符号序列集合式中符号A为信源符号表,它包含着K个不同的符号,A={ɑk|k=1,…,K},这个信源至多可以输出K M个不同的符号序列。

记‖U‖=KM。

所谓对这个信源的输出信源编码进行编码,就是用一个新的符号表B的符号序列集合V来表示信源输出的符号序列集合U。

若V的各个序列的长度等于 N,即式中新的符号表B共含L个符号,B={b l|l=1,…,L}。

它总共可以编出L N个不同的码字。

类似地,记‖V‖=LN。

为了使信源的每个输出符号序列都能分配到一个独特的码字与之对应,至少应满足关系‖V‖=L N≥‖U‖=KM或者N/M≥log K/log L下面的几个编码定理,提供了解决这个矛盾的方法。

它们既能改善信息载荷效率,又能保证码字唯一可译。

离散无记忆信源的定长编码定理对于任意给定的ε>0,只要满足条件N/M≥(H(U)+ε)/log L那么,当M足够大时,上述编码几乎没有失真;反之,若这个条件不满足,就不可能实现无失真的编码。

实验 Huffman编码(含matlab代码)

实验 Huffman编码(含matlab代码)

实验二Huffman编码一实验目的1 通过本实验实现信源编码——Huffman编码2 编写M文件实现,掌握Huffman编码方法二实验要求1 了解matlab中M文件的编辑、调试过程2 编写程序实现Huffman编码算法三实验步骤1 输入Huffman编码程序2 运行程序,按照提示输入相应信息,并记录输入信息,及运行结果。

注:观察结果方法:data(1).Code显示a1的编码,同理显示data(2).Code,a2的编码结果。

3 思考:该程序编出的Huffman码是否是最小码方差的码?为什么?四报告要求五附Huffman编码程序clearN=input('请输入信源符号的个数:') ;for i=1:N%data(1).name=input('请输入各信源符号的名称:');data(i).p=input('请输入各信源符号发生的概率:');endfor i=1:Npp(i)=data(i).p;data(i).imap=i; %各符号在编码过程中的指针data(i).Code=''; %各符号的编码结果endfor j = 1:N % N——信源符号的个数for i = 1:N - jif (pp(i) > pp(i + 1))fT = pp(i);pp(i) = pp(i + 1);pp(i + 1) = fT;for k = 1:Nif data(k).imap == idata(k).imap = i + 1;elseif data(k).imap == i + 1data(k).imap = i;endendendendendp=pp;%%%%%%%%%%%%%%%%%%%%% %// 计算哈夫曼编码表%// 开始编码for i=1:N-1for k = 1:Nif data(k).imap== idata(k).Code = strcat('1',data(k).Code);elseif (data(k).imap== i + 1)data(k).Code = strcat('0',data(k).Code);endendp(i + 1) = p(i + 1)+p(i);for k = 1:Nif (data(k).imap == i)data(k).imap = i + 1;endendfor j = i + 1:N-1if p(j) >p(j + 1)fT =p(j);p(j) = p(j + 1);p(j + 1) = fT;for k = 1:Nif (data(k).imap == j)data(k).imap = j + 1;elseif (data(k).imap == j + 1)data(k).imap = j;endendendendend。

Matlab函数实现哈夫曼编码算法讲解--实用.doc

Matlab函数实现哈夫曼编码算法讲解--实用.doc

编写 Matlab 函数实现哈夫曼编码的算法一、设计目的和意义在当今信息化代,数字信号充斥着各个角落。

在数字信号的理和中,信源是首先遇到的,一个信源的好坏劣直接影响到了后面的理和。

如何无失真地,如何使的效率最高,成了大家研究的象。

哈夫曼就是其中的一种,哈夫曼是一种的方案。

它由最二叉既哈夫曼得到,元内容到根点的路径中与父点的左右子的。

所以哈夫曼在在数字通信中有着重要的意。

可以根据信源符号的使用概率的高低来确定元的度。

既了信源的无失真地,又使得的效率最高。

二、设计原理哈夫曼 (Huffman Coding) 是一种方式,哈夫曼是可字 (VLC) 的一种。

uffman 于 1952 年提出一种方法,方法完全依据字符出概率来构造异字的平均度最短的字,有称之最佳,一般就叫作 Huffman 。

而哈夫曼的第一步工作就是构造哈夫曼。

哈夫曼二叉的构造方法原如下,假有 n 个,构造出的哈夫曼有 n 个叶子点。

n 个分 w1、 w2、⋯、wn,哈夫曼的构造:(1)将 w1、w2、⋯,wn 看成是有 n 棵的森林 (每棵有一个点 );(2)在森林中出两个根点的最小的合并,作一棵新的左、右子,且新的根点其左、右子根点之和;(3)从森林中除取的两棵,并将新加入森林;(4)重复 (2)、 (3)步,直到森林中只剩一棵树为止,该树即为所求得的哈夫曼树。

具体过程如下图 1 产所示:(例)图 1哈夫曼树构建过程哈夫曼树构造成功后,就可以根据哈夫曼树对信源符号进行哈夫曼编码。

具体过程为先找到要编码符号在哈夫曼树中的位置,然后求该叶子节点到根节点的路径,其中节点的左孩子路径标识为 0,右孩子路径标识为 1,最后的表示路径的 01 编码既为该符号的哈夫曼编码。

可以知道,一个符号在哈夫曼树中的不同位置就有不同的编码。

而且,不同符号的编码长度也可能不一样,它由该结点到父结点的路径长度决定,路径越长编码也就越长,这正是哈夫曼编码的优势和特点所在。

哈夫曼编码matlab

哈夫曼编码matlab

哈夫曼编码matlab1. 引言哈夫曼编码是一种广泛应用于数据压缩领域的编码算法,它通过使用变长编码来表示不同符号,使得出现频率高的符号使用较短的编码,而出现频率低的符号使用较长的编码。

这种编码方式可以有效地降低数据的存储空间,提高数据传输效率。

在本文中,我们将使用Matlab编程语言来实现哈夫曼编码算法,并介绍其原理和实现步骤。

2. 哈夫曼编码原理哈夫曼编码的核心思想是根据符号的出现频率来构建一棵哈夫曼树,树中的叶子节点对应着不同的符号,而每个符号的编码则通过从根节点到达对应叶子节点的路径来表示。

构建哈夫曼树的过程可以分为以下几个步骤:2.1 统计符号频率首先,我们需要统计待编码数据中各个符号的出现频率。

在Matlab中,我们可以使用histc函数来实现这一步骤。

2.2 构建哈夫曼树根据频率统计结果,我们可以构建一棵哈夫曼树。

构建哈夫曼树的过程可以简化为以下几个步骤: 1. 将每个符号作为一个单独的节点插入到一个优先队列中。

2. 从优先队列中选择两个频率最低的节点,并合并它们为一个新节点。

该新节点的频率为两个被合并节点的频率之和。

3. 将新节点插入到优先队列中。

4. 重复步骤2和3,直到优先队列中只剩下一个节点为止。

该节点即为哈夫曼树的根节点。

2.3 生成编码表在构建好的哈夫曼树上,每个叶子节点都对应着一个符号,编码就是从根节点到达叶子节点的路径。

我们可以通过遍历哈夫曼树来生成每个符号的编码。

从根节点出发,如果经过左子树则编码为0,经过右子树则编码为1。

遍历到叶子节点时,记录下从根节点到达该叶子节点的路径,即为该符号的编码。

3. 哈夫曼编码的实现接下来,我们将使用Matlab来实现哈夫曼编码算法。

首先,我们需要读取待编码的数据。

3.1 读取数据使用Matlab提供的文件读取函数,我们可以方便地读取文本文件或二进制文件。

在本例中,我们以文本文件为例,假设我们需要对一段文本进行编码。

下面是读取文本文件的示例代码:fid = fopen('input.txt', 'r');textData = fscanf(fid, '%c');fclose(fid);3.2 统计符号频率读取数据后,我们需要统计各个符号的频率。

Huffman编码及译码的MATLAB实现

Huffman编码及译码的MATLAB实现

Huffman编码及译码的MATLAB实现沈逸峰(上海师范大学信息与机电工程学院,上海200333)摘要:本论文首先介绍了Huffman编码的原理以及与其它编码相比它的优势随在,随后基于Huffman编码的原理,利用MATLAB编译出26个英文字母加空格的Huffman码表以及相应的编码和译码程序。

关键词:Huffman,MATLABImplement of Huffman code and decode in MatlabShen Yi-feng(School of Information and Engineering.Shanghai NormalUniversity.Shanghai.200333)Abstract:This article has mainly introduced the theory of Huffman Code and the advantage of this code.Then, we use MATLAB to find the code table for the English alphabet and space based on Huffman Code theory. Finally, we design the code and decode program for these alphabet and space based on the same theory.Key words:Huffman, MATLAB1.引言Huffman编码属于信源编码,由于信源符号之间存在分布不均匀和相关性,致使信源存在冗余度。

因此信源编码的主要任务就是减少冗余,从而提高编码的效率。

信源编码的关键是信息论中的两个基本定理[1]:无失真编码定理和限失真编码定理,其中,无失真编码定理可看成是可逆编码的基础,即当信源符号变换为代码后,可从代码无失真地恢复原信号,本文所研究的Huffman编码即是一种基于无失真编码定理的最佳无失真信源编码2.Huffman编码简介及其优势Huffman 是一种可变字长编码,即编码后信源符号的码长是不一样的,一般而言出现概率高的信源符号码长较短,而出现概率小的信源符号码长较长。

基于MATLAB的图像Huffman编码研究

基于MATLAB的图像Huffman编码研究

中国矿业大学2015-2016学年第二学期《数字视频技术》课程小设计考核图像的Huffman编码研究专业班级:信息13-04班学生姓名:王振宇、龙航、王一鸣学生学号:04131407、04131403、04131406本人郑重声明:本人认真、独立完成了查找资料、完成作业、编写程序等考核任务,无抄袭行为。

签字:日期:2016.05.171.引言1.1图像数据压缩的目的数字图像通常要求很大的比特数,这给图像的传输和存储带来相当大的困难。

要占用很多的资源,花很高的费用。

一般原始图像存在很大的冗余度。

所以,对图像数据压缩显得非常重要。

1.2图像数据压缩的原理对数字图像压缩主要运用两个基本原理:一是图像的相关性。

在图像同一相邻像素之间,活动图像的相邻帧的对应像素之间往往存在很强的相关性,去除或减少这些相关性,也就除去或减少图像信息中的冗余度,继而实现对数字图像的压缩。

二是人的视觉心理特征,人的视觉对于边缘急剧变化不敏感,对颜色分辨力弱,利用这些特征在相应部分降低编码精度而使人从视觉上感觉不到图像质量的下降,从而达到对数字图像压缩的目的。

1.3Huffman编码Huffman编码是一种编码方式,是一种用于无损数据压缩的熵编码算法。

它是Huffman在1952年根据Shannon在1948年和Fano在1949年阐述的这种编码思想下提出的一种不定长编码的方法,有时也称之为最佳编码。

依据信源数据中各信号出现的频率分配不同长度的编码。

其基本思想是在编码过程中,对出现频率越高的值,分配越短的编码长度,相应地对出现频率越低的值则分配较长的编码长度,完全依据字符出现概率来构造异字头的平均长度最短的码字。

哈夫曼编码方法的实质是针对统计结果对字符本身重新编码,而不是对重复字符或重复子串编码,得到的单位像素的比特数最接近图像的实际熵值。

2.设计任务2.1设计任务研究实现灰度图像的Huffman编码和解码恢复。

2.2设计目的(1)了解Huffman编码的基本原理及其特点;(2)理解并熟练对图像进行哈夫曼编码的算法;(3)学习和熟悉MATLAB图像处理工具箱;(4)熟悉和掌握MATLAB 程序设计方法;2.3设计要求现灰度图像的Huffman编码和解码恢复图像;处理结果要求最终图像显示,且计算图像的信息熵,平均码字长度,编码效率,压缩比。

基于matlab对哈夫曼编码的实现

基于matlab对哈夫曼编码的实现

在MATLAB中实现哈夫曼编码需要先建立哈夫曼树,然后基于这颗哈夫曼树生成对应的哈夫曼编码。

以下是使用MATLAB实现哈夫曼编码的简单步骤:
假设你有一个要编码的符号集合symSet和这些符号的概率集合probSet。

1.计算频率和概率: 首先,我们需要计算每个符号的频率和概率。

freq = histc(symSet, symSet); % 计算频率
prob = freq / sum(freq); % 计算概率
2.构建哈夫曼树: 使用huffTree函数构建哈夫曼树。

[huffTree, huffCodes] = huffTree(prob);
3.生成哈夫曼编码: 使用huffmanenco函数生成哈夫曼编码。

huffmanCodes = huffmanenco(symSet, huffTree);
4.测试: 使用生成的哈夫曼编码对原始数据进行编码和解码。

originalData = symSet(randperm(length(symSet), 1000)); % 随机生成1000个原始数据
encodedData = huffmanenco(originalData, huffTree); % 对原始数据进行编码
decodedData = huffDeco(encodedData, huffCodes); % 解码编码后的数据
5.比较解码后的数据与原始数据: 检查解码后的数据是否与原始数据匹配。

以上是MATLAB实现哈夫曼编码的基本步骤,具体的代码可能需要根据你的数据和需要进行一些调整。

matlab 哈夫曼编码

matlab 哈夫曼编码

matlab 哈夫曼编码哈夫曼编码是一种可变长度的编码方式,它可以将一组可能不等概率出现的字符序列压缩成一个二进制编码的表示方式,以达到数据压缩的目的。

在哈夫曼编码中,出现频率越高的字符所对应的编码越短,反之越长。

需要注意的是,将字符压缩成的二进制编码只能满足单词不重复的情况下才能唯一的解码出来,因此在实际应用中还需要对编码进行强制分界,以保证无二义性。

在Matlab中进行哈夫曼编码可以使用built-in函数'huffmandict'和'huffmanenco'来完成。

其中'huffmandict'函数根据字符和频率信息来生成哈夫曼字典,'huffmanenco'函数将读入的原始数据运用哈夫曼编码压缩成一个码字,也可以使用'huffmandeco'函数将压缩后的数据解码。

下面我给出一个简单的演示,解释如何使用Matlab实现哈夫曼编码过程。

假设我们要压缩的原始数据如下:matlabcharList = ['a', 'b', 'c', 'd', 'e', 'f'];probList = [0.2, 0.15, 0.1, 0.12, 0.3, 0.13];data = ['a', 'c', 'b', 'a', 'e', 'b', 'f', 'e', 'f', 'c', 'c', 'a', 'd', 'a', 'b', 'e'];首先我们需要生成一个哈夫曼字典:matlabhuffDictionary = huffmandict(charList, probList);这里的'huffmandict'函数通过输入字符符号和对应概率的向量,生成一个哈夫曼字典。

实验报告-2Huffman编码

实验报告-2Huffman编码

实验报告-2Huffman编码《信息与编码》课内实验报告学⽣姓名:及学号:学院:理学院班级:课程名称:信息与编码实验题⽬:Huffman编码指导教师副教授姓名及职称:讲师实验师2014年3⽉14⽇⽬录⼀、实验⽬的 (1)⼆、实验内容 (1)三、实验要点及说明 (1)四、实现⽅法 (1)五、实验结果 (2)六、源程序清单 (2)七、思考及总结 (5)⼀、实验⽬的1.掌握变长编码及即时码的特点; 2.理解Huffman 编码的特性及编码⽅法;⼆、实验内容对给定信源,统计信源分布,在信源概率分布确定情况下,进⾏Huffman 编码,并给出编码结果,并计算平均码长。

三、实验要点及说明通过matlab 编程,计算相应结果并绘制图形,理解相关性质。

四、实现⽅法以matlab 软件为基础,通过编程,对给出或计算出的概率分布计算相应Huffman 编码,并计算平均码长。

通过matlab 编程计算,步骤如下:1. ⽣成表⽰信源的概率分布p 和表⽰信号字母表的元包数组u ;2. 根据公式??=+-+-==.,,3,2,)1(,1,k j j k r j k j a t j 计算霍夫曼压缩表的列数k 和各列的⾏数j t ,为后⾯的计算做准备;3. 根据霍夫曼压缩表的构建⽅法,循环计算各概率列的数值,同时对各概率列排序并获取插⼊元素的位置(⿊框标记位置);4. 根据霍夫曼编码表的构建⽅法,从后往前计算出各列的霍夫曼编码;5. 将霍夫曼编码表中的第⼀列霍夫曼编码重新排序,得到最终霍夫曼编码。

五、实验结果霍夫曼编码表六、源程序清单运⾏命令:>> p=1./(8:16);>> p(10)=1-sum(p);>> for i=0:3u(i+1)={num2str(i)};end;>> [huff,summ,huffbiao] = huffman(p,u);源程序:function [huff,summ,huffbiao] = huffman(p,u) a=size(p,2); %获取第⼀列长度r=size(u,2); %获取信号字母个数huff=cell(1,a); %存储霍夫曼编码k=round((a-1)/(r-1)+0.5); %求列数huffbiao=cell(a,2*k); %存储霍夫曼压缩表t=zeros(1,k); %存储各列长度list=zeros(1,k-1); %存储标记位置pp=1:a; %标记排序后的位置t(1)=a;summ=0;for j=2:kt(j)=(k-j+1)*r-k+j; %求各列长度end;for j=a-1:-1:1 %⾸次排序for h=1:jp(h)=p(h+1);p(h+1)=temp;temp=pp(h);pp(h)=pp(h+1);pp(h+1)=temp;end;end;end;for i=1:ahuffbiao(i,1)={p(i)};end;for i=1:k-1temp=sum(p(t(i+1):t(i)));%求和num=0;for j=1:t(i+1) %插⼊,重排序if temp>=p(j)if temp>p(j) || j==t(i+1)num=num+1;end;temp1=p(j);p(j)=temp;temp=temp1;if num==1list(i)=j; %获取标记位置end;end;end;p(t(i+1)+1:t(i))=0; %将⽆⽤的部分置为0for h=1:t(i+1)huffbiao(h,2*i+1)={p(h)}; %⽣成霍夫曼压缩表end;end;for i=k:-1:1huff(j)=u(j); %给霍夫曼压缩表最后概率列赋值end;elsetemp=huff(list(i)); %缓存编码for h=list(i)+1:t(i+1)huff(h-1)=huff(h); %给该列的前段赋值,即将后⼀列的标记位后⾯的编码提前⼀位end;for j=t(i+1):t(i)huff(j)=strcat(temp,u(j-t(i+1)+1)); %给该列的后段赋值,即将后⼀列的标记位编码与信号字母表对应编码连接后赋值end;end;for h=1:t(i)huffbiao(h,2*i)=huff(h); %⽣成霍夫曼压缩表end;end;for j=a-1:-1:1 %霍夫曼编码排序for h=1:jif pp(h)>pp(h+1)temp=pp(h);pp(h)=pp(h+1);pp(h+1)=temp;temp=huff{h};huff{h}=huff{h+1};huff{h+1}=temp;end;end;end;for i=1:asumm=summ+huffbiao{i,1}*length(huffbiao{i,2}); %求平均码长end;huff=huff';end七、思考及总结本次课内实验我理解了信源的最优变长编码的基本思想,明⽩了霍夫曼编码是⼀种⽤于⽆损数据压缩的熵编码(权编码)算法,通过编程演算熟练地掌握了Huffman信源编码⽅法,同时了解了变长编码及即时码的特点。

matlab信源二进制赫夫曼编码

matlab信源二进制赫夫曼编码

信源二进制赫夫曼编码是一种常见的数据压缩算法,它可以有效地降低数据传输和存储的成本。

在本文中,我将深入探讨matlab中的信源二进制赫夫曼编码的原理、实现和应用,并共享我的个人观点和理解。

让我们来了解一下信源编码的基本概念。

信源编码是一种将离散或连续信号转换为离散符号的过程,其目的是尽量减少信号的冗余度,以便更高效地传输和存储。

在数字通信和数据存储领域,信源编码起着至关重要的作用。

而二进制赫夫曼编码是一种常见的无损数据压缩算法,其核心思想是通过对出现频率较高的符号赋予较短的编码,而对出现频率较低的符号赋予较长的编码,从而实现数据的压缩。

在matlab中,我们可以利用赫夫曼树和编码表来实现信源二进制赫夫曼编码。

接下来,我将详细介绍matlab中的信源二进制赫夫曼编码的实现过程。

在matlab中,我们可以使用`huffmandict`函数来创建赫夫曼编码字典,该函数需要输入符号和它们对应的概率作为参数。

我们可以使用`huffmanenco`函数来对输入的符号序列进行赫夫曼编码,得到压缩后的二进制码字。

我们可以使用`huffmandeco`函数来对压缩后的二进制码字进行解码,得到原始的符号序列。

通过这些函数的组合,我们可以在matlab中轻松实现信源二进制赫夫曼编码。

具体的实现细节和示例代码我将在下文中进行详细讲解。

信源二进制赫夫曼编码的应用非常广泛,特别是在无线通信、图像压缩和音频处理等领域。

通过使用赫夫曼编码,我们可以大大减小数据传输和存储的成本,提高系统的效率和可靠性。

赫夫曼编码也是信息论中的重要概念,它为我们理解信息压缩和编码提供了重要的思路和方法。

从个人观点来看,信源二进制赫夫曼编码作为一种经典的数据压缩算法,具有重要的理论意义和实际应用价值。

在matlab中,我们可以利用现成的函数库来实现赫夫曼编码,同时也可以根据具体的应用场景进行定制化的优化。

通过不断深入研究和实践,我们可以进一步发掘赫夫曼编码的潜力,为数据压缩和信息传输领域带来更多的创新和突破。

霍夫曼编码的matlab实现

霍夫曼编码的matlab实现

霍夫曼编码的matlab实现霍夫曼编码的matlab实现一、实验内容:用Matlab语言编程实现霍夫曼(Huffman)编码。

二、实验原理及编码思想: 霍夫曼(Huffman)编码算法是满足前缀条件的平均二进制码长最短的编-源输出符号,而将较短的编码码字分配给较大概率的信源输出。

算法是:在信源符号集合中,首先将两个最小概率的信源输出合并为新的输出,其概率是两个相应输出符号概率之和。

这一过程重复下去,直到只剩下一个合并输出为止,这个最后的合并输出符号的概率为1。

这样就得到了一张树图,从树根开始,将编码符号1 和0 分配在同一节点的任意两分支上,这一分配过程重复直到树叶。

从树根到树叶途经支路上的编码最后就构成了一组异前置码,就是霍夫曼编码输出。

以本教材P36例题3-2信源为例:离散无记忆信源:U u1 u2 u3 u4 u5P(U) = 0.4 0.2 0.2 0.1 0.1解:概率信符s编码过程 i P(s) i码字W i第一次第二次第三次1W=0 0.4 0.6 S0.4 0.4 11A(1) 1 W=10 S0.4 0.2 0.2 22 0 0.4 1 W=111 S 0.2 0.2 330 0.2 1 W=1101 S 0.1 440.2 0W=1100 S 0.1 550通过上表的对信源缩减合并过程,从而完成了对信源的霍夫曼编码。

三、程序设计思路分为两步,首先是码树形成过程:对信源概率进行合并形成编码码树。

然后是码树回溯过程:在码树上分配编码码字并最终得到霍夫曼编码。

1、码树形成过程:将信源概率按照从小到大顺序排序并建立相应的位置索引。

然后按上述规则进行信源合并,再对信源进行排序并建立新的位置索引,直到合并结束。

在这一过程中每一次都把排序后的信源概率存入矩阵G中,位置索引存入矩阵Index中。

这样,由排序之后的概率矩阵 G以及索引矩阵Index就可以恢复原概率矩阵P了,从而保证了回溯过程能够进行下去。

【最新精选】霍夫曼编码的matlab实现

【最新精选】霍夫曼编码的matlab实现

霍夫曼编码的matlab实现一、实验内容:用Matlab语言编程实现霍夫曼(Huffman)编码。

二、实验原理及编码思想:霍夫曼(Huffman)编码算法是满足前缀条件的平均二进制码长最短的编-源输出符号,而将较短的编码码字分配给较大概率的信源输出。

算法是:在信源符号集合中,首先将两个最小概率的信源输出合并为新的输出,其概率是两个相应输出符号概率之和。

这一过程重复下去,直到只剩下一个合并输出为止,这个最后的合并输出符号的概率为1。

这样就得到了一张树图,从树根开始,将编码符号1 和0 分配在同一节点的任意两分支上,这一分配过程重复直到树叶。

从树根到树叶途经支路上的编码最后就构成了一组异前置码,就是霍夫曼编码输出。

以本教材P36例题3-2信源为例:离散无记忆信源:U u1 u2 u3 u4 u5P(U) = 0.4 0.2 0.2 0.1 0.1解:通过上表的对信源缩减合并过程,从而完成了对信源的霍夫曼编码。

三、程序设计思路分为两步,首先是码树形成过程:对信源概率进行合并形成编码码树。

然后是码树回溯过程:在码树上分配编码码字并最终得到霍夫曼编码。

1、码树形成过程:将信源概率按照从小到大顺序排序并建立相应的位置索引。

然后按上述规则进行信源合并,再对信源进行排序并建立新的位置索引,直到合并结束。

在这一过程中每一次都把排序后的信源概率存入矩阵G中,位置索引存入矩阵Index中。

这样,由排序之后的概率矩阵G以及索引矩阵Index就可以恢复原概率矩阵P了,从而保证了回溯过程能够进行下去。

2、码树回溯过程:在码树上分配编码码字并最终得到Huffman 编码。

从索引矩阵M 的末行开始回溯。

(1) 在Index的末行2元素位置填入0和1。

(2) 根据该行索引1 位置指示,将索引1 位置的编码(‘1’)填入上一行的第一、第二元素位置,并在它们之后分别添加‘0’和‘1’。

(3) 将索引不为‘1’的位置的编码值(‘0’)填入上一行的相应位置(第3 列)。

(完整word版)huffman编码实验matlab[1]

(完整word版)huffman编码实验matlab[1]

实验报告Huffman编码算法的实现一、实验目的1、学习Matlab软件的使用和编程;2、进一步深入理解Huffman编码算法的原理;3、提高独立进行算法编程的能力。

二、实验内容1、用Matlab实现Huffman编码算法程序;2、要求程序输出显示所有的码字以及编码效率;3、设计简单的输入界面(可以是简单的文字提示信息),程序运行时提示用户输入代表信源符号概率的向量;要对用户输入的概率向量进行合法性检查。

三、实验原理1、二进制Huffman编码的基本原理及算法(1) 把信源符号集中的所有符号按概率从大到小排队。

(2) 取概率最小的两个符号作为两片叶子合并(缩减)到一个节点。

(3) 视此节点为新符号,其概率等于被合并(缩减)的两个概率之和,参与概率排队。

(4) 重复(2)(3)两步骤,直至全部符号都被合并(缩减)到根。

(5) 从根出发,对各分枝标记0和1。

从根到叶的路径就给出了各个码字的编码和码长。

2、程序设计的原理(1)程序的输入:以一维数组的形式输入要进行huffman编码的信源符号的概率,在运行该程序前,显示文字提示信息,提示所要输入的概率矢量;然后对输入的概率矢量进行合法性判断,原则为:如果概率矢量中存在小于0的项,则输入不合法,提示重新输入;如果概率矢量的求和大于1,则输入也不合法,提示重新输入。

(2)huffman编码具体实现原理:1>在输入的概率矩阵p正确的前提条件下,对p进行排序,并用矩阵L记录p排序之前各元素的顺序,然后将排序后的概率数组p的前两项,即概率最小的两个数加和,得到新的一组概率序列,重复以上过程,最后得到一个记录概率加和过程的矩阵p以及每次排序之前概率顺序的矩阵a。

2>新生成一个n-1行n列,并且每个元素含有n个字符的空白矩阵,然后进行huffman编码:➢将c矩阵的第n-1行的第一和第二个元素分别令为0和1(表示在编码时,根节点之下的概率较小的元素后补0,概率较大的元素后补1,后面的编码都遵守这个原则)➢然后对n-i-1的第一、二个元素进行编码,首先在矩阵a中第n-i 行找到值为1所在的位置,然后在c矩阵中第n-i行中找到对应位置的编码(该编码即为第n-i-1行第一、二个元素的根节点),则矩阵c的第n-i行的第一、二个元素的n-1的字符为以上求得的编码值,根据之前的规则,第一个元素最后补0,第二个元素最后补1,则完成该行的第一二个元素的编码,➢最后将该行的其他元素按照“矩阵c中第n-i行第j+1列的值等于对应于a矩阵中第n-i+1行中值为j+1的前面一个元素的位置在c矩阵中的编码值”的原则进行赋值,重复以上过程即可完成huffman编码。

huffman编码的matlab实现

huffman编码的matlab实现

%生成一个n-1行n列的数组
概率数组q进行从小至大的排序,并且用l数组返回一个数组,该数组表示概率数组q 排序前的顺序编号
%由数组l构建一个矩阵,该矩阵表明概率合并时的顺序,用于后面的编码
%将排序后的概率数组q的前两项,即概率最小的两个数加和,得到新的一组概率序列
end for i=1:n-1
%生成一个n-1行n列,并且每个元素的的长度为n的空白数组,c矩阵用于进行huffman编码,并且在编 码中与a矩阵有一定的对应关系
c(n-i,(j+1)*n+1:(j+2)*n)=c(n-i+1,n*(find(a(n-i+1,:)==j+1)-1)+1:n*find(a(ni+1,:)==j+1)) %矩阵c中第n-i行第j+1列的值等于对应于a矩阵中第n-i+1行中值为j+1的前面一
个元素的位置在c矩阵中的编码值
end end for i=1:n
霍夫曼编码方法的具体过程是:首先把信源的各个输出符 号序列按概率递降的顺序排列起来,求其中概率最小的两个序 列的概率之和,并把这个概率之和看作是一个符号序列的概 率,再与其他序依概率递降顺序排列(参与求概率之和的这 两个序列不再出现在新的排列之中),然后,对参与概率求和 的两个符号序列分别赋予二进制数字0和1。继续这样的操作, 直到剩下一个以1为概率的符号序列。最后,按照与编码过程 相反的顺序读出各个符号序列所对应的二进制数字组,就可分 别得到各该符号序列的码字。
%完成huffman码字的分配
ind(a(1,:)==i)*n) %用h表示最后的huffman编码,矩阵h的第i行的元素对应于矩阵c的第一行的第i个元素
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

中国矿业大学2015-2016学年第二学期《数字视频技术》课程小设计考核图像的Huffman编码研究专业班级:信息13-04班学生姓名:王振宇、龙航、王一鸣学生学号:04131407、04131403、04131406本人郑重声明:本人认真、独立完成了查找资料、完成作业、编写程序等考核任务,无抄袭行为。

签字:日期:2016.05.171.引言1.1图像数据压缩的目的数字图像通常要求很大的比特数,这给图像的传输和存储带来相当大的困难。

要占用很多的资源,花很高的费用。

一般原始图像存在很大的冗余度。

所以,对图像数据压缩显得非常重要。

1.2图像数据压缩的原理对数字图像压缩主要运用两个基本原理:一是图像的相关性。

在图像同一相邻像素之间,活动图像的相邻帧的对应像素之间往往存在很强的相关性,去除或减少这些相关性,也就除去或减少图像信息中的冗余度,继而实现对数字图像的压缩。

二是人的视觉心理特征,人的视觉对于边缘急剧变化不敏感,对颜色分辨力弱,利用这些特征在相应部分降低编码精度而使人从视觉上感觉不到图像质量的下降,从而达到对数字图像压缩的目的。

1.3Huffman编码Huffman编码是一种编码方式,是一种用于无损数据压缩的熵编码算法。

它是Huffman 在1952年根据Shannon在1948年和Fano在1949年阐述的这种编码思想下提出的一种不定长编码的方法,有时也称之为最佳编码。

依据信源数据中各信号出现的频率分配不同长度的编码。

其基本思想是在编码过程中,对出现频率越高的值,分配越短的编码长度,相应地对出现频率越低的值则分配较长的编码长度,完全依据字符出现概率来构造异字头的平均长度最短的码字。

哈夫曼编码方法的实质是针对统计结果对字符本身重新编码,而不是对重复字符或重复子串编码,得到的单位像素的比特数最接近图像的实际熵值。

2.设计任务2.1设计任务研究实现灰度图像的Huffman编码和解码恢复。

2.2设计目的(1)了解Huffman编码的基本原理及其特点;(2)理解并熟练对图像进行哈夫曼编码的算法;(3)学习和熟悉MA TLAB图像处理工具箱;(4)熟悉和掌握MA TLAB程序设计方法;2.3设计要求现灰度图像的Huffman编码和解码恢复图像;处理结果要求最终图像显示,且计算图像的信息熵,平均码字长度,编码效率,压缩比。

3.总体设计方案3.1系统运行环境Windows 8.1/10系统3.2编程软件平台MATLAB R2013a/R2014a3.3Huffman编码算法原理哈夫曼编码的基本方法是先对图像数据扫描一遍,计算出各种像素出现的概率,按概率的大小指定不同长度的唯一码字,由此得到一张该图像的哈夫曼码表。

编码后的图像数据记录的是每个像素的码字,而码字与实际像素值的对应关系记录在码表中。

(1)计算信源符号出现的概率;(2)将信源符号按其出现的概率,由小到大顺序排列,并从左至右排列为叶节点[1];(3)将两个概率最小的顶层节点进行组合相加,组成一个父节点,并在到左右子节点的两条连线上分别标记0和1;(4)重复上一步骤,直到得到根节点,形成一颗二叉树;(5)从根节点开始到相应于每个符号的叶节点的0/1串,就是该符号的二进制哈夫曼编码。

3.4Huffman编码算法的特点(1)编出来的码都是异字头码,保证了码的唯一可译性。

(2)由于编码长度可变。

因此译码时间较长,使得哈夫曼编码的压缩与还原相当费时。

(3)编码长度不统一,硬件实现有难度。

(4)对不同信源的编码效率不同,当信源的符号概率为2的负幂次方时,达到100%的编码效率;若信源符号的概率相等,则编码效率最低。

(5)由于符号按概率大小排列既可以从右到左也可以从左到右,即0与1的指定是任意的,故最后的编码结果可能不唯一,但仅仅是分配的代码不同,其平均码长是一样的,故不影响编码效率与数据压缩性能。

3.5算法流程图设计3.5.1主流程图开始加载图像,并将其灰度化将灰度图像转换成无符号的8位整数矩阵调用Huffman编码程序进行压缩调用Huffman解码程序进行解码显示原始图像、灰度图像和经编码解码后的图像显示平均码长、压缩比、信息熵及编码效率结束3.5.2编码流程图3.5.3解码流程图开始计算各符号(灰度值)出现概率按照概率从小到大排序生成Huffman树得到二进制哈夫曼编码码字对图像(图像矩阵)进行编码计算编码参数(平均码长、信息熵等)计算二进制码字对应的十进制数,并存入矩阵中,得到码字与灰度值的对应关系表,即码表结束开始结束读取压缩矩阵,并存入行向量中解码后的矩阵按图像矩阵尺寸重排,得到解码矩阵解码,按位读取行向量中的编码并进行相应灰度值匹配3.6组员任务分工王振宇:编写主要程序,编码解码函数程序及相关子程序,修改报告及演示文稿。

龙航:编写部分主程序及部分函数程序,撰写报告。

王一鸣:编写部分程序,进行程序调试完善,制作演示文稿。

4.程序实现4.1函数主程序clc;clear;close all;X=imread('peppers.JPG');%图像灰度化R=X(:,:,1);G=X(:,:,2);B=X(:,:,3);Y=0.299*R+0.587*G+0.114*B;subplot(1,3,1);imshow(X);title('原始图像');data=uint8(Y);[zipped,info]=huffencode(data);%调用Huffman编码程序进行压缩unzipped=huffdecode(zipped,info);%调用Huffman编码程序进行解码%显示原始图像,灰度化图像和经编码解码后的图像subplot(1,3,2);imshow(data);title('灰度化图像');subplot(1,3,3);imshow(unzipped);title('Huffman编码并解码后图像');disp('平均码长');L=info.avalendisp('压缩比');CR=info.ratiodisp('信息熵');H=info.hdisp('编码效率');CE=info.ce4.2编码程序%huffencode函数对输入矩阵vector进行Huffman编码,返回编码后的数据及相关信息function [zipped,info]=huffencode(vector)if ~isa(vector,'uint8')%确定输入矩阵是uint8格式error('input argument must be a uint8 vector');end[m,n]=size(vector);%求输入矩阵的行列数vector=vector(:)';%将矩阵按列转换成一列后转至,成为一个行向量(其中存放灰度值) f=frequency(vector);%计算各符号出现的概率symbols=find(f~=0);%返回概率矩阵中非零元素的位置向量,作为符号向量f=f(symbols);%非零概率位置上的概率值组成非零概率行向量[f,sortindex]=sort(f);%将符号按照出现的概率从小到大排序,并保留非零概率向量位置索引fs=f;symbols=symbols(sortindex);%读出原位置向量中的值(即概率向量中的位置),得到按概率排序后的符号向量len=length(symbols);%读取位置向量的长度symbols_index=num2cell(1:len);%生成从1开始以1递增,1行len列的细胞型矩阵codeword_tmp=cell(len,1);%创建一个len行1列的细胞型变量用于存放码字while length(f)>1 %生成Huffman树,得到二进制码字编码表index1=symbols_index{1};index2=symbols_index{2};codeword_tmp(index1)=addnode(codeword_tmp(index1),uint8(0));%添加节点且该分支按0标记codeword_tmp(index2)=addnode(codeword_tmp(index2),uint8(1));%添加节点且该分支按1标记f=[sum(f(1:2)) f(3:end)];%求出两个最小概率之和,列出其他概率,组成一个新的行向量symbols_index=[{[index1,index2]} symbols_index(3:end)];%合并已编码的符号索引[f,sortindex]=sort(f);%将新的概率向量按照概率从小到大排序symbols_index=symbols_index(sortindex);%得到新的索引表endcodeword=cell(256,1);codeword(symbols)=codeword_tmp;%各符号二进制码字按原符号位存入细胞型矩阵len=0;for i=1:length(symbols)%得到各符号码长矩阵wordlen(i)=length(codeword_tmp{i});endavawordlen=fs*wordlen';%计算平均码长Hlog=log2(fs)';H=-(fs*Hlog);%计算信息熵for index=1:length(vector)%得到整个图像各点灰度值转化为二进制码字后的总比特数 len=len+length(codeword{double(vector(index))+1});endstring=repmat(uint8(0),1,len);%创建元素数与总比特数一致的行向量pointer=1;%定义指针变量for index=1:length(vector) %对输入图像进行编码code=codeword{double(vector(index))+1};%对应符号的二进制码字给code len=length(code);%读取码字长度string(pointer+(0:len-1))=code;%将二进制码字存入行向量中pointer=pointer+len;%指针移移位end% 将二进制编码按照每8位生成一个新字符。

len=length(string);zp=8-mod(len,8);if zp>0string=[string uint8(zeros(1,zp))];%不足8位的在后补零endcodeword=codeword(symbols);%码字按符号概率放入列向量中codelen=zeros(size(codeword));%创建与列向量元素数相同的列向量weights=2.^(0:23);。

相关文档
最新文档