图像压缩与编码
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验项目3、图像压缩与编码
一、实验目的
(1)理解图像压缩编码的基本原理;
(2)掌握用程序代码实现DCT变换编码;
(3)掌握用程序代码实现游程编码。
二、实验原理及知识点
1、图像压缩编码
图像信号经过数字化后,数据量相当大,很难直接进行保存。为了提高信道利用率和在有限的信道容量下传输更多的图像信息,必须对图像进行压缩编码。
图像压缩技术标准一般可分为如下几种:JPEG压缩(JPEG Compression)、JPEG 2000
、H.26X标准(H.26X standards)以及MPEG标准(MPEG standards)。数字压缩技术的性能指标包括:压缩比、平均码字长度、编码效率、冗余度。
从信息论角度分,可以将图像的压缩编码方法分为无失真压缩编码和有限失真编码。前者主要包括Huffman编码、算术编码和游程编码;后者主要包括预测编码、变换编码和矢量量化编码以及运动检测和运动补偿技术。
图像数据压缩的目的是在满足一定图像质量的条件下,用尽可能少的比特数来表示原始图像,以提高图像传输的效率和减少图像存储的容量,在信息论中称为信源编码。图像压缩是通过删除图像数据中冗余的或者不必要的部分来减小图像数据量的技术,压缩过程就是编码过程,解压缩过程就是解码过程。
2、游程编码
某些图像特别是计算机生成的图像往往包含许多颜色相同的块,在这些块中,许多连续的扫描行或者同一扫描行上有许多连续的像素都具有相同的颜色值。在这些情况下就不需要存储每一个像素的颜色值,而是仅仅存储一个像素值以及具有相同颜色的像素数目,将这种编码方法称为游程(或行程)编码,连续的具有相同颜色值的所有像素构成一个行程。
在对图像数据进行编码时,沿一定方向排列的具有相同灰度值的像素可看成是连续符号,用字串代替这些连续符号,可大幅度减少数据量。游程编码记录方式有两种:①逐行记录每个游程的终点列号:②逐行记录每个游程的长度
3、DCT变换编码
变换编码是在变换域进行图像压缩的一种技术。图1显示了一个典型的变换编码系统。
图1 变换编码系统
在变换编码系统中,如果正变换采用DCT变换就称为DCT变换(离散余弦变换)编码系统。DCT用于把一幅图像映射为一组变换系数,然后对系数进行量化和编码。对于大多数的正常图像来说,多数系数具有较小的数值且可以被粗略地量化(或者完全抛弃),而产生的图像失真较小。
在MATLAB 仿真实现中, 主要是采用二维DCT变换的矩阵式定义来实现的,矩阵式定义可以表示为:
其中
是空间数据阵列,
是变换系数阵列,
是变换矩阵,
是
的转置。
从原理上讲可以对整幅图像进行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 -- filename
date -- modification date
bytes -- number of bytes allocated to the file
isdir -- 1 if name is a directory and 0 if not
datenum -- 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分块的像素进行处理