转自:http://blog.csdn.net/ahafg/article/details/48808443
DCT变换
DCT又称离散余弦变换,是一种块变换方式,只使用余弦函数来表达信号,与傅里叶变换紧密相关。常用于图像数据的压缩,通过将图像分成大小相等(一般为8*8)的块,利用DCT对其进行变换,得到更加简洁的数据。因为图像像素间存在较大的空间相关性,DCT可以大大减小这些相关性,使图像能量集中在左上角区域,从而利于数据压缩。变换后得到的数据称为DCT系数。这一过程是无损的。
二维DCT变换
这里来看看二维DCT变换的公式:
c(u)和c(v)为添加的系数,主要作用为使DCT变换矩阵为正交矩阵。F(u,v)即为DCT变换系数,可以通过矩阵形式来表示:
A即为正交矩阵,通过F和A逆变换即可恢复图像数据。
下面通过一个例子来说明:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
由结果可以看出,D,D1方式得到的DCT系数相同,说明矩阵形式的DCT变换公式是正确的,D2的数据与原数据I相同,实现了数据恢复。
另外通过运行函数dctmtx(4)可以发现得到的变换矩阵与A完全相同。
Matlab 函数实现
matlab实现离散余弦变换有两种方法:
- 一种为函数dct2( ), 使用函数dct2,该函数用一个基于FFT的算法来提高当输入较大的方阵时的计算速度。
- 另一种为函数dctmtx( ), 使用由dctmtx函数返回的DCT变换矩阵,这种方法较适合于较小的输入方阵(例如8×8或16×16)。
1. 函数:dct2( )
实现图像的二维离散余弦变换。调用格式为:
B = dct2(A)
B = dct2(A,[M N])
B = dct2(A,M,N)
式中A表示要变换的图像,M和N是可选参数,表示填充后的图像矩阵大小,B表示变换后得到的图像矩阵。其逆变换函数为idct2( );
代码如下:
- 1
- 2
- 3
- 4
- 5
在这里可以通过函数colormap查看变换系数D。利用不同灰度值,可以发现D中主要数据都分布在左上角。
- 1
- 2
- 3
2. 函数:dctmtx( )
D = dctmtx(N)
式中D是返回N×N的DCT变换矩阵,如果矩阵A是N×N方阵,则A的DCT变换可用D×A×D’来计算。这在有时比dct2计算快,特别是对于A很大的情况。上面有提到过。
对于图像的DCT变换,这里还需用到一个函数blkproc( ),其功能为对图像分块进行DCT变换。
blkproc( )定义如下:
B = blkproc(A,[M N],Fun) ,A为输入图像,M*N为块大小,Fun为处理函数
常用的方式为:
B = blkproc(A,[8,8],’P1*x*P2’,T,T’); T为变换矩阵,P1和P2为参数,代表T*x*T’ 。
下面为应用例子:
- 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
上面代码中,通过求得图像DCT系数,利用mask等矩阵对其进行量化,保留左上角主要的系数值,对于右下角的值由于其为非常小的高频系数,量化去除后对于图像的质量影响不大,可以利用这一性质对图像进行压缩处理。
保留系数越多则图像压缩质量越好,下面比较几幅图像质量,从左到右分别为原图,mask1,mask2,mask3;
可以看到系数保留越少,则图像质量越差。
DCT变换这次就讲到这了。