(完整word版)数字图像处理图像编码

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

相关文档
最新文档