huffmanpictureprocessing.rar

  • ant98
    了解作者
  • matlab
    开发工具
  • 706KB
    文件大小
  • rar
    文件格式
  • 0
    收藏次数
  • 1 积分
    下载积分
  • 3
    下载次数
  • 2020-10-17 20:53
    上传日期
对图像通过霍夫曼编码进行压缩并且解压。附有测试图像Lena
huffmanpictureprocessing.rar
  • huffdecode.m
    1.1KB
  • frequency.m
    329B
  • decode.m
    99B
  • lena.bmp
    702.8KB
  • addnode.m
    295B
  • huffencode.m
    3.2KB
  • main.m
    512B
内容介绍
function [zipped,info]=huffencode(vector) [m,n]=size(vector); %求输入矩阵的行列数 vector=vector(:)'; %将矩阵按列转换成一列后转至,成为一个行向量 ( 其中存放灰度值 ) f=frequency(vector); %0-255灰度概率,值为概率 symbols=find(f~=0); %概率不为零的灰度值,1-215 值为灰度值 f=f(symbols); %筛选后概率向量,0-255 去0概率 [f,sortindex]=sort(f); %排序升序,sortindex筛选后的序号 fs=f; symbols=symbols(sortindex); %灰度值按概率排序 len=length(symbols); %读取位置向量的长度 symbols_index=num2cell(1:len); %生成异质矩阵 codeword_tmp=cell(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); %得到新的索引表 end codeword=cell(256,1); codeword(symbols)=codeword_tmp; %各符号二进制码字按原符号位存入细胞型矩阵 len=0; for i=1:length(symbols) %得到各符号码长矩阵 wordlen(i)=length(codeword_tmp{i}); end avawordlen=fs*wordlen'; %计算平均码长 Hlog=log2(fs)'; H=-(fs*Hlog); %计算信息熵 for index=1:length(vector) %得到整个图像各点灰度值转化为二进制码字后的总比特数 len=len+length(codeword{double(vector(index))+1}); end string=repmat(uint8(0),1,len); %创建元素数与总比特数一致的行向量 pointer=1; %定义指针变量 for index=1:length(vector) % 对输入图像进行编码 code=codeword{double(vector(index))+1}; %对应符号的二进制码字给 len=length(code); %读取码字长度 string(pointer+(0:len-1))=code; %将二进制码字存入行向量中 pointer=pointer+len; %指针移移位 end % 将二进制编码按照每 8 位生成一个新字符。 len=length(string); zp=8-mod(len,8); if zp>0 string=[string uint8(zeros(1,zp))]; %不足 8 位的在后补零 end codeword=codeword(symbols); %码字按符号概率放入列向量中 codelen=zeros(size(codeword)); %创建与列向量元素数相同的列向量 %将二进制转化为十进制 weights=2.^(0:23); for index=1:length(codeword) len=length(codeword{index}); %读二进制码字长度 if len>0 code=sum(weights(codeword{index}==1)); %计算二进制码字对应的十进制数 code=bitset(code,len+1); %将码字最高位的上一位置 1 codeword{index}=code; codelen(index)=len; %码字长度存入列向量中 end end codeword=[codeword{:}]; %转化为行向量 %计算压缩后的向量 cols=length(string)/8; string=reshape(string,8,cols); weights=2.^(0:7); zipped=uint8(weights*double(string)); %码表存储到一个稀疏矩阵 huffcodes=sparse(1,1); for index=1:nnz(codeword) huffcodes(codeword(index),1)=symbols(index); end %返回编码参数 % info.zeropad=zp; %添加的比特数 info.huffcodes=huffcodes; %码字表 info.length=length(vector); %灰度化图像矩阵长度 info.rows=m; %灰度图像行数 info.cols=n; %灰度图像列数 info.avalen=avawordlen; %平均码长 info.ratio=8/avawordlen; %压缩比 info.h=H; %信息熵 info.ce=H/avawordlen; %编码效率 end
评论
    相关推荐