图像霍夫曼编码与解码以及熵,平均码长,冗余度的计算

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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};

相关文档
最新文档