8.离散余弦变换

更多MATLAB图像处理视频请点击  http://study.163.com/course/courseMain.htm?courseId=1003594013

在 MATLAB 图像处理工具箱中,dct2 函数用于计算图像的二维离散余弦变换(DiscreteCosine Transform)简称 DCT。大多数情况下,DCT 用于压缩图像,JPEG 图像格式就采用了DCT 算法。

更多MATLAB图像处理视频请点击  http://study.163.com/course/courseMain.htm?courseId=1003594013

1.离散余弦变换的基本概念

假设矩阵 A 的大小为 M×N,其二维离散余弦变换的定义为,

其中 B pq 称为矩阵 A 的 DCT 系数。在 MATLAB 中,矩阵的下标从 1 开始而不是从 0 开始,所以 A(1,1)和 B(1,1)分别代表上面的 A 00 和 B 00 。


DCT 是一种可逆变换,它的逆变换定义为:



MATLAB 图像处理工具箱提供的 DCT 函数有 3 个,分别是 dct2、dctmtx 和 idct2。

(1)dct2

dct2 函数采用基于 FFT 的算法,主要用于实现较大输入矩阵的离散余弦变换。其语法格式为:
B = dct2(A)
B = dct2(A,m,n)
B = dct2(A,[m n])

B=dct2(A)返回图像 A 的二维离散余弦变换值,它的大小与 A 相同,且各元素为离散余弦变换的系数 B(kl,k2)。
B = dct2(A,m,n)或 B = dct2(A,[m n])表示在对图像 A 进行二维离散余弦变换之前,先将图像 A 补零至 m×n。如果 m 和 n 比图像 A 小,则进行变换之前,将图像 A 进行剪切。


(2)dctmtx

  dctmtx 函数主要用于实现较小输入矩阵的离散余弦变换。其语法格式为:
  D = dctmtx(M)
  D = dctmtx(M)返回 M×M 大小的 DCT 矩阵。其形式为


(3)idct2

       idct2函数可以实现图像的二维逆离散余弦变换,其语法格式为:

        B = idct2(A)
        B = idct2(A,m,n)
        B = idct2(A,[m n])
        B = idct2(A)计算矩阵 A 的二维逆离散余弦变换,返回图像 B 的大小与 A 相同。
        B=idct2(A,m,n)或 H=idct2(A, [m n])表示在对矩阵 A 进行二维逆离散余弦变换之前,先将矩阵 A 补零至 m×n。如果 m 和 n 比矩阵 A 小,则进行变换之前,先对矩阵 A 进行   剪切操作,返回图像大小为 m×n。

例:

面的例子将如图 4-13 所示的一幅图像进行离散余弦变换,可以注意到图像能量的绝大
部分位于变换矩阵的左上角,结果如图 所示。然后,将 DCT 变换值小于 10 的系数设为0,然后利用 idct2 函数重构图像,其结果如图所示。

RGB = imread('autumn.tif');
I = rgb2gray(RGB);
J = dct2(I);
imshow(log(abs(J)),[]), colormap(jet(64)), colorbar,title('执行DCT的结果');
J(abs(J) < 10) = 0;
K = idct2(J);
figure,imshow(I),title('原图');
figure,imshow(K,[0 255]),title('对压缩图像重构后的结果');




2、离散余弦变换函数的应用

        在 JPEG 图像压缩算法中,图像常被分成 8×8 或 16×16 的图像块,然后对每个图像块进行离散余弦变换,对变换结果进行量化、编码及传输。在接收端,量化的 DCT 系数被解码,并用来计算每个图像块的逆离散余弦变换,最后把各图像块拼接起来构成一幅图像。对一幅典型的图像而言,许多 DCT 的系数近似为 0,把它们去掉并不会明显影响重构图像的质量。

      正如前面介绍的,实现 DCT 的方法有两种,而利用函数 dctmtx 的方法可以比较快速地解决 JPEG 图像压缩问题。下面举一个图像压缩的例子。

    在该例中,将输入图像划分成 8×8 的图像块,计算它们的 DCT 系数,并只保留 64 个系数中的 10 个,然后利用这 10 个系数对每个图像块实现逆 DCT 来重构图像,

 I = imread('cameraman.tif');
I = im2double(I);%图像数据类型转换为double类型
T = dctmtx(8); %产生 DCT 变换矩阵
B = blkproc(I,[8 8],'P1*x*P2',T,T');  %计算二维 DCT
%P1*x*P2相当于像素块的处理函数
%,p1=T p2=T’,进行离散余弦变换 其中T为dctmtx(n)函数得到的DCT变换矩阵
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];
%二值掩模,用来压缩 DCT 的系数
B2 = blkproc(B,[8 8],'P1.*x',mask);
%只保留 DCT 的 10 个系数
I2 = blkproc(B2,[8 8],'P1*x*P2',T',T);
%逆 DCT,用来重构图像
imshow(I),title('原图');
figure,imshow(I2),title('压缩后重构图像');

更多MATLAB图像处理视频请点击  http://study.163.com/course/courseMain.htm?courseId=1003594013

原创文章 100 获赞 339 访问量 56万+

猜你喜欢

转载自blog.csdn.net/MATLAB_matlab/article/details/54090820