图像霍夫曼编码与解码以及熵平均码长冗余度的计算.docx
- 文档编号:8424506
- 上传时间:2023-01-31
- 格式:DOCX
- 页数:10
- 大小:72.61KB
图像霍夫曼编码与解码以及熵平均码长冗余度的计算.docx
《图像霍夫曼编码与解码以及熵平均码长冗余度的计算.docx》由会员分享,可在线阅读,更多相关《图像霍夫曼编码与解码以及熵平均码长冗余度的计算.docx(10页珍藏版)》请在冰豆网上搜索。
图像霍夫曼编码与解码以及熵平均码长冗余度的计算
DIP上机报告
题目:
数字图像处理上机报告(第4次)
学校:
中国地质大学(武汉)
指导老师:
傅华明
姓名:
龙勋
班级序号:
071112-06
注:
给定的文件夹中只需运行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);
fori=1:
8
out(1,i)=i-1;
end
fori=1:
M
forj=1:
N
fork=1:
8
ifin(i,j)==out(1,k)
out(2,k)=out(2,k)+1;
end
end
end
end
fori=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
fori=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});%考虑最小概率包含了哪些元素
fori=1:
mp
code{coding{l1,2}(i),2}=[1,code{coding{l1,2}(i),2}];%在这些元素的编码前加1
end
[k,mp]=size(coding{l2,2});%考虑次小概率包含了哪些元素
fori=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
fori=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;
fori=1:
M
d(i)=data{i}(1,1);
end
turemin=min(d);%找出最小值
fori=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);
fori=1:
M
forj=1:
N
data=img(i,j);
fork=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);
fori=1:
M
forj=1:
N
data=Coded_Img{i,j};
fork=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;
fori=1:
M
H=H+code{i,3}*log2(1/code{i,3});
end
%计算熵
L=0;
fori=1:
M
[m,n]=size(code{i,2});
L=L+code{i,3}*n;
end
%计算平均码长
R=L/H-1;%计算冗余度
end
运行结果:
编码前图像:
编码后图像:
解码后图像:
熵(H)、平均码长(L)、冗余度(R)
至此,成功实现了图像矩阵的编码和解码以及相关参数的计算。
上机小结:
此次试验是对图像的矩阵进行霍夫曼编码和解码,编程的过程并不像平时做题一样很顺利。
有很多平时认为很简单的编码过程用程序实现起来比较麻烦,但是也进一步了解到了霍夫曼编码的原理。
在这次编程的过程中我还有一个比较棘手的问题没有解决,就是在霍夫曼编码的过程中,由于各个元素的概率是以double型的数据出现的,进行了四舍五入的处理。
如果在编码过程中有几个概率都进行了四舍五入的处理,那么在计算它们的和的过程中数据有可能会与真实值有所差异,而这个结果有可能与较大的概率相差很小,那么在编码时系统会自动根据此时概率的大小进行排列,有可能出现错误。
所以在计算机处理问题与我们平时做题时还是会有一点区别,这要求我在以后的学习中还要更加深入地感受这一方面。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 图像 霍夫曼 编码 解码 以及 平均 冗余 计算