数据压缩实验指导书(4)

2019-04-16 17:52

end;

codetable(icodecount)=ipcount; codetable(icodecount+1)=p1; icodecount=icodecount+2; codetable(icodecount)=nn;%行结束符号 icodecount=icodecount+1; end;

codetable(icodecount)=65535;%码表结束符号 (2)连续灰度图像的霍夫曼编码程序代码 function s=reduce(p) s=cell(length(p),1); for i=1:length(p) s{i}=i; end;

n=size(s,1); while n>2

[p,i]=sort(p); p(2)=p(1)+p(2); p(1)=[]; s=s(i);

s{2}={s{1},s{2}}; s(1)=[];

n=size(s,1); end;

function makecode(sc,codeword) global CODE if isa(sc,'cell')

makecode(sc{1},[codeword 0]); makecode(sc{2},[codeword 1]); else

CODE{sc}=char('0'+codeword); end;

function CODE=huffman(p) global CODE

CODE=cell(length(p),1); if length(p)>1 p=p/sum(p); s=reduce(p); makecode(s,[]);

else

CODE={'1'}; end;

function y=mat2huff(x) y.size=uint32(size(x)); x=round(double(x)); xmin=min(x(:)); xmax=max(x(:));

pmin=double(int16(xmin)); pmin=uint16(pmin+32768); y.min=pmin;

x=x(:)';

h=histc(x,xmin:xmax); maxh=max(h); if maxh>65535

h=65535*h/maxh; end;

h=uint16(h); y.hist=h;

map=huffman(double(h)); hx=map(x(:)-xmin+1); hx=char(hx)'; hx=hx(:)'; hx(hx==' ')=[];

ysize=ceil(length(hx)/16); hx16=repmat('0',1,ysize*16); hx16(1:length(hx))=hx;

hx16=reshape(hx16,16,ysize); hx16=hx16'-'0';

twos=pow2(15:-1:0);

%y.code=uint16(sum(t3,2))'; t1=ones(ysize,1); t2=twos(t1,:); t3=hx16.*t2; t4=sum(t3,2);

y.code=uint16(t4)';

实验二 图像DCT变换编码与压缩

一、实验题目:

图像DCT变换编码与压缩

二、实验目的:

(1)掌握离散余弦变换DCT的实现方法,了解DCT的幅度分布特性,从而加深对DCT变换的认识。

(2)掌握图像DCT变换编码的实现方法,从而加深对变换编码压缩图像原理的理解。

三、实验内容:

编程实现图像DCT变换编码。

四、预备知识:

(1)熟悉DCT原理。 (2)熟悉变换编码原理。

(3)熟悉在MATLAB环境下对图像文件的I/O操作。

五、实验原理:

变换编码是在变换域进行图像压缩的一种技术。图2.2.1显示了一个典型的

变换编码系统。

输入图像N×N构建n×n子图像正变换量化器符号编码器压缩图像

图2.2.1 变换编码系统

在变换编码系统中,如果正变换采用DCT变换就称为DCT变换编码系统。 DCT用于把一幅图像映射为一组变换系数,然后对系数进行量化和编码。对于大多数的正常图像来说,多数系数具有较小的数值且可以被粗略地量化(或者完全抛弃),而产生的图像失真较小。

DCT是仅次于K-L变换的次最佳正交变换,且以获得广泛应用,并成为许多图像编码国际标准的核心。离散余弦变换的变换核为余弦函数,计算速度快,有利于图像压缩和其他处理。

对于N×N的数字图像,二维DCT变换的正反变换可表示为:

F(u,v)?c(u)c(v)??f(x,y)cosx?0y?0N?1N?1(2x?1)u?(2y?1)v?cos2N2N(2x?1)u?(2y?1)v?cos2N2Nf(x,y)?2N??c(u)c(v)F(u,v)cosu?0v?0N?1N?1(2.2.1)

其中,

?1/2u?0或v?0?c(u)?c(v)??

??1u,v?1,2,...,N?1MATLAB图像处理工具箱实现离散余弦变换有两种方法:

(1)使用函数dct2,该函数用一个基于FFT的算法来提高当输入较大的方阵时的计算速度。

(2)使用由dctmtx函数返回的DCT变换矩阵,这种方法较适合于较小的输入方阵(例如8×8或16×16)。

①函数:dct2

实现图像的二维离散余弦变换。调用格式为: B = dct2(A) B = dct2(A,[M N]) B = dct2(A,M,N)

式中A表示要变换的图像,M和N是可选参数,表示填充后的图像矩阵大小,B表示变换后得到的图像矩阵。

②函数:dctmtx

除了用dct2函数实现二维离散余弦变换,还可用 dctmtx函数来计算变换矩阵,调用格式为:

D = dctmtx(N)

式中D是返回N×N的DCT变换矩阵,如果矩阵A是N×N方阵,则A的DCT变换可用D×A×D’来计算。这在有时比dct2计算快,特别是对于A很大的情况。

③函数:idct2

实现图像的二维离散余弦反变换。调用格式为: B = idct2(A) B = idct2(A,[M N]) B = idct2(A,M,N)

式中参数同dct2。

此外,为了实现8×8子块的DCT图像变换还要用到MATLAB中的blkproc函数。将这个函数和函数dctmtx一起用于块处理可以大大简化运算。调用函数blkproc的格式为:

B=blkpro(A,[M,N],FUN,P1,P2,…)

其中,A表示原图像,[M,N]指定了大小为M×N的滑动邻域,FUN是对M×N的矩阵进行计算的函数,Pi是传递给FUN的附加参数。该函数自动实现图像块处理的整个过程。Blkproc把A分成M×N个块,对每个块调用参数为P1,P2,…的函数FUN,并重新将结果组合到输出图像B。

blkproc函数实现n×n矩阵的DCT变换和反变换。编程中可写成: Y=blkproc(F,[8 8],’P1*x*P2’,H,H’) 同样的道理,blkproc函数还用于量化和反量化。

显示误差直方图可能用到的MATLAB函数有: Max %找图像差最大值 [ ]=hist %用于生成直方图数据 Bar %显示图像差值直方图

以上函数用MATLAB的help查看具体使用方法。

图2.2.2显示了采用JPEG标准化矩阵进行DCT变换编码的结果。

图2.2.2 DCT变换编码

六、实验步骤:

DCT变换编码流程如下:


数据压缩实验指导书(4).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:Levis牛仔裤型介绍

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: