图像霍夫曼编码与解码以及熵,平均码长,冗余度的计算
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
DIP上机报告
题目:数字图像处理上机报告(第4次)学校:中国地质大学(武汉)
***师:***
*名:**
班级序号: 071112-06
目录
1图像霍夫曼编码与解码以及熵,平均码长,冗余度的计算错误!未定义书签。2上机小结 (10)
注:给定的文件夹中只需运行test脚本就可以得到结果,从workspace
中看到相应的数据
4.2图像的霍夫曼编码与解码
题目要求:
对图2实施哈夫曼编码和解码,计算图象熵,平均码长和冗余度;
算法设计:
1.遍历图像,统计各个像素灰度值的概率
2.找出概率最小的两个,在最小概率所代表的灰度值编码中加1,在另一个较小的概率所代表的灰度值编码中加0
3.合并两个概率,成为一个新的元素,如此重复下去,直到最后剩两个元素
4.进行编码的逆过程,即解码过程
5.计算相应的数据
程序代码:
运行代码:
clear
in=[2,2,3,5,0,0,5,5,
5,4,1,1,2,2,1,5,
4,6,5,5,7,2,2,3,
5,2,2,2,3,4,4,4,
6,2,1,4,1,1,2,2,
1,5,7,6,5,5,7,2,
2,4,4,1,2,2,1,5,
2,3,1,2,2,1,5,0];
[p,out] = gailv( in );
[code] = Huffman(0:7,p); %进行霍夫曼编码
[Coded_Img]=Encode(in,code); %对图像进行编码
[H,L,R]=GetInfo(code); %计算熵、平均码长、冗余度[Img]=Decode(Coded_Img,code); %对图像进行解码
图像各像素灰度的概率计算:
function[ p,out ]=gailv( in )
[M,N]=size(in);
out = zeros(4,8);
p = zeros(1,8);
for i=1:8
out(1,i)=i-1;
end
for i=1:M
for j=1:N
for k=1:8
if in(i,j) == out(1,k)
out(2,k)=out(2,k)+1;
end
end
end
end
for i=1:8
out(3,i)=out(2,i)/(M*N);
p(1,i)=out(2,i)/(M*N);
end
end
霍夫曼编码过程:
function [code_out] = Huffman(s,p)
[Ms,Ns]=size(s);
if (Ms==1)
sig=s';
else
sig=s;
end
%s为各元素名称 p为各元素概率
[Ms,Ns]=size(sig);
[Mp,Np]=size(p);
if (Ms~=Np)
return;
end
code=cell(Ms,4);%建立编码cell
code_out=cell(Ms,3);%建立输出cell
coding=cell(Ms,2);%建立编码过程中用到的cell
for i=1:Ms
code{i,1}=sig(i,:);%第一列为元素名称
code{i,2}=[];%第二列为编码
code{i,3}=p(i);%第三列为元素概率
code{i,4}=[];%第四列为元素概率排行
coding{i,1}=p(i);%第一行为元素概率
coding{i,2}=i;%第二行表示此概率由哪些元素组成
end
[m,l]=Cell_min(coding(:,1));%找出最小值
while (m<1)%若最小值小于1(编码尚未完成)
[m1,l1]=Cell_min(coding(:,1));%找出最小值
temp_p=coding{l1,1};%记录下最小概率
coding{l1,1}=2;%将概率改为2,则以后不会再次取到
[m2,l2]=Cell_min(coding(:,1));%找出次小值
coding{l2,1}=coding{l2,1}+temp_p;%最小概率和次小概率相加得到新元素概率
[k,mp]=size(coding{l1,2});%考虑最小概率包含了哪些元素
for i=1:mp
code{coding{l1,2}(i),2}=[1,code{coding{l1,2}(i),2}];%在这些元素的编码前加1
end
[k,mp]=size(coding{l2,2});%考虑次小概率包含了哪些元素
for i=1:mp
code{coding{l2,2}(i),2}=[0,code{coding{l2,2}(i),2}];%在这些元素的编码前加0
end
coding{l2,2}=[coding{l2,2},coding{l1,2}];%新元素包含了次小和最小元素包含的所有元素
[m,l]=Cell_min(coding(:,1));%找出当前最小值,继续循环
end
for i=1:Ms
code_out(i,1:3)=code(i,1:3);%输出cell前3列等于编码cell前3列end
求概率的最小值函数:
function [mind,loc]=Cell_min(data)
%找出cell中的某列元素的最小值和位置
[M,N]=size(data);
loc=-1;
for i=1:M
d(i)=data{i}(1,1);
end
turemin=min(d);%找出最小值
for i=1:M %遍历矩阵,找出最小值所在位置
if (d(i)==turemin)
mind=d(i);
loc=i;
return;
end
end
end
图像编码代码:
function [Coded_Img]=Encode(img,code)
%遍历图像,查表确定码字
[M,N]=size(img);
[Mc,Nc]=size(code);
Coded_Img=cell(M,N);
for i=1:M
for j=1:N
data=img(i,j);
for k=1:Mc
if (code{k,1}==data)
Coded_Img{i,j}=code{k,2};