主题:[讨论]【紧急求助】怎么用huffman编码压缩一幅图像?
我想用哈夫曼编码的方式在MATLAB上实现对图像的压缩,并输出一个压缩后的文件,还要显示压缩后的一些信息(如压缩比之类的),找了书上的一些代码,想写成“.M”文件,但是不知道还要加点什么或者修改哪里才能实现,希望高手能帮帮忙~!好急啊~怎么办呢...:Q
以下是代码:
[Filename,Pathname]=uigetfile(...
{'*.tif';'*.bmp'},'选择图片');
str=[Pathname Filename];
if (Filename~=0)
z=imread(str);
imshow(z);
%else
%clear; %显示数组Z
[m,n]=size(z);
p1=1;s=m*n;
for k=1:m %获取图像颜色总数
for l=1:n
f=0;
for b=1:p1-1
if(c(b,1)==z(k,l)) f=1;break;end
end
if(f==0)c(p1,1)=z(k,l);p1=p1+1;end
end
end
for g=1:p1-1 %计算各种颜色值出现概率
p(g)=0;c(g,2)=0;
for k=1:m
for l=1:n
if(c(g,1)==z(k,l))p(g)=p(g)+1;end
end
end
p(g)=p(g)/s;
end
pn=0;po=1;
while(1) %按概率排序生成一个符号(0或1)树并记录各节点
if(pn>=1.0) break;
else
[pm,p2]=min(p(1:p1-1));p(p2)=1.1;
[pm2,p3]=min(p(1:p1-1));p(p3)=1.1;
pn=pm+pm2;p(p1)=pn;
tree(po,1)=p2;tree(po,2)=p3;
po=po+1;p1=p1+1;
end
end
for k=1:po-1 %沿符号树进行搜索生成哈夫曼编码
tt=k;m1=1;
if(or(tree(k,1)<g,tree(k,2)<g))
if(tree(k,1)<g)
c(tree(k,1),2)=c(tree(k,1),2)+m1;
m2=1;
while(tt<po-1)
m1=m1*2;
for l=tt:po-1
if(tree(l,1)==tt+g)
c(tree(k,1),2)=c(tree(k,1),2)+m1;
m2=m2+1;tt=l;break;
elseif(tree(l,2)==tt+g)
m2=m2+1;tt=l;break;
end
end
end
c(tree(k,l),3)=m2;
end
tt=k;m1=1;
if(tree(k,2)<g)
m2=1;
while(tt<po-1)
m1=m1*2;
for l=tt:po-1
if(tree(l,1)==tt+g)
c(tree(k,2),2)=c(tree(k,2),2)+m1;
m2=m2+1;tt=l;break;
elseif(tree(l,2)==tt+g)
m2=m2+1;tt=l;break;
end
end
end
c(tree(k,2),3)=m2;
end
end
end
end
以下是代码:
[Filename,Pathname]=uigetfile(...
{'*.tif';'*.bmp'},'选择图片');
str=[Pathname Filename];
if (Filename~=0)
z=imread(str);
imshow(z);
%else
%clear; %显示数组Z
[m,n]=size(z);
p1=1;s=m*n;
for k=1:m %获取图像颜色总数
for l=1:n
f=0;
for b=1:p1-1
if(c(b,1)==z(k,l)) f=1;break;end
end
if(f==0)c(p1,1)=z(k,l);p1=p1+1;end
end
end
for g=1:p1-1 %计算各种颜色值出现概率
p(g)=0;c(g,2)=0;
for k=1:m
for l=1:n
if(c(g,1)==z(k,l))p(g)=p(g)+1;end
end
end
p(g)=p(g)/s;
end
pn=0;po=1;
while(1) %按概率排序生成一个符号(0或1)树并记录各节点
if(pn>=1.0) break;
else
[pm,p2]=min(p(1:p1-1));p(p2)=1.1;
[pm2,p3]=min(p(1:p1-1));p(p3)=1.1;
pn=pm+pm2;p(p1)=pn;
tree(po,1)=p2;tree(po,2)=p3;
po=po+1;p1=p1+1;
end
end
for k=1:po-1 %沿符号树进行搜索生成哈夫曼编码
tt=k;m1=1;
if(or(tree(k,1)<g,tree(k,2)<g))
if(tree(k,1)<g)
c(tree(k,1),2)=c(tree(k,1),2)+m1;
m2=1;
while(tt<po-1)
m1=m1*2;
for l=tt:po-1
if(tree(l,1)==tt+g)
c(tree(k,1),2)=c(tree(k,1),2)+m1;
m2=m2+1;tt=l;break;
elseif(tree(l,2)==tt+g)
m2=m2+1;tt=l;break;
end
end
end
c(tree(k,l),3)=m2;
end
tt=k;m1=1;
if(tree(k,2)<g)
m2=1;
while(tt<po-1)
m1=m1*2;
for l=tt:po-1
if(tree(l,1)==tt+g)
c(tree(k,2),2)=c(tree(k,2),2)+m1;
m2=m2+1;tt=l;break;
elseif(tree(l,2)==tt+g)
m2=m2+1;tt=l;break;
end
end
end
c(tree(k,2),3)=m2;
end
end
end
end