2_2---DCT变换

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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去高频分量的方法压缩图像是有损的,但是这并不怎么影响我们的观看。

相关文档
最新文档