数字视频报告资料.docx

上传人:b****7 文档编号:15863224 上传时间:2023-07-08 格式:DOCX 页数:18 大小:99.95KB
下载 相关 举报
数字视频报告资料.docx_第1页
第1页 / 共18页
数字视频报告资料.docx_第2页
第2页 / 共18页
数字视频报告资料.docx_第3页
第3页 / 共18页
数字视频报告资料.docx_第4页
第4页 / 共18页
数字视频报告资料.docx_第5页
第5页 / 共18页
数字视频报告资料.docx_第6页
第6页 / 共18页
数字视频报告资料.docx_第7页
第7页 / 共18页
数字视频报告资料.docx_第8页
第8页 / 共18页
数字视频报告资料.docx_第9页
第9页 / 共18页
数字视频报告资料.docx_第10页
第10页 / 共18页
数字视频报告资料.docx_第11页
第11页 / 共18页
数字视频报告资料.docx_第12页
第12页 / 共18页
数字视频报告资料.docx_第13页
第13页 / 共18页
数字视频报告资料.docx_第14页
第14页 / 共18页
数字视频报告资料.docx_第15页
第15页 / 共18页
数字视频报告资料.docx_第16页
第16页 / 共18页
数字视频报告资料.docx_第17页
第17页 / 共18页
数字视频报告资料.docx_第18页
第18页 / 共18页
亲,该文档总共18页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

数字视频报告资料.docx

《数字视频报告资料.docx》由会员分享,可在线阅读,更多相关《数字视频报告资料.docx(18页珍藏版)》请在冰点文库上搜索。

数字视频报告资料.docx

数字视频报告资料

成绩

评阅人

中国矿业大学2015-2016学年第一学期

《数字视频技术》课程小设计考核

设计题目:

图像的算术编码研究

 

专业班级:

学生姓名:

学生学号:

指导教师:

成绩:

 

本人郑重声明:

本人认真、独立完成了查找资料、完成作业、编写程序等考核任务,无抄袭行为。

签字:

日期:

一、设计任务、目的和要求:

1.1设计任务:

图像的算术编码

1.2设计目的:

1.了解图像压缩的意义方法,对比不同的压缩方法;

2.熟悉算术编码的基本原理和特点;

3.掌握改进的算术编码的方法与具体实例应用;

4.掌握利用MATLAB编程实现数字图像的算术编码。

1.3设计要求:

要求实现灰度图像的算术编码和解码恢复图像;处理结果要求最终图像显示,且计算图像的信息熵,平均码字长度,编码效率,压缩比。

二、总体方案设计

2.1算术编码简介

算术编码,是图像压缩的主要算法之一。

是一种无损数据压缩方法,也是一种熵编码的方法。

和其它熵编码方法不同的地方在于,其他的熵编码方法通常是把输入的消息分割为符号,然后对每个符号进行编码,而算术编码是直接把整个输入的消息编码为一个数,一个满足(0.0≤n<1.0)的小数n。

  算术编码是一种到目前为止编码效率最高的统计熵编码方法,它比著名的Huffman编码效率提高10%左右,但由于其编码复杂性和实现技术的限制以及一些专利权的限制,所以并不象Huffman编码那样应用广泛。

算术编码有两点优于Huffman码:

①它的符号表示更紧凑;②它的编码和符号的统计模型是分离的,可以和任何一种概率模型协同工作。

后者非常重要,因为只要提高模型的性能就可以提高编码效率。

2.2软件运行环境

系统运行环境:

windows操作系统。

软件编程平台:

Matlab2014a。

2.3编解码算法原理

2.3.1编码

算术编码将整个要编码的数据映射到一个位于[0,1)的实数区间中。

并且输出一个小于1同时大于0的小数来表示全部数据。

利用这种方法算术编码可以让压缩率无限的接近数据的熵值,从而获得理论上的最高压缩率。

算术编码进行编码时,从实数区间[0,1)开始。

按照符号的频度将当前的区间分割成多个子区间。

根据当前输入的符号选择对应的子区间,然后从选择的子区间中继续进行下一轮的分割。

不断的进行这个过程,直到所有符号编码完毕。

对于最后选择的一个子区间,输出属于该区间的一个小数。

这个小数就是所有数据的编码。

子区间计算的迭代递推公式:

StartN=StartB+LeftC*L

EndN=StartB+RightC*L

其中StartN表示新子区间的起始位置,EndN表示新子区间的结束位置,StartB表示前子区间的起始位置,LeftC表示当前符号的区间左端,RightC表示当前符号的区间右端,L表示前子区间宽度。

2.3.2解码

算术编码进行解码时仅输入一个小数。

解码前首先需要对区间[0,1)按照初始时的符号频度进行分割。

然后观察输入的小数位于那个子区间。

输出对应的符号,选择对应的子区间,然后从选择的子区间中继续进行下一轮的分割。

不断的进行这个过程,直到所有的符号都解码出来。

整个过程相当于编码时的逆运算。

2.3.3算术编码的改进

以上描述的算法,在当前的计算机系统上是很难实现的。

尤其是无限精度的实数运算。

所以在实现的时候,需要对算法做一些改进。

使得它可以在当前的计算机系统上较快的运行。

当然,这种改进是以降低运算精度为代价的。

也就是说,这种改进实际上会降低算法的压缩率。

但是,它会使算法的实现成为可能。

观察前面描述的算法过程可以发现,运算时区间的上下沿都是小于1的小数。

那么我们可以省略0和小数点,仅仅使用小数的尾数来表示小数。

省略0和小数点后的尾数,实际上就是一个无限大的整数。

使用无限整数的部分高位来表示整数,并在这些整数上进行整数运算就可以模拟出实数运算。

另外,分割区间、选择子区间的过程,相当于将一个区间映射到另一个更小的区间中(以下简称“映射区间”)。

如果我们知道一个符号的频度。

以及符号值小于该符号的其它符号的频度总计(以下简称“累积频度(CumulativeFrequency)”)。

还有到目前为止所有符号频度的总计(以下简称“总计频度(TotalFrequency)”)。

那么就可以根据这些频度信息,从当前区间中计算出映射区间。

计算的公式如下:

Range=High-Low+1

High=Low+Range*(CumFreq+Freq)/Total–1

Low=Low+Range*CumFreq/Total

其中Low表示区间的下沿;High表示区间的上沿;Range表示区间的范围;Freq表示符号频度;CumFreq表示累积频度;Total表示总计频度。

这些变量中保存的都是整数,并进行整数运算。

其中”/”表示整除。

另外需要注意一点,这里使用闭区间[Low,High],而不是使用右开区间[Low,High)。

在解码的时候也可以进行整数运算。

根据输入的整数数值、当前区间的下沿和总计频度,可以计算出一个估算出来的累积频度(以下简称“估算频度(EstimateFrequency)”)。

其计算公式如下。

Range=High-Low+1

EstFreq=((Value-Low+1)*Total-1)divRange

其中,Value表示输入的整数数值;EstFreq表示估算频度。

利用估算频度在当前的累积频度表中查找,当满足CumFreq≤EstFreq<CumFreq+Freq的条件时,就可以解码出一个符号。

利用解码出的符号可以得到对应的累积频度和频度。

根据这些频度信息,可以从当前区间中计算出映射区间。

这一点同编码时是一样的。

计算出映射区间后,更新对应符号的频度,又可以进行新的一轮解码。

2.3.4流程图

(1)主程序

(2)概率统计

(3)编码函数

 

三、设计与实现

Matlab所有程序如下:

(1)Matlab主程序

closeall;clearall;clc;%关闭所有图形窗口,清除工作空间所有变量,清空命令行

image=imread('lena.bmp');%读取图像,得到图像的数据矩阵

X=imread('lena.bmp');

subplot(1,3,1);imshow(X);title('原始图像')

%对图像缩小

N=16;

seq=imresize(image,[N,N]);%B=imresize(A,[rowscols]),[rowscols]为图像调整后的尺寸

%当使用公式seq=imresize(image,M),M指缩小倍数时,利用代码[m,n]=size(seq)[r,c]=size(A),当有两个输出参数时,size函数将矩阵的行数返回到第一个输出变量r,将矩阵的列数返回到第二个输出变量c。

%二维数据转化成一维

k=1;

forj=1:

N

fori=1:

N

x(k)=seq(j,i);

k=k+1;

end

end

%计算信源每个灰度值的概率

[alphacnt]=probmodel(x);%cnt(i)为信源符号出现的次数,alpha(i)信源符号

%开始编码

btag=arithintcod(alpha,cnt,x);

%计算编码长度

b=length(btag);

%开始解码

outseq=arithintdecod(btag,alpha,cnt,length(x));

%对解码出的一维数据转换为二维图像

k=1;

forj=1:

N

fori=1:

N

outimg(j,i)=outseq(k);

k=k+1;

end

end

%计算信息熵

sum=N*N;

H=0;%初始化信息熵

fori=0:

255;

[r,c]=find(seq==i);%统计每个灰度值的像素点总数

num(i+1)=length(r);

p(i+1)=num(i+1)/sum;%统计每个灰度值的概率

ifp(i+1)~=0

H=H-p(i+1)*log2(p(i+1));%计算信息熵

end

end

%计算平均码字长度

pjmc=b/sum;

%计算编码效率

bmxl=H/pjmc;

%计算压缩比

ysb=sum*8/b;

%输出最终结果

%输出编码前图像

disp('原图像');

disp(x);

%输出编码

disp(strcat('编码=',btag));

%输出解码

disp('解码图像');

disp(outseq);

disp('信息熵');disp(H);disp('平均码字长度');disp(pjmc);

disp('编码效率');disp(bmxl);disp('压缩比');disp(ysb);

subplot(1,3,2),imshow(seq),title('压缩图像');

subplot(1,3,3),imshow(outimg),title('解码图像');

d=length(x);

(2)概率统计probmodel函数

%概率统计程序

function[alphacnt]=probmodel(seq)

%输入seq原始图像

%cnt(i)信源符号出现的次数

%alpha(i)信源符号

if~isempty(seq)

alpha

(1)=seq

(1);%初始化

cnt

(1)=1;%初始化

l=length(seq);%计算循环次数

k=2;

fori=2:

l%遍历数据

idx=find(seq(i)==alpha);%寻找alpha中是否有该符号

ifisempty(idx)%若没有,则添加入alpha

alpha(k)=seq(i);

cnt(k)=1;

k=k+1;

else%若有,则该该符号出现次数加一

cnt(idx)=cnt(idx)+1;

end

end

else

alpha=0;

cnt=0;

end

end

(3)编码函数

%实现编码的函数

functiontag=arithintcod(alpha,cnt,seq)

%算术编码

%alpha表示信源符号

%cnt表示信源符号出现次数,概率

%seq表示输入图像数据

ls=length(seq);%计算输入数据的总个数

CC

(1)=0;%计算累计概率,便于计算上下限

fori=1:

length(cnt)

CC(i+1)=CC(i)+cnt(i);

end

totcount=CC(i+1);%总符号数

m=ceil(log2(totcount*4));%需要编码的长度

l=0;%下限

u=2^m-1;%上限

tag='';%编码标签

scale=0;

%开始迭代过程

fori=1:

ls%开始迭代编码

p=find(seq(i)==alpha);%该符号在信源符号的位置

l1=l+floor(((u-l+1)*CC(p))/totcount);%计算上下限

u=l+floor(((u-l+1)*CC(p+1))/totcount)-1;

l=l1;

lb=dec2bin(l,m);%转换为字符串二进制

ub=dec2bin(u,m);

E2=1;E3=1;%区间扩展的两个条件

while(E2|E3)

fbl=lb

(1);%上下限第一位

fbu=ub

(1);

iffbl==fbu%若首位相等,则可移出,并扩展区间

E2=1;

tag=strcat(tag,fbl);%移出

lb

(1)='';%左移,扩展区间

lb(end+1)='0';

ub

(1)='';

ub(end+1)='1';

iffbl=='0'

sc='1';

else

sc='0';

end

whilescale>0

tag=strcat(tag,sc);

scale=scale-1;

end

else

E2=0;

end

sbl=lb

(2);

sbu=ub

(2);

fbl=lb

(1);%上下限第一位

fbu=ub

(1);

iffbl~=fbu

ifsbl=='1'&sbu=='0'%忽略次高位,并记录忽略次数

lb

(1)='';

lb(end+1)='0';

ub

(1)='';

ub(end+1)='1';

lb

(1)='0';

ub

(1)='1';

scale=scale+1;

E3=1;

else

E3=0;

end

end

end

l=bin2dec(lb);%转换为10进制

u=bin2dec(ub);

end

f=lb

(1);%对最终区间编码

lb

(1)='';

iff=='0'

sc='1';

else

sc='0';

end

tag=strcat(tag,f);

whilescale>0

tag=strcat(tag,sc);

scale=scale-1;

end

tag=strcat(tag,lb);

end

(4)解码函数

%解码程序

functionseq=arithintdecod(btag,alpha,cnt,lgt)

CC

(1)=0;%seq表示输出的序列

fori=1:

length(cnt)%cnt是概率

CC(i+1)=CC(i)+cnt(i);

end

totcount=CC(i+1);

m=ceil(log2(totcount*4));%向上取整

l=0;

u=2^m-1;

fori=1:

lgt

ts=btag(1:

m);

t=bin2dec(ts);

k=1;

s=floor(((t-l+1)*totcount-1)/(u-l+1));

while(s>=CC(k))

k=k+1;

end

seq(i)=alpha(k-1);

l1=l+floor(((u-l+1)*CC(k-1))/totcount);

u=l+floor(((u-l+1)*CC(k))/totcount)-1;

l=l1;

lb=dec2bin(l,m);

ub=dec2bin(u,m);

E2=1;E3=1;

while(E2|E3)

fbl=lb

(1);

fbu=ub

(1);

iffbl==fbu

E2=1;

lb

(1)='';

lb(end+1)='0';

ub

(1)='';

ub(end+1)='1';

btag

(1)='';

else

E2=0;

end

sbl=lb

(2);

sbu=ub

(2);

ifsbl=='1'&sbu=='0'

lb

(1)='';

lb(end+1)='0';

ub

(1)='';

ub(end+1)='1';

lb

(1)='0';

ub

(1)='1';

btag

(1)='';

if(btag

(1)=='0')

btag

(1)='1';

else

btag

(1)='0';

end

E3=1;

else

E3=0;

end

end

u=bin2dec(ub);

l=bin2dec(lb);

end

end

四、测试与调试

运行结果:

(1)原始图像、压缩图像和解码图像对比

(2)图像信息熵,平均码字长度,编码效率,压缩比结果显示。

(3)注意事项

为了使程序具有连贯性,将编码和解码的函数.m文件放在同一个文件目录下。

同时将图片文件同样放入该M文件目录下,便于程序运行调用。

为了避免图像失真严重和获取的图像数据量过于大(影响程序的运行速度),注意设定合适的图像压缩比例。

五、结论与心得

通过本次的课程设计,我们共同探讨了算术编码的基本原理以及其在图像处理上的应用,通过在MATLAB平台对灰度图像进行编码和解码的过程,我们将课堂上学习到的理论知识运用于实践中,加深了对算术编码的理解。

在设计期间,我们深入地分析课堂上讲的算术编码的原理,并且主动地查阅了许多网络及书籍资料,查看了图像获取、压缩、求解相关参数的内容,不停地对代码进行修改和仿真,在组员们的共同努力下,我们最终完成了整个算法的实现。

但是在编解码算法的细节部分仍处于半知半解的状态,在以后的学习中能够熟练地掌握这部分的知识点。

参考文献

【1】戴辉卢益民.数字视频技术.北京邮电大学出版社.2012.

【2】杨高波,杜青松.MATLAB图像/视频处理应用及实例.电子工业出版社.2010.

【3】贾洪峰.数据压缩导论(第四版).人民邮电出版社.2014.

【4】秦襄培.MATLAB图像处理宝典.电子工业出版社.2011.

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 幼儿教育 > 幼儿读物

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2