2_2---DCT变换
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
DCT
离散余弦变换
求N个数的离散余弦变换,就是把这N个数延拓成2N的序列,再向右平移1 /2个单位,如果下图所示,这2N个元素的序列是基于原点对称的。求这个元素为2N的序列的DFT变换,就是所求的元素为N的序列的DCT变换。因为偶对称实数序列的DFT变换是实偶的函数,DCT变换后的表示比较简单。
DCT的优点:1 它变换的形式简单,相比于DFT会减少一半的计算;
2 它具有能量集中性,图片经过DCT变换后,有用信息主要集中于低频部分,基于这个原理,可以对图像进行压缩。
一维离散余弦变换的推导
推导N点长实序列的DCT,首先来定义一个新的长度为2N的序列:
可看作是将周期为N的序列x[m]做一个周期延拓成一个周期为2N的序列。如图1中第一张图。
再来看图1中第一张图是关于x = -1/2对称的,要让他关于x = 0对称需要将其向右平移1/2个单位,得到x’[m] = x’[m – 1/2]就是关于x = 0对称的周期序列了(如图1中第二张图)。
然后求这个2N序列的DFT:
就是DCT-2型离散余弦变换.从上面的过程也可以直接看出,离散余弦变换相当于一个长度大概是它两倍的离散傅里叶变换.
变换后的x[n]是以2N为周期,偶对称的序列: X[N+n] = X[N+n-2N] = X[n-N] = x[N-n]
定义变换矩阵C[n,m]:
求一下矩阵的DCT离散余弦就换
方法一:直接对这个矩阵进行DCT变换,如下程序
程序如下所示:
pic=imread('e:\test.jpg');
pic=rgb2gray(pic);
imshow(pic);
a=dct2(pic);
figure(2);
imshow(log(a),[]);
colormap(jet);
colorbar;
方法二:要求矩阵A的DCT变换,其中A是一个N*N的矩阵。先利用dctmtx(x);这个函数求出DCT变换矩阵B,则DCT(A)=B*A*B’;这是求DCT变换矩阵的第二种方法。
>> a=[1 2 3 4;2 3 4 5;3 4 5 6;4 5 6 7]
a =
1 2 3 4
2 3 4 5
3 4 5 6
4 5 6 7
>> b=dctmtx(4);
>> c=dct2(a);
>> d=b*a*b';
>> c
c =
16.0000 -4.4609 0 -0.3170
-4.4609 0 0 0
0 0 0 0
-0.3170 0 0 0
>> d
d =
16.0000 -4.4609 -0.0000 -0.3170
-4.4609 -0.0000 0.0000 0.0000
-0.0000 0.0000 -0.0000 -0.0000
-0.3170 0.0000 -0.0000 0.0000
从上面的程序中,可以看出,对一个矩阵A直接进行DCT变换和用DCT变换矩阵与矩阵A 通过运算的方式得到的DCT变换效果是一样的。
第二种方式与第一种方式相比有什么优点呢?
有些时候,我们需要对一个图像求好多次DCT变换。比如在对图像进行DCT压缩的时候,要把图像分成8*8的图像块,这样每个图像块都要进行一次DCT变换,如果每个DCT变换都要用第一种方式求,太浪费时间,通过DCT变换矩阵与原矩阵相乘运算的方式求解DCT 变换相对于直接求解原矩阵的DCT变换会节省时间。
关于DCT压缩图像的可行性
下面我用一个程序证明一下,DCT变换压缩图像大小的可行性。
pic=imread('e:\test2.jpg');
pic=rgb2gray(pic);
figure(1);
imshow(pic);
title('原始灰度图像');
a=dct2(pic);
figure(2);
imshow(log(a));
colormap(jet);
colorbar;
title('原始灰度图像的DCT变换图'); %a(abs(a)<50)=0; a(100:455,1:250)=0;
a(1:99,100:250)=0;
figure(4);
imshow(log(a));
colormap(jet);
colorbar;
title('滤波后的DCT变换图'); pic1=idct2(a);
figure(3);
imshow(pic1,[]);
title('重建的灰度图像');
程序运行的效果图如下所示:
下面的4幅图是程序运行的效果图:其中第一幅图是原始的图像。第二幅图是它的DCT变换图,它的左上角代表低频部分,我们知道在图像的大部分信息都包含在它的低频部分中。第三幅图我强制把它的低频部分留下来,高频的部分直接清0,把进行DCT逆变换,就得到了第四幅图,可以看到虽然有失真,但是基本上还原了图像的大部分信息。基于这个原理,我们可以对图像信息进行压缩。
为了加强压缩的效果,我们还可以在压缩时,先把图像分成几块,然后对这几块分别进行DCT变换,进行压缩,这样的效果更好。
DCT压缩图像的有效性
本实例实现了一个简单的压缩程序。
将图像的信息读入矩阵之后,把这个矩阵命名为A,把A矩阵分割成大小为8*8的小矩阵,对每一个矩阵进行DCT变换,得到矩阵B,再对矩阵B每8*8个数据块作为一个单乘下面的这个矩阵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]
得到一个矩阵C。此时矩阵C中存放的是图像经过压缩后的图像信息了,因为这个矩阵中,有好多的信息都被我们清0了。
将C矩阵以8*8的数据块为单位进行IDCT变换,就可以得到真正的图像信息了。如下所示:是几幅实验用图:
其中第一幅图是原图,第二幅图是压缩后重建的图像,大概一看,基本看不出两图的区别,但是放大之后,两图还是有一点区别的。用DCT去高频分量的方法压缩图像是有损的,但是这并不怎么影响我们的观看。