实验项目3、图像压缩与编码一、实验目的(1)理解图像压缩编码的基本原理;(2)掌握用程序代码实现DCT变换编码;(3)掌握用程序代码实现游程编码。
二、实验原理及知识点1、图像压缩编码图像信号经过数字化后,数据量相当大,很难直接进行保存。
为了提高信道利用率和在有限的信道容量下传输更多的图像信息,必须对图像进行压缩编码。
图像压缩技术标准一般可分为如下几种:JPEG压缩(JPEG Compression)、JPEG 2000 、H.26X标准(H.26X standards)以及MPEG标准(MPEG standards)。
数字压缩技术的性能指标包括:压缩比、平均码字长度、编码效率、冗余度。
从信息论角度分,可以将图像的压缩编码方法分为无失真压缩编码和有限失真编码。
前者主要包括Huffman编码、算术编码和游程编码;后者主要包括预测编码、变换编码和矢量量化编码以及运动检测和运动补偿技术。
图像数据压缩的目的是在满足一定图像质量的条件下,用尽可能少的比特数来表示原始图像,以提高图像传输的效率和减少图像存储的容量,在信息论中称为信源编码。
图像压缩是通过删除图像数据中冗余的或者不必要的部分来减小图像数据量的技术,压缩过程就是编码过程,解压缩过程就是解码过程。
2、游程编码某些图像特别是计算机生成的图像往往包含许多颜色相同的块,在这些块中,许多连续的扫描行或者同一扫描行上有许多连续的像素都具有相同的颜色值。
在这些情况下就不需要存储每一个像素的颜色值,而是仅仅存储一个像素值以及具有相同颜色的像素数目,将这种编码方法称为游程(或行程)编码,连续的具有相同颜色值的所有像素构成一个行程。
在对图像数据进行编码时,沿一定方向排列的具有相同灰度值的像素可看成是连续符号,用字串代替这些连续符号,可大幅度减少数据量。
游程编码记录方式有两种:①逐行记录每个游程的终点列号:②逐行记录每个游程的长度3、DCT变换编码变换编码是在变换域进行图像压缩的一种技术。
图1显示了一个典型的变换编码系统。
压缩图像输入图像N×N图1 变换编码系统在变换编码系统中,如果正变换采用DCT变换就称为DCT变换(离散余弦变换)编码系统。
DCT用于把一幅图像映射为一组变换系数,然后对系数进行量化和编码。
对于大多数的正常图像来说,多数系数具有较小的数值且可以被粗略地量化(或者完全抛弃),而产生的图像失真较小。
在MATLAB 仿真实现中, 主要是采用二维DCT 变换的矩阵式定义来实现的,矩阵式定义可以表示为:[][][][][][][][](,)(,),(,)(,)T T F u v A F u v A f x y A f x y A == 其中(,)f x y 是空间数据阵列, (,)F u v 是变换系数阵列, []A 是变换矩阵, []T A是[]A 的转置 。
从原理上讲可以对整幅图像进行DCT 变换,但由于图像各部位上细节的丰富程度不同,这种整体处理的方式效果不好。
由于图像可看成二维数据矩阵,所以在图像编码中多采用二维正交变换方式,然而其正交变换的计算量太大,所以在实用中变换编码并不是对整幅图像进行变换和编码,而是将图像分成若干个n ×n 的子图像分别处理。
这是因为小块图像的变换计算比较容易,而且距离较远的像素之间的相关性比距离较近的像素之间的相关性要小。
因此,发送者首先将输入图像分解为8*8或16*16块,然后再对每个图像块进行二维DCT 变换,接着再对DCT 系数进行量化、编码和传输;接收者通过对量化的DCT 系数进行解码,并对每个图像块进行的二维DCT 反变换。
最后将操作完成后所有的块拼接起来构成一幅单一的图像。
对于一般的图像而言,大多数DCT 系数值都接近于0,所以去掉这些系数不会对重建图像的质量产生较大影响。
因此,利用DCT 进行图像压缩确实可以节约大量的存储空间。
DCT 变换后变换域的能量主要集中在低频分量附近(即左上角)。
图像压缩中的DCT 编码正是利用DCT 变换的这一特性,在对二维图像进行DCT 变换后,只对变换域低频分量进行编码,抛弃部分高频分量,减少携带的信息量,从而实现对图像的有损压缩编码。
在编码过程中,首先将输入图像分解为n ×n 大小的数据块,然后用正向二维DCT 把每个块转变成n ×n 个DCT 系数值,其中左上角第一个数值是直流(DC)系数,即n ×n 空域图像子块的平均值,其余的n ×n-1个是交流(AC)系数,接下来对DCT 系数进行量化,最后将变换得到的量化的DCT 系数进行编码和传送,这样就完成了图像的压缩过程。
在解码过程中,形成压缩后的图像格式,先对已编码的量子化的DCT 系数进行解码,然后求逆量化并把DCT 系数转化为n ×n 样本像块(使用二维DCT 反变换),最后将操作完成后的块组合成一个单一的图像。
这样就完成了图像的解压过程。
4、相关函数介绍(1)imwrite(A,‘filename ’,‘fmt ’)A 是图像数据, filename 是目标图像名字, fmt 是要生成的图片的格式。
图像格式有:bmp 、gif 、jpg (或jpeg )或png 、tif (或tiff )等等。
各种格式支持的图像位数不一样。
(2)dir 函数Matlab 使用dir 函数获得指定文件夹下的所有子文件夹和文件,并存放在在一种为文件结构体数组中.dir 函数可以有调用方式:dir(".") 列出当前目录下所有子文件夹和文件dir("G:\Matlab") 列出指定目录下所有子文件夹和文件dir("*.m") 列出当前目录下符合正则表达式的文件夹和文件得到的为结构体数组每个元素都是如下形式的结构体:name -- filenamedate -- modification datebytes -- number of bytes allocated to the fileisdir -- 1 if name is a directory and 0 if notdatenum -- modification date as a MATLAB serial date number分别为文件名,修改日期,大小,是否为目录,Matlab特定的修改日期。
(3)dctmtx 函数D = dctmtx(N);式中,D是返回N×N的DCT变换矩阵,如果矩阵A是N×N方阵,则A的DCT变换可用D×A×D’来计算。
使用由dctmtx函数返回的DCT变换矩阵,这种方法较适合于较小的输入方阵(例如8×8或16×16)。
(4) blkproc函数为了实现8×8子块的DCT图像变换还要用到MATLAB中的blkproc函数。
将这个函数和函数dctmtx一起用于块处理可以大大简化运算。
其调用形式:B = blkproc(A,[m n],fun, parameter1, parameter2, ...)参数解释:[m n] :图像以m*n为分块单位,对图像进行处理(如8像素*8像素)Fun:应用此函数对分别对每个m*n分块的像素进行处理parameter1, parameter2:要传给fun函数的参数该函数自动实现图像块处理的整个过程。
Blkproc把A分成m*n个块,对每个块调用参数为parameter1, parameter2, ...的函数fun,并重新将结果组合到输出图像B。
这里:fun='P1*x*P2',fun的参数P1,P2,将T,T'传递给fun的参数,即:P1= T,P2=T'.(5)B = repmat(A,m,n)复制和平铺矩阵将矩阵 A 复制m×n 块,即把A 作为 B 的元素,B 由m×n 个 A 平铺而成。
B 的维数是[size(A,1)*m, (size(A,2)*n] ,size(a,1)求矩阵的行数size(a,2)求矩阵的列数,size(a)同时求矩阵的行和列数。
>> A=[1 2 3;4 5 6;7 8 9]A =1 2 34 5 67 8 9>> B = repmat(A,2,3)B =1 2 3 1 2 3 1 2 34 5 6 4 5 6 4 5 67 8 9 7 8 9 7 8 91 2 3 1 2 3 1 2 34 5 6 4 5 6 4 5 67 8 9 7 8 9 7 8 9三、实验内容及步骤(1)将图像集中的“lena.bmp”以jpeg压缩格式存储为“lenal.jpg”,要求在图一中分别显示压缩前后的图像,并计算压缩比;(2)采用DCT压缩解压一幅图像,要求在图二中分别显示压缩解压前后的图像;(3)用游程编码对图像“cameraman.tif”进行编码,并在图三中分别显示原图像、经游程编码解码后的图像以上3个任务要求用一个M文件实现,文件命名为“学号+try3”,每个任务各自输出到一张图片中,按顺序编号,并将每个子图片命名,命名规则样例“(3)经游程编码解码后的图像”。
四、考核要点1、熟悉图像压缩编码的意义和方法。
2、掌握在MATLAB中如何通过游程编码和DCT变换编码来实现图像的压缩编码,熟悉相关的处理函数。
五、实验仪器与软件(1)PC计算机(2)MatLab软件/语言包括图像处理工具箱(Image Processing Toolbox)(3)实验所需要的图片六、实验报告要求(1)描述实验的基本步骤,用数据和图片给出各个步骤中取得的实验结果和源代码,并进行必要的讨论,必须包括原始图像及其计算/处理后的图像。
用数据和图片给出各个步骤中取得的实验结果并进行必要的讨论。
(2)给出原始图像及其计算处理后的图像以及相应的解释。
七、思考题分析和比较游程编码和DCT变换编码两种方法。
八、实验图像Fig.1 cameraman.tif Fig.2 lena.bmp Fig.3 lenal.jpg。