步骤1:设置JPEG标准化数组; 步骤2:求8×8快的DCT变换矩阵; 步骤3: 计算8×8快的DCT变换; 步骤4:对DCT系数量化和反量化; 步骤5:求反量化系数的逆DCT变换;
步骤6:重新显示重建图像、误差图像和误差图像的直方图。 量化时可采用JPEG标准推荐的归一化数组,如表2.2.1所示。
表2.2.1 JPEG标准化数组
16 12 14 14 18 24 49 72 11 12 13 17 22 35 64 92 10 14 16 22 37 55 78 95 16 19 24 29 56 64 87 98 24 26 40 51 68 81 103 112 40 58 57 87 109 104 121 100 51 60 69 80 103 113 120 103 61 55 56 62 77 92 101 99 七、思考题目: (1)观察图像8×8子块的DCT系数的分布,并分析其特点。
(2)将量化步长分别增大为初始值的2倍、4倍、8倍后再进行DCT变换编码,显示不同量化步长条件下的重建图像、误差图像以及误差图像的直方图。分析重建图像质量和量化步长的关系。
八、实验程序代码:
function y=dctcoder(x,quality) m=[16 11 10 16 24 40 51 61 12 12 14 19 26 58 60 55 14 13 16 24 40 57 69 56 14 17 22 29 51 87 80 62 18 22 37 56 68 109 103 77 24 35 55 64 81 104 113 92 49 64 78 87 103 121 120 101 72 92 95 98 112 100 103 99]*quality;
[xm,xn]=size(x); xx=x; x=double(x); t=dctmtx(8);
y1=blkproc(x,[8 8],'P1*x*P2',t,t');üT y2=blkproc(y1,[8 8],'round(x./P1)',m);%Q y3=blkproc(y2,[8 8],'x.*P1',m);%IQ y=blkproc(y3,[8 8],'P1*x*P2',t',t);%IDCT subplot(2,2,1);imshow(xx);title('原始图像');
subplot(2,2,2);imshow(mat2gray(y));title('重建图像');%reconstruted image d=x-y;%original-reconstruted
subplot(2,2,3);imshow(mat2gray(d));title('误差图像'); [h,k]=hist(d(:),512);
subplot(2,2,4);bar(k,h,'k');title('误差图像直方图');
实验五 图像小波变换编码与压缩
一、实验题目:
图像小波变换编码与压缩
二、实验目的:
掌握图像压缩编码的原理,熟悉小波变换的基本知识,了解嵌入零数小波编
码原理,并应用MATLAB编程实现嵌入零数小波编、解码程序。
三、实验内容:
(1)对图像进行小波分解求取小波系数; (2)编程实现嵌入零数小波的编码程序; (3)编程实现嵌入零数小波的解码程序。
四、预备知识:
(1)熟悉图像读写和显示; (2)理解图像压缩编码的原理; (3)理解小波变换的原理;
(4)理解嵌入零数小波编码原理。
五、实验原理:
随着多媒体和网络技术的迅猛发展,人们对基于网络的图像传输、浏览和检
索等应用提出了愈来愈广泛的需求,研究具有高效的压缩能力、支持用户个性化浏览并适合网络渐进传输的图像编码方法已成为目前静态图像编码领域的研究热点。
在大量的图像编码方法中,Shapiro提出的嵌入式零树小波编码算法
(Embedded Zerotree Wavelet encoder ,简称EZW编码)是公认的效率最高的图像渐进式编码(progressive encoding)方法之一, 这种算法得到的比特流中的比特按其重要性排序。使用这种算法,编码者能够在任一点结束编码,允许精确到任一个目标比特率或目标失真率。
(1)嵌入零数小波编码算法原理 ①内嵌编码(Embedded Coding)
内嵌编码就是编码器将待编码的比特流按重要性的不同进行排序,根据目标
码率或失真度大小要求随时结束编码;同样,对于给定码流解码器也能够随时结束解码,并可以得到相应码流截断处的目标码率的恢复图像。内嵌编码的次序是从最重要的位(最高位)到最不重要的位(最低位)逐个发送,直到达到所需码率时停止。
内嵌编码的输出信息主要包括两部分:排序信息和重要像素的位信息。位信
息是编码必不可少的有效信息;排序信息是辅助信息,按其重要性从左到右排列,反映了重要像素在原图上的空间位置,用于恢复原始的数据结构。
一幅图像经过三级小波分解后形成了10个子带,如图7-1所示。小波系数的
分布特点是越往低频子带系数值越大,包含的图像信息越多,对视觉比较重要,如图7-1中的LL3子带。越往高频子带系数值越小,包含的图像信息越少,对视觉来说不太重要。这样对相同数值的系数选择先传较低频的系数的重要比特,后传较高频系数的重要比特。正是由于小波系数具有这些特点,它非常适合于嵌入式图像的编码算法。在JPEG2000标准中以小波变换作为图像编码的变换方法。
图2.7.1 小波系数间的父子关系
②几个基本概念
一幅原始图像经过变换后得到的是空间分布的小波系数,引入字符来表示每一个小波系数状态,这样更有利于将来的量化和熵编码。
零数根(ZTR):在本次量化中,该小波系数的幅值小于给定的阈值T,并且它的子孙后代中任何一个的幅值都比T小。与此同时,还要求该系数的父节点系数的幅值大于T;
负大系数(NEG):在本次量化中,该小波系数的幅值大于给定的阈值T。但是,它的最高位为1,即它实际的值是一个负数;
正大系数(POS):在本次量化中,该小波系数的幅值大于给定的阈值T。并且,它的最高位为0,即它实际的值是一个正数;
孤独零(IZ):在本次量化中,该小波系数的幅值小于给定阈值T。但是,它的子孙后代中至少存在一个系数的幅值大于T,即该小波系数的子孙后代中存在有大系数(无论正负)。与此同时,该系数的父节点的幅值可以为任意值。
零数,在某一量化级中它的任何一个节点都不是大系数,其中,最上层的那个系数就是零数根。
EZW算法利用小波系数的特点较好的实现了图像编码的嵌入功能,主要包括:零数预测、用零数结构编码重要图和逐次逼近量化。
③零数预测
一幅经过小波变换的图像按其频带从低到高形成一个树状结构,树根是最低频子带的节点,它有3个孩子分别位于3个次低频子带的相应位置,其余子带(最高频子带除外)的节点都有4个孩子位于高一级子带的相应位置(由于高频子带
分辨率增加,所以一个低频子带节点对应有四个高频子带节点,即相邻的2×2矩阵)。这样图2.7.1所示的三级小波分解就形成了深度为4的树。
定义一个零树的数据结构:一个小波系数x,对于一个给定的门限T,如果|x| ④用零树结构编码重要图 重要图包括3种要素:重要系数、孤立零和零树根。其中,对于一个给定的阈值T,如果系数x本身和它的所有子孙都小于T,则该点就称为零树根;如果系数本身小于T,但其子孙至少有一个大于或等于T,则该点就称为孤立零点。在编码时分别用三种符号与之对应。当编码到最高分辨率层的系数时,由于它们没有子孙,零树根不再存在,只需其余两种符号即可。为了有利于内嵌编码,将重要系数的符号与重要图一起编码,这样就要使用四种符号:零树根、孤立零、正重要系数、负重要系数。 ⑤逐次逼近量化(SAQ: Successive-Approximation Quantization) 内嵌编码的核心在于采用了逐次逼近的量化方法(SAQ)。SAQ按顺序使用了一系列阈值T0,T1,…,TN-1来判断重要性,其中,Ti=Ti-1/2,初始阈值T0按如下条件选择,|Xj|<2T0,其中Xj表示所有变换系数。 在编(译)码过程中,始终保持着两个分离的列表:主表和辅表。主表对应于编码中的不重要的集合或系数,其输出信息起到了恢复各重要值的空间位置结构的作用,而辅表是编码的有效信息,输出为各重要系数的二进制值。 编码分为主、辅两个过程:在主过程中,设定阈值为Ti,按上述原理对主表进行扫描编码,若是重要系数,则将其幅值加入辅表中,然后将该系数在数组中置为零,这样当阈值减小时,该系数不会影响新零树的出现;在辅过程中,对辅表中的重要系数进行细化,细化过程类似于比特平面编码。扫描顺序对最终的压缩结果会有些许影响,目前提出的扫描顺序有好几种,比较常见的有如图2.7.3所示的两种。