一、引言

DCT变换的全称是离散余弦变换(Discrete Cosine Transform),主要用于将数据或图像的压缩,能够将空域的信号转换到频域上,具有良好的去相关性的性能。DCT变换本身是无损的,但是在图像编码等领域给接下来的量化、哈弗曼编码等创造了很好的条件,同时,由于DCT变换时对称的,所以,我们可以在量化编码后利用DCT反变换,在接收端恢复原始的图像信息。DCT变换在当前的图像分析已经压缩领域有着极为广大的用途,我们常见的JPEG静态图像编码以及MJPEG、MPEG动态编码等标准中都使用了DCT变换。


二、一维DCT变换

一维DCT变换时二维DCT变换的基础,所以我们先来讨论下一维DCT变换。一维DCT变换共有8种形式,其中最常用的是第二种形式,由于其运算简单、适用范围广。我们在这里只讨论这种形式,其表达式如下:

其中,f(i)为原始的信号,F(u)是DCT变换后的系数,N为原始信号的点数,c(u)可以认为是一个补偿系数,可以使DCT变换矩阵为正交矩阵。


三、二维DCT变换

二维DCT变换其实是在一维DCT变换的基础上在做了一次DCT变换,其公式如下:

由公式我们可以看出,上面只讨论了二维图像数据为方阵的情况,在实际应用中,如果不是方阵的数据一般都是补齐之后再做变换的,重构之后可以去掉补齐的部分,得到原始的图像信息,这个尝试一下,应该比较容易理解。

另外,由于DCT变换高度的对称性,在使用Matlab进行相关的运算时,我们可以使用更简单的矩阵处理方式:

接下来利用Matlab对这个过程进行仿真处理:

 1 clear;
2 clc;
3 X=round(rand(4)*100) %产生随机矩阵
4 A=zeros(4);
5 for i=0:3
6 for j=0:3
7 if i==0
8 a=sqrt(1/4);
9 else
10 a=sqrt(2/4);
11 end
12 A(i+1,j+1)=a*cos(pi*(j+0.5)*i/4);
13 end
14 end
15 Y=A*X*A' %DCT变换
16 YY=dct2(X) %Matlab自带的dct变换

运行结果为:

 1 X =
2
3 42 66 68 66
4 92 4 76 17
5 79 85 74 71
6 96 93 39 3
7
8
9 Y =
10
11 242.7500 48.4317 -9.7500 23.5052
12 -12.6428 -54.0659 7.4278 22.7950
13 -6.2500 10.7158 -19.7500 -38.8046
14 40.6852 -38.7050 -11.4653 -45.9341
15
16
17 YY =
18
19 242.7500 48.4317 -9.7500 23.5052
20 -12.6428 -54.0659 7.4278 22.7950
21 -6.2500 10.7158 -19.7500 -38.8046
22 40.6852 -38.7050 -11.4653 -45.9341

由上面的结果我们可以看出,我们采用的公式的方法和Matlab自带的dct变化方法结果是一致的,所以验证了我们方法的正确性。

如果原始信号是图像等相关性较大的数据的时候,我们可以发现在变换之后,系数较大的集中在左上角,而右下角的几乎都是0,其中左上角的是低频分量,右下角的是高频分量,低频系数体现的是图像中目标的轮廓和灰度分布特性,高频系数体现的是目标形状的细节信息。DCT变换之后,能量主要集中在低频分量处,这也是DCT变换去相关性的一个体现。

之后在量化和编码阶段,我们可以采用“Z”字形编码,这样就可以得到大量的连续的0,这大大简化了编码的过程。


四、二维DCT反变换

在图像的接收端,根据DCT变化的可逆性,我们可以通过DCT反变换恢复出原始的图像信息,其公式如下:

同样的道理,我们利用之前的矩阵运算公司可以推导出DCT反变换相应的矩阵形式:

下面我们用Matlab对这个过程进行仿真:

 1 clear;
2 clc;
3 X=[
4 61 19 50 20
5 82 26 61 45
6 89 90 82 43
7 93 59 53 97] %原始的数据
8 A=zeros(4);
9 for i=0:3
10 for j=0:3
11 if i==0
12 a=sqrt(1/4);
13 else
14 a=sqrt(2/4);
15 end
16 A(i+1,j+1)=a*cos(pi*(j+0.5)*i/4); %生成变换矩阵
17 end
18 end
19 Y=A*X*A' %DCT变换后的矩阵
20 X1=A'*Y*A %DCT反变换恢复的矩阵

运行结果为:

 1 X =
2
3 61 19 50 20
4 82 26 61 45
5 89 90 82 43
6 93 59 53 97
7
8
9 Y =
10
11 242.5000 32.1613 22.5000 33.2212
12 -61.8263 7.9246 -10.7344 30.6881
13 -16.5000 -14.7549 22.5000 -6.8770
14 8.8322 16.6881 -35.0610 -6.9246
15
16
17 X1 =
18
19 61.0000 19.0000 50.0000 20.0000
20 82.0000 26.0000 61.0000 45.0000
21 89.0000 90.0000 82.0000 43.0000
22 93.0000 59.0000 53.0000 97.0000

我们可以看到反变换后无损的恢复了原始信息,所以证明了方法的正确性。但是在实际过程中,需要量化编码或者直接舍弃高频分量等处理,所以会出现一定程度的误差,这个是不可避免的。


五、分块DCT变换

在实际的图像处理中,DCT变换的复杂度其实是比较高的,所以通常的做法是,将图像进行分块,然后在每一块中对图像进行DCT变换和反变换,在合并分块,从而提升变换的效率。具体的分块过程中,随着子块的变大,算法复杂度急速上升,但是采用较大的分块会明显减少图像分块效应,所以,这里面需要做一个折中,在通常使用时,大都采用的是8*8的分块。

Matlab的 blkproc 函数可以帮我们很方便的进行分块处理,下面给出我们的处理过程:

 1 clear;
2 clc;
3
4 X=imread('pepper.bmp');
5 X=double(X);
6 [a,b]=size(X);
7 Y=blkproc(X,[8 8],'dct2');
8 X1=blkproc(Y,[8 8],'idct2');
9
10 figure
11 subplot(1,3,1);
12 imshow(uint8(X));
13 title('原始图');
14
15 subplot(1,3,2);
16 imshow(uint8(Y));
17 title('分块DCT变换图');
18
19 subplot(1,3,3);
20 imshow(uint8(X1));
21 title('分块DCT恢复图');
22
23 Y1=dct2(X);
24 X10=idct2(Y1);
25
26 figure
27 subplot(1,3,1);
28 imshow(uint8(X));
29 title('原始图');
30
31 subplot(1,3,2);
32 imshow(uint8(Y1));
33 title('DCT变换图');
34
35 subplot(1,3,3);
36 imshow(uint8(X10));
37 title('DCT反变换恢复图');

运行结果为:

从图中,我们可以明显看出DCT变换与分块DCT变换在使用时的区别。


六、小结

DCT、DWT等是图像处理的基础知识,之前一直有用到,但是没怎么好好整理下,今天在做稀疏编码的时候正好有用到,就顺便整了下,希望能够给后来者一些提示。

转自:https://www.cnblogs.com/lzhen/p/3947600.html

DCT变换、DCT反变换、分块DCT变换的更多相关文章

  1. Matlab图像处理系列4———傅立叶变换和反变换的图像

    注意:这一系列实验的图像处理程序,使用Matlab实现最重要的图像处理算法 1.Fourier兑换 (1)频域增强 除了在空间域内能够加工处理图像以外,我们还能够将图像变换到其它空间后进行处理.这些方 ...

  2. Matlab图像处理系列4———图像傅立叶变换与反变换

    注:本系列来自于图像处理课程实验.用Matlab实现最主要的图像处理算法 1.Fourier变换 (1)频域增强 除了在空间域内能够加工处理图像以外.我们还能够将图像变换到其它空间后进行处理.这些方法 ...

  3. dennis gabor 从傅里叶(Fourier)变换到伽柏(Gabor)变换再到小波(Wavelet)变换(转载)

    dennis gabor 题目:从傅里叶(Fourier)变换到伽柏(Gabor)变换再到小波(Wavelet)变换 本文是边学习边总结和摘抄各参考文献内容而成的,是一篇综述性入门文档,重点在于梳理傅 ...

  4. 数字信号处理--Z变换,傅里叶变换,拉普拉斯变换

    傅立叶变换.拉普拉斯变换.Z变换最全攻略 作者:时间:2015-07-19来源:网络       傅立叶变换.拉普拉斯变换.Z变换的联系?他们的本质和区别是什么?为什么要进行这些变换.研究的都是什么? ...

  5. OpenGl学习笔记3之模型变换、视图变换、投影变换、视口变换介绍

    模型变换.视图变换.投影变换.视口变换介绍 opengl中存在四种变换,分别是模型变换,视图变换,投影变换,视口变换.这四种变换是图形渲染的基本操作,实质上这四种变换都是由矩阵乘法表示(这些操作都是由 ...

  6. OpenGL模型视图变换、投影变换、视口变换的理解

    OpenGL中不设置模型,投影,视口,所绘制的几何图形的坐标只能是-1到1(X轴向右,Y轴向上,Z轴垂直屏幕向外). 产生目标场景的过程类似于用照相机进行拍照: (1)把照相机固定在三角架上,并让他对 ...

  7. bzoj1640[Usaco2007 Nov]Best Cow Line 队列变换*&&bzoj1692[Usaco2007 Dec]队列变换*

    bzoj1640[Usaco2007 Nov]Best Cow Line 队列变换 bzoj1692[Usaco2007 Dec]队列变换 题意: 有一个奶牛队列.每次可以在原来队列的首端或是尾端牵出 ...

  8. 灰度变换,gama变换,对数,反对数变换

    学习DIP第2天 灰度变换,及按照一定规则对像素点的灰度值进行变换,变换的结果可以增强对比度,或者达到其他的效果(例如二值化,或者伽马变换),由于灰度变换为针对单个像素点的灰度值进行变换,素以算法复杂 ...

  9. H.264编码之DCT变换原理

    DCT变换是一种与FFT变换紧密相连的数学运算,当函数为偶函数是,其傅立叶展开式只有余弦项,因些称为余弦变换,其离散化的过程称为DCT(离散余弦)变换.下面我们就推导下H.264的4x4整数DCT公式 ...

随机推荐

  1. [Oracle]OpenVMS 运行 Oracle 时的推荐值

    PQL Parameters            ORACLE Account  ------------------        -------------------------  PQL_M ...

  2. 编译安装php时遇到virtual memory exhausted: Cannot allocate memory

    有时候用vps建站时需要通过编译的方式来安装主机控制面板.对于大内存的VPS来说一般问题不大,但是对于小内存,比如512MB内存的godaddy VPS来说,很有可能会出现问题,因为编译过程是一个内存 ...

  3. VMware桥接模式连接局域网

    今天尝试虚拟机直连家里的局域网,用于方便另外一台主机使用家里的虚拟机. 本次连接方式是通过桥接方式,但由于'桥接到'选项默认自动,导致无法连通,最终以下步骤完成配置: 第一步:确认本地网关地址 第二步 ...

  4. linux 定时器原理

    内核定时器:    unsigned long timeout = jiffies + (x * HZ);    while(1) {        // Check the condition.   ...

  5. CDH上Cloudera Management Service 各个角色迁移至其他节点

    1.首先查看Cloudera Management Service下有哪些服务,cdh版本为5.9.2: 可以看到基本上有以上6个角色: 2.停止所有角色,并执行删除: 3.找到集群中另外一个节点,添 ...

  6. 重新解读DDD领域驱动设计(一)

    回顾 十年前,还未踏入某校时,便听闻某学长一毕业就入职北京某公司,月薪过万.对于一个名不见经传的小学院,一毕业能拿到这个薪水还是非常厉害的.听闻他学生期间参与开发了一款股票软件,股票那时正迎来一波疯涨 ...

  7. Reflux系列01:异步操作经验小结

    写在前面 在实际项目中,应用往往充斥着大量的异步操作,如ajax请求,定时器等.一旦应用涉及异步操作,代码便会变得复杂起来.在flux体系中,让人困惑的往往有几点: 异步操作应该在actions还是s ...

  8. selenium+ python自动化--断言assertpy

    前言: 在对登录验证时,不知道为何原因用unittest的断言不成功,就在网上发现这个assertpy,因此做个笔记 准备: pip install assertypy 例子: from assert ...

  9. 实验作业:使gdb跟踪分析一个系统调用内核函数

    实验作业:使gdb跟踪分析一个系统调用内核函数(我使用的是getuid) 20135313吴子怡.北京电子科技学院 [第一部分] 根据视频演示的步骤,先做第一部分,步骤如下 ①更新menu代码到最新版 ...

  10. (改进)Python语言实现词频统计

    需求: 1.设计一个词频统计的程序. 2.英语文章中包含的英语标点符号不计入统计. 3.将统计结果按照单词的出现频率由大到小进行排序. 设计: 1.基本功能和用法会在程序中进行提示. 2.原理是利用分 ...