210 likes | 474 Views
实验十 图像压缩的 MATLAB 实现. 一、实验目的. 了解有关数字图像压缩的基本概念,熟悉 MATLAB 软件中关于数字图像压缩的基本方法,掌握利用 MATLAB 软件进行数字图像压缩的方法。. 二、相关知识. 在当今的信息时代,图像在表达各种信息时有着不可替代的作用,但图像信息的缺点之一就是数据量非常庞大,因此,无论是存储还是传输,都需要对图像数据进行压缩,数据压缩的方法有很多,我们这里介绍一种基于 DCT (离散余弦变换)的图像压缩方法,并介绍用 MATLAB 软件来实现这个算法。 基于 DCT 的压缩方法如下:
E N D
一、实验目的 • 了解有关数字图像压缩的基本概念,熟悉MATLAB软件中关于数字图像压缩的基本方法,掌握利用MATLAB软件进行数字图像压缩的方法。
二、相关知识 • 在当今的信息时代,图像在表达各种信息时有着不可替代的作用,但图像信息的缺点之一就是数据量非常庞大,因此,无论是存储还是传输,都需要对图像数据进行压缩,数据压缩的方法有很多,我们这里介绍一种基于DCT(离散余弦变换)的图像压缩方法,并介绍用MATLAB软件来实现这个算法。 • 基于DCT的压缩方法如下: • (1)首先将输入图像分解为8×8或16×16的块,然后对每个块进行二维DCT变换,这里,一个N×N图像块f(x,y)的二维离散余弦变换公式如下:
二、相关知识 • 二维离散余弦反变换公式如下: • 基于DCT的压缩方法如下: • (1)首先将输入图像分解为8×8或16×16的块,然后对每个块进行二维DCT变换,这里,一个N×N图像块f(x,y)的二维离散余弦变换公式如下:
二维离散余弦反变换公式如下: • 其中:
在MATLAB中, • 称为DCT的变换核 • 其中:
在MATLAB中, • 称为DCT的变换核 • MATLAB图像处理工具箱提供了一些函数进行DCT变换。 • 函数dct2实现图像的二维离散余弦变换,格式为: • B=dct2(A) • B=dct2(A,[M,N]) • B=dct2(A,M,N)
A表示要变换的图像,B表示变换后得到的变换系数矩阵,B和A是同样大小的矩阵,其内容是余弦变换后的系数。A表示要变换的图像,B表示变换后得到的变换系数矩阵,B和A是同样大小的矩阵,其内容是余弦变换后的系数。 • M和N是可选参数,表示对图像矩阵A的填充或截取。 • 函数idct2实现图像的二维离散余弦反变换,语法变换。 • 函数dct2实现图像的二维离散余弦变换,格式为: • B=dct2(A) • B=dct2(A,[M,N]) • B=dct2(A,M,N)
A表示要变换的图像,B表示变换后得到的变换系数矩阵,B和A是同样大小的矩阵,其内容是余弦变换后的系数。A表示要变换的图像,B表示变换后得到的变换系数矩阵,B和A是同样大小的矩阵,其内容是余弦变换后的系数。 • M和N是可选参数,表示对图像矩阵A的填充或截取。 • 函数idct2实现图像的二维离散余弦反变换,语法格式: • B=idct2(A) • B=idct2(A,[M,N]) • B=idct2(A,M,N)
A表示要变换的二维离散余弦变换矩阵,B表示变换后得到的图像,B和A是同样大小的矩阵,其内容是余弦变换后的系数。A表示要变换的二维离散余弦变换矩阵,B表示变换后得到的图像,B和A是同样大小的矩阵,其内容是余弦变换后的系数。 • M和N是可选参数,表示对图像矩阵A的填充或截取。 • 函数dctmtx用于计算二维DCT矩阵,语法格式: • D=dctmtx(n) • 格式: • B=idct2(A) • B=idct2(A,[M,N]) • B=idct2(A,M,N)
A表示要变换的二维离散余弦变换矩阵,B表示变换后得到的图像,B和A是同样大小的矩阵,其内容是余弦变换后的系数。A表示要变换的二维离散余弦变换矩阵,B表示变换后得到的图像,B和A是同样大小的矩阵,其内容是余弦变换后的系数。 • M和N是可选参数,表示对图像矩阵A的填充或截取。 • 函数dctmtx用于计算二维DCT矩阵,语法格式: • D=dctmtx(n) • 其中D是返回的n×n的DCT变换矩阵,如果矩阵A的大小是n×n,D×A是矩阵每一列的DCT变换值,A×D’是A的每一行的DCT变换值。 • dct2(A)的结果与D×A×D’相同,但后者计算速度较快。 • (2)将变换后得到的量化的DCT系数进行编码和传送,形成压缩后的图像格式。
基于DCT的解压缩方法如下: • (1)对每个8×8或16×16块进行二维DCT反变换。 • (2)将反变换的矩阵的块合成一个单一的图像。 • 例:把输入图像cameraman.tif划分为8×8的图像块,计算它们的DCT系数,并且只保留64个DCT系数中的10个,然后对每个图像块利用这10个系数进其中D是返回的n×n的DCT变换矩阵,如果矩阵A的大小是n×n,D×A是矩阵每一列的DCT变换值,A×D’是A的每一行的DCT变换值。 • dct2(A)的结果与D×A×D’相同,但后者计算速度较快。 • (2)将变换后得到的量化的DCT系数进行编码和传送,形成压缩后的图像格式。
基于DCT的解压缩方法如下: • (1)对每个8×8或16×16块进行二维DCT反变换。 • (2)将反变换的矩阵的块合成一个单一的图像。 • 例:把输入图像cameraman.tif划分为8×8的图像块,计算它们的DCT系数,并且只保留64个DCT系数中的10个,然后对每个图像块利用这10个系数进行逆DCT变换来重构图像。 • 解:程序如下: • clear • I=imread('cameraman.tif'); • I=im2double(I);
T=dctmtx(8); • B=blkproc(I,[8 8],'P1*x*P2',T,T'); %这里T,T'是参数P1、P2的取值 • mask=[1 1 1 1 0 0 0 0 • 1 1 1 0 0 0 0 0 • 1 1 0 0 0 0 0 0 • 行逆DCT变换来重构图像。 • 解:程序如下: • clear • I=imread('cameraman.tif'); • I=im2double(I);
T=dctmtx(8); • B=blkproc(I,[8 8],'P1*x*P2',T,T'); %这里T,T'是参数P1、P2的取值 • mask=[1 1 1 1 0 0 0 0 • 1 1 1 0 0 0 0 0 • 1 1 0 0 0 0 0 0 • 1 0 0 0 0 0 0 0 • 0 0 0 0 0 0 0 0 • 0 0 0 0 0 0 0 0 • 0 0 0 0 0 0 0 0 • 0 0 0 0 0 0 0 0];
B2=blkproc(B,[8 8],'P1.*x',mask); • %这里mask是参数P1的取值 • % 这里可以对B2作进一步的处理,然后加以存储,解码时先读出存储的数据,然后恢复出B2. • I2=blkproc(B2,[8 8],'P1*x*P2',T',T); • 1 0 0 0 0 0 0 0 • 0 0 0 0 0 0 0 0 • 0 0 0 0 0 0 0 0 • 0 0 0 0 0 0 0 0 • 0 0 0 0 0 0 0 0];
B2=blkproc(B,[8 8],'P1.*x',mask); • %这里mask是参数P1的取值 • % 这里可以对B2作进一步的处理,然后加以存储,解码时先读出存储的数据,然后恢复出B2. • I2=blkproc(B2,[8 8],'P1*x*P2',T',T); • subplot(1,2,1); • imshow(I);title('原图'); • subplot(1,2,2); • imshow(I2);title('解压缩图');
subplot(1,2,1); • imshow(I);title('原图'); • subplot(1,2,2); • imshow(I2);title('解压缩图');
原图 解压缩图 • 虽然我们舍弃了85%的DCT系数,也就是减少了85%的存储量,但可以看到,解压缩图仍然清晰。在我们现在的实验中,没有进行真正的存储,这部分需要一些其它的函数配合工作,留待以后进一步完善。
三、实验内容 • 1.分别对图像“lenna.tif”、“board.tif”、“peppers.png”进行基于DCT的压缩操作,对每幅图像,分别给出保留1个、2个、3个、…、20个DCT变换系数的解压缩结果,这可以通过调整矩阵mask中1的个数实现,你认为保留几个系数时,图像的恢复效果可以接受,通过观察,对三个图像, • 原图 解压缩图 • 虽然我们舍弃了85%的DCT系数,也就是减少了85%的存储量,但可以看到,解压缩图仍然清晰。在我们现在的实验中,没有进行真正的存储,这部分需要一些其它的函数配合工作,留待以后进一步完善。
三、实验内容 • 1.分别对图像“lenna.tif”、“board.tif”、“peppers.png”进行基于DCT的压缩操作,对每幅图像,分别给出保留1个、2个、3个、…、20个DCT变换系数的解压缩结果,这可以通过调整矩阵mask中1的个数实现,你认为保留几个系数时,图像的恢复效果可以接受,通过观察,对三个图像,分别给出你的结论。 • 2.完成实验报告,报告中只需要指明程序名,不需要程序和图,只要写明你的结论即可。