• 大小: 20.14MB
    文件类型: .zip
    金币: 1
    下载: 0 次
    发布日期: 2023-08-02
  • 语言: Matlab
  • 标签: matlab  Huffman  

资源简介

哈夫曼编码(Huffman Coding),是一种熵编码方式,哈夫曼编码是可变字长编码(VLC)的一种。Huffman于1952年提出一种编码方法,该方法完全依据字符出现概率来构造异字头的平均长度最短的码字,有时称之为最佳编码,一般就叫做Huffman编码(有时也称为霍夫曼编码)。 本实验实现了如下功能: (1)产生[0 255]范围内均匀分布、正态分布、拉普拉斯分布的三组离散随机整数。每组数据个数为 1920×1080,并对这三组数据分别进行哈夫曼编码和解码。计算熵和码字的平均码长。 (2)将彩色图像的像素 R、G、B 值作为独立符号,进行哈夫曼编码和解码,计算熵和码字平均码长。 (3)将彩色图像的像素 R、G、B 值作为联合符号,进行哈夫曼编码和解码,计算熵和码字的平均码长。

资源截图

代码片段和文件信息

function [symbcodewordlengcodeent] = Huffman_code(I)
%% -----------------------------------------------
%  EXPLAIN: 对图像进行编码的主要程序,编码程序的子函数
%  
%  INPUT: I为输入图像
%        
%  OUTPUT: symb为字符表,codeword为编码表lengcode为码字均长ent为熵值;
%
%  AUTHOR:Yang Hao
%  DATE: 2019/5/2
%% -----------------------------------------------

sta = tabulate(I(:))‘;% 统计概率
sta(:find(sta(2:)==0))=[];%删除概率为0的列
symb = sta(1:);% 出现符号
freq = sta(3:)/100;% 统计得到的概率,统计值扩大了100倍,所以需要除100
[freqsortindex] = sort(freq);%将符号按照出现的概率从小到大排序,并位置索引
f = freq;%保存初始排序后的概率向量,方便后续统计计算
symb = symb(sortindex)‘; %按概率排序的符号

L = length(freq);%字符的个数

% 创建一个元胞数组存放建立Huffman树过程中的排序变化情况,其第i个元素值代表代表当前排在第i位的所有字符的索引
ind_symb = num2cell(1:L);
codeword = cell(L1);% 创建一个L行1列的元胞型变量用于存放码字

% 大于一个字符开始编码
while length(freq) > 1 
    index0 = ind_symb{1};
    index1 = ind_symb{2};
    codeword = addcode(codewordindex0‘0‘);%ind_symb第一个元素代表的所有字符的编码再左侧添加码字‘0’
    codeword = addcode(codewordindex1‘1‘);%ind_symb第二个元素代表的所有字符的编码再左侧添加码字‘1’
    
    freq = [sum(freq(1:2)) freq(3:end)];%将前两个概率相加得到新的概率向量
    ind_symb = {[ind_symb{1}ind_symb{2}]ind_symb{3:end}};%将前两个索引合并新的索引
   
    [freqsortindex] = sort(freq);%将符号按照出现的概率从小到大排序,并记录位置索引
    ind_symb = ind_symb(sortindex); %按概率排序的符号索引
end

% 计算平均码长和熵
lengcode = 0;
ent = 0;
for i = 1:length(codeword)
    lengcode = lengcode+length(codeword{i})*f(i);
    ent = ent-f(i)*log2(f(i));  
end

end


function codeword = addcode(codewordindexitem)
%% -----------------------------------------------
%  EXPLAIN: 添加码字的函数,Huffman_code的子函数
%  
%  INPUT: codewoed为当前编码表,index为需要修改码字的索引,item为需要增加的码字
%        
%  OUTPUT: 新的编码表
%% -----------------------------------------------

l=length(index);
for i=1:l
    codeword{index(i)}=[itemcodeword{index(i)}];%在原码字的左侧添加码字item
end
end

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     目录           0  2019-05-23 10:54  哈夫曼编码算法的仿真和比较\
     文件     2074678  2019-05-04 19:59  哈夫曼编码算法的仿真和比较\A_均匀分布.bmp
     文件        3536  2019-05-04 20:04  哈夫曼编码算法的仿真和比较\A_均匀分布_哈夫曼编码字典.txt
     文件     2073600  2019-05-04 20:06  哈夫曼编码算法的仿真和比较\A_均匀分布_哈夫曼编码文件.bin
     文件     2074678  2019-05-04 21:24  哈夫曼编码算法的仿真和比较\A_均匀分布_哈夫曼编码文件_解压缩文件.bmp
     文件     6220856  2019-05-03 19:06  哈夫曼编码算法的仿真和比较\Flower.bmp
     文件        2213  2019-05-05 20:02  哈夫曼编码算法的仿真和比较\Huffman_code.m
     文件        2413  2019-05-23 09:46  哈夫曼编码算法的仿真和比较\Huffman_code_main.m
     文件        2137  2019-05-23 09:47  哈夫曼编码算法的仿真和比较\Huffman_decode.m
     文件     6220856  2019-05-03 18:44  哈夫曼编码算法的仿真和比较\Lena.bmp
     文件         529  2019-05-05 20:18  哈夫曼编码算法的仿真和比较\random_data.m
     文件     6220856  2019-05-03 18:45  哈夫曼编码算法的仿真和比较\Sky.bmp

评论

共有 条评论