(完整word版)数字图像处理图像编码
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数字图像处理上机实习报告(DIP4----DIP7)
学生姓名:杜坤
班级:071123
学号:20121003699
指导老师:傅华明
DIP-4 图像编码
一.题目要求
对图实施费诺-香农编码和解码,计算图像熵,平均码长和冗余度。
二.算法设计
1.测试脚本的程序框图
2.编码程序框图
读入图像的直方图,将图像的灰度值按照概率大小排序,按照香农编码的规则编码。
香农编码将概率由大到小,由上到下排成一排,然后分为两组。是将大的一组概率赋值为0,概率小的一组赋值为1,这是赋值的原则。然后依次的重复,直到每组只有一种输入元素为止。
3.解码程序框图
三.实现代码
1.脚本文件
clear all
load mat
p = impr(a); %统计概率
code = FanoCodeInit(p); %Fano编码初始化
code = FanoEncoder(code);%Fano编码
outstream = FanoCodeStream(a,code); %输出
data = FanoDecoder(outstream,code);%解码
data = reshape(data,8,8); %恢复8*8的形状
data = data'; %转置
I = abs(p.*log2(p));
disp('图像的熵为:');
H = sum(I(:)) %计算熵
disp('图像的平局码长为:')
B = FanoCodeLength(code); %求平均长度
disp('编码冗余度为:');
r = B/H - 1 %求冗余
disp('编码效率为:')
e = H/B %求编码效率
if isequal(a,data)
msgbox('解码后的数据和输入的数据完全吻合');
end
2.统计灰度的概率
function [p]= impr(f)
%概率统计
[m,n] = size(f);
graymax = max(f(:)); %找出灰度最大值,划定统计范围p = zeros(1,graymax + 1);
for i = 1:m
for j = 1:n
x = f(i,j) + 1;
p(x) = p(x) + 1;
end
end
p = p/(m*n);
End
3.码字的初始化
function [code] = FanoCodeInit(p)
%FanoShano码字初始化
[m,n] = size(p);
for i = 1:n
code(i).gray = i - 1;
code(i).p = p(i);
code(i).str = '';
end
%冒泡法排序
for i = 1:n
for j = 1:n-i
if code(j).p > code(j+1).p
temp = code(j);
code(j) = code(j+1);
code(j+1) = temp;
end
end
end
end
4.编码
function [pin] = FanoEncoder(pin)
%FanoShano编码
[m,n] = size(pin);
flag = 1;
while (flag)
start = 1;
stop = 1;
temp = pin(1);
for i = 1:n-1
if isequal(temp.str,pin(i+1).str)
stop = stop + 1;
elseif stop == start
start = i + 1;
stop = start;
temp = pin(i+1);
else
break;
end
end
if stop ~= start
pin = FanoCodeCat(pin,start,stop);
else
if i == n-1
flag = 0; %退出while(flag)的循环
end
end
end
end
5.输出码流
function [outstream] = FanoCodeStream(data,code) [m,n] = size(data);
len = length(code);
outstream = '';
for i = 1:m
for j = 1:n
for k = 1:len
if code(k).gray == data(i,j);
outstream = [outstream,code(k).str];
break;
end
end
end
end
end
6.解码
function [data] = FanoDecoder(instream,code)
len = length(instream);
str = '';gray = 0;flag = 0;data = 0;
for i = 1:len
[gray,flag] = LookUp(code,[str,instream(i)]); if flag
dlen = length(data);
data(dlen+1) = gray;
str = '';
else
str = [str,instream(i)];
end
end
dlen = length(data);
data = data(2:dlen);
end