语言(如Basic,C,For-tran)编写的仿真程序来实现这一基于DCT的JPEG图像压缩编码算法则较为麻烦,而且仿真效果也不是十分理想.本文主要应用MATLAB7.0中发布的影像处理工具箱中的相关函数和命令来实现基于DCT的JPEG图像压缩编码理论算法的仿真.MATLAB7.0是一套功能十分强大的工程计算及数据分析应用软件,广泛应用于工业、电子、控制、信号及图像处理等各领域.MATLAB7.0本身除了提供强大的图形绘制和输出功能外,同时还发布了影像处理工具箱(Image Processing Toolbox),专门用于图像的处理.
3.1 基于DCT的JPEG图像压缩编码理论算法及MATLAB仿真基础
3.1.1 基于DCT的JPEG图像压缩编码算法的表述
在编码过程中,首先将输入图像分解为8×8大小的数据块,然后用正向二维DCT把每个块转变成64个DCT系数值,其中1个数值是直流(DC)系数,即8×8空域图像子块的平均值,其余的63个是交流(AC)系数,接下来对DCT系数进行量化,最后将变换得到的量化的DCT系数进行编码和传送,形成压缩后的图像格式。在解码过程中,先对已编码的量子化的DCT系数进行解码,然后求逆量化并把DCT系数转化为8×8样本像块(使用二维DCT反变换),最后将操作完成后的块组合成一个单一的图像.这样就完成了图像的压缩和解压过程。
3.1.2 结合MATLAB7.0仿真对上述算法的几点解释
1 离散余弦变换(DCT)定义
二维DCT的解析式定义可以由下式表示:
(3-1)
其中f(x,y)是空间域二维向量之元素,x,y=0,1,2,...,N-1,F(u,v)是变换系数阵列元素;式中表
示的阵列为N×N.
二维DCT反变换(IDCT)解析式定义可以表示为:
(3-2)
而在应用MATLAB仿真实现中,主要是在解析式定义基础上采用二维DCT变换的矩阵式定义来实现的,矩阵式定义可以表示为:
(3-3)
其中[f(x,y)]是空间数据阵列,[F(u,v)]是变换系数阵列,[A]是变换矩阵,[A]T是[A]的转置.
2 DCT系数的量化
系数量化是一个十分重要的过程,是造成DCT编解码信息损失(或失真)的根源.在JPEG压缩算法中采用均匀量化器,量化定义可以表述为:对64个DCT系数除以其量化步长,四舍五入取整,即
(3-4)
式中,Q(u,v)为量化的系数幅度,S(u,v)为量化步长,它是量化表的元素,通常随DCT系数的位置和彩色分量的不同而取不同的值,量化表的尺寸为8×8与64个DCT系数(一般将图像分解为8×8图像字块进行处理)一一对应.
量化的作用是在一定的主观保真度图像质量的前提下,丢掉那些对视觉影响不大的信息,以获得较高的压缩比.由于DCT系数包含了空间频率信息,可充分利用人眼对不同频率敏感程度不同这一特性来选择量化表中的元素值的大小.对视觉重要的系数采用细量化(量化步长较小),如低频系数被细量化,对高频系数采用粗量化(量化步长较大).对于上述这一点,从MATLAB仿真得到的DCT变换谱中得到证明.在整个MATLAB仿真实现中,由于处理的对象是黑白图像,所以只设置了亮度量化表.
3.2 MATLAB7.0仿真程序实现
3.2.1运行环境说明
CPU: 赛扬 2.73G HZ
内存: 1GB DDRAM
操作系统: Windows XP
运行软件: 官方正式版matlab7.0
3.2.2 程序流程图及实现
图3-1 JPEG仿真程序流程图
说明:JPEG压缩编码前,需要进行数据分块和颜色模式转化,先将原始图像数据变成一个个最小编码单元(MCU),再将原始图像数据按像素分成8×8的数据块。原始的RGB真彩色图像的一个像素用R、G、B等三基色来共同刻画,那么一个8×8像素数据块,可以得到3个8×8的三基色阵,记为R阵、G阵、B阵。颜色模式的转换将使原始图像的RGB颜色模式转换为JPEG图像需要的yCbC;颜色模式。本程序知识针对灰度图像进行处理。因此,就不再包括这部分的程序。
1 Dct变换部分
JPEG中DCT的输人是8×8的像素块,根据二维DCT可以分离成两个一维DCT的性质,首先进行8次行方向DCT变换,其结果得到一个临时矩阵,再对这个临时矩阵进行8次列方向DCT变换,即可得到8×8像素块经二维DCT之后的结果。
利用MATLAB工具箱中double函数转换数据为双精度型;
double函数的语法格式:B=double(A)
用rgb2gray函数转换RGB图像或颜色映像表为灰度图像;
rgb2gray函数的语法格式:I=rgb2gray(A),I= rgb2gray(RGB);
用blkproc函数把图像分成8*8像素块,然后用dct2函数对分块后的函数进行二维离散余弦变换。
Dct2函数的语法格式:B=dct(A),B=dct2(A,m,n),B=dct2(A,[m n])
2 量化部分
8×8的模块经过DCT变换后,其低频分量集中在左上角,高频分量集中在右下角。如何将高频分量去掉,这就要用到量化,它是产生信息损失的根源。这里的量化操作,就是将某一个值除以量化表中对应的值。由于量化表左上角的值较小,右上角的值较大,这样就起到了保持低频分量,抑制高频分量的目的。
3 "之"字型排序
经过DCT变换后,低频分量集中在左上角,其中F(0,0)(即第一行第一列元素)代表了直流(DC)系数,即8×8子块的平均值,要对它单独编码。由于两个相邻的8×8子块的DC系数相差很小,所以对它们采用差分编码DPCM,可以提高压缩比,也就是说对相邻的子块DC系数的差值进行编码。8×8的其它63个元素是交流(Ac)系数,采用行程编码。为了保证低频分量先出现,高频分量后出现,以增加行程中连续"0"的个数,量化后的系数要重新编排,这63个元素采用了"之"字型(Zig一Zag)的排列方法。
这一模块主要使用函数zzscan实现:
function zigzaged=zigzag(block);
zigzaged=zigzag(block);
Input: block为8*8的矩阵
Output: zigzaged为按ZigZag顺序扫描后1*64的一维矩阵
测试矩阵1,进行Zig-Zag扫描后的输出为zigzaged
block=[ 1 2 3 4 5 6 7 8;
9 10 11 12 13 14 15 16;
17 18 19 20 21 22 23 24;
25 26 27 28 29 30 31 32;
33 34 35 36 37 38 39 40;
41 42 43 44 45 46 47 48;
49 50 51 52 53 54 55 56;
57 58 59 60 61 62 63 64 ];
zigzaged=[1,2,9,17,10,3,4,11,18,25,33,26,19,12,5,6,13,20,27,34,41,49,42,35,28,21,14,7,...
8,15,22,29,36,43,50,57,58,51,44,37,30,23,16,24,31,38,45,52,59,60,53,46,39,32,...
40,47,54,61,62,55,48,56,63,64];
zigzaged=zigzag(reshape([1:64],8,8));
zzscan=[1,2,9,17,10,3,4,11,18,25,33,26,19,12,5,6,13,20,27,34,41,49,42,35,28,21,14,7,...
8,15,22,29,36,43,5
上一篇:
房屋租赁管理系统(word文档)
下一篇:
经典感言