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

发布时间:2018-06-30 04:10:25   来源:文档文库   
字号:

DIP上机报告

目:数字图像处理上机报告(第4次)

校: 中国地质大学(武汉)

师: 傅华明

名:

号: 071112-06

目录

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

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};

end

end

end

end

end

图像解码代码:

function [img]=Decode(Coded_Img,code)

%遍历编码图像,查表确定数值

[M,N]=size(Coded_Img);

[Mc,Nc]=size(code);

for i=1:M

for j=1:N

data=Coded_Img{i,j};

for k=1:Mc

if(size(data)==size(code{k,2}))

if (code{k,2}==data)

img(i,j)=code{k,1};

end

end

end

end

end

end

相关数据的计算:

function [H,L,R]=GetInfo(code)

[M,N]=size(code);

H=0;

for i=1:M

H=H+code{i,3}*log2(1/code{i,3});

end

%计算熵

L=0;

for i=1:M

[m,n]=size(code{i,2});

L=L+code{i,3}*n;

end

%计算平均码长

R=L/H-1;%计算冗余度

end

运行结果:

编码前图像:

编码后图像:

解码后图像:

熵(H)、平均码长(L)、冗余度(R

至此,成功实现了图像矩阵的编码和解码以及相关参数的计算。

上机小结:

此次试验是对图像的矩阵进行霍夫曼编码和解码,编程的过程并不像平时做题一样很顺利。有很多平时认为很简单的编码过程用程序实现起来比较麻烦,但是也进一步了解到了霍夫曼编码的原理。在这次编程的过程中我还有一个比较棘手的问题没有解决,就是在霍夫曼编码的过程中,由于各个元素的概率是以double型的数据出现的,进行了四舍五入的处理。如果在编码过程中有几个概率都进行了四舍五入的处理,那么在计算它们的和的过程中数据有可能会与真实值有所差异,而这个结果有可能与较大的概率相差很小,那么在编码时系统会自动根据此时概率的大小进行排列,有可能出现错误。所以在计算机处理问题与我们平时做题时还是会有一点区别,这要求我在以后的学习中还要更加深入地感受这一方面。

本文来源:https://www.2haoxitong.net/k/doc/82bee75d0912a21615792938.html

《图像霍夫曼编码与解码以及熵,平均码长,冗余度的计算.doc》
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:
点击下载文档

文档为doc格式