二维DCT变换分析和总结.docx

  1. 1、本文档共4页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多

DCT

DCT变换及整数DCT变换

为了给x264打好基础,x264用的是整数DCT变换,所以就先来说说DCT变换吧。

DCT(DiscreteCosineTransform),又叫离散余弦变换,它的第二种类型,经常用于信号和图像数据的压缩。经过DCT变换后的数据能量非常集中,一般只有左上角的数值是非零的,也就是能量都集中在离散余弦变换后的直流和低频部分,下面我会用matlab来演示整个过程。

一维DCT变换

我们首先来看看一维的DCT

我们首先来看看一维的DCT变换,这是二维的基础。一维的DCT变换共有8种,其中最

实用的是第二种形式,公式如下:

其中c(u)

是加上去一个系数,为了能使DCT变换矩阵成为正交矩阵,在后面二维变换将看到他的作

用。N是f(x)的总数。相比其他几种形式,他的运算还是比较简单的,因此也用的比较广。

二维DCT变换

二维DCT变换是在一维的基础上再进行一次

二维DCT变换是在一维的基础上再进行一次DCT变换,这个比较好理解,直接看公式:

这里我只讨论两个N相等的情况,也就是数据是方阵的形式,在实际应用中对不是方阵的

数据都是先补齐再进行变换的。为了matlab仿真方便点,写成矩阵形式:

下面就用matlab来模拟一下,使用随机生成的4x4矩阵

作为输入,程序如下:

1.

2.

3.

clear;

clc;

X=round(rand(4)*100);%随机生成的数据

6.7.

6.

7.

Y=

A=zeros(4);%变换矩阵

fori=0:3

forj=0:3

ifi==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);

end

end

Y=A*X*A;%DCT变换

YY=dct2(X);%用matlab中的函数进行DCT变换

Y

Y是使用上面的公式进行变换,YY是用matlab自带的dct2函数变换,结果是是:

1. X=

2.

61

19

50

20

3.

82

26

61

45

4.

89

90

82

43

5.

93

59

53

97

8. 242.5000

32.1613

22.5000

33.2212

9. -61.8263

7.9246

-10.7344

30.6881

10. -16.5000

-14.7549

22.5000

-6.8770

11. 8.8322

16.6881

-35.0610

-6.9246

12.

13. YY=

14. 242.5000

32.1613

22.5000

33.2212

15. -61.8263

7.9246

-10.7344

30.6881

16. -16.5000

-14.7549

22.5000

-6.8770

17. 8.8322

16.6881

-35.0610

-6.9246

可以看出

可以看出Y和YY的结果是一样的,这也进一步验证了上面的公式是正确的。由于X是我随机生成的,相关性很小,变换后的结果比较乱;如果是信号或图像这样相关性比较大的数据的话,数值会集中在左上角,右下角一般都是零,再使用“之”字型扫描得到数据流会包含

很多连续的零,编码后数据量会非常小,这就是DCT变换带来的好处。

二维DCT反变换

DCT逆变换的公式如下:

DCT逆变换的公式如下:

矩阵形式可以

由正变换的公式直接推出来,因为在A中加了c(i)这个系数,使得A成为了正交矩阵,所以

10.

11.

12.

13.

14.

15.

16.

17.

18.

19.

20.

forj=0:3

ifi==0

a=sqrt(1/4);

else

a=sqrt(2/4);

endA(i+1,j+1)=a*cos(pi*(j+0.5)*i/4);

end

end

Y=A*X*A;X1=A*Y*A;

我们就可以这样做:原来的数据:

1. clear;

在用matlab来验证是否能反变换出

2. clc;

3. X=[

4. 61 19

50

20

5. 82 26

61

45

6. 89 90

82

43

7. 93 59

A=zeros(4);

fori=0:3

53

97];

X

X使用的是上面正变换用的数据,运行后得到的X1为:

1. X1

=

2.

61.0000

19.0000

50.0000

20.0000

3.

82.0000

26.0000

61.0000

45.0000

4.

89.0000

90.0000

82.0000

43.0000

5.

93.0000

59.0000

53.000

文档评论(0)

tianya189 + 关注
官方认证
内容提供者

该用户很懒,什么也没介绍

认证主体阳新县融易互联网技术工作室
IP属地上海
统一社会信用代码/组织机构代码
92420222MA4ELHM75D

1亿VIP精品文档

相关文档