matlab dct稀疏系数,Matlab DCT详解

转自:http://blog.csdn.net/ahafg/article/details/48808443

DCT变换

DCT又称离散余弦变换,是一种块变换方式,只使用余弦函数来表达信号,与傅里叶变换紧密相关。常用于图像数据的压缩,通过将图像分成大小相等(一般为8*8)的块,利用DCT对其进行变换,得到更加简洁的数据。因为图像像素间存在较大的空间相关性,DCT可以大大减小这些相关性,使图像能量集中在左上角区域,从而利于数据压缩。变换后得到的数据称为DCT系数。这一过程是无损的。

二维DCT变换

这里来看看二维DCT变换的公式:

0818b9ca8b590ca3270a3433284dd417.png

c(u)和c(v)为添加的系数,主要作用为使DCT变换矩阵为正交矩阵。F(u,v)即为DCT变换系数,可以通过矩阵形式来表示:

0818b9ca8b590ca3270a3433284dd417.png

A即为正交矩阵,通过F和A逆变换即可恢复图像数据。

下面通过一个例子来说明:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17clear;

clc;

I = [12,23,53,16;42,16,68,45;34,62,73,26;72,15,34,28]; %数据块

A = zeros(4); %变换矩阵A,也可以通过函数dctmtx(n)求得

for i = 0:3

for j = 0:3

if i == 0

a = sqrt(1/4);

else

a = sqrt(2/4);

end

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

end

end

D = A*I*A'; %DCT变换

D1 = dct2(I); %matlab DCT函数进行DCT变换

D2 = A'*D*A; %DCT逆变换

0818b9ca8b590ca3270a3433284dd417.png

由结果可以看出,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

5I = imread('1_1.jpg');%输入灰度图像

D = dct2(I); %DCT变换

D1 = idct2(D); %逆变换

subplot(1,2,1);imshow(I);

subplot(1,2,2);imshow(uint8(D1));

在这里可以通过函数colormap查看变换系数D。利用不同灰度值,可以发现D中主要数据都分布在左上角。

1

2

3imshow(log(abs(D)),[]);

colormap(gray(8));colorbar;

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

40I = imread('1_1.jpg'); %输入灰度图像

I = im2double(I);

D = dctmtx(8);

C = blkproc(I,[8,8],'P1*x*P2',D,D'); %D'为D的转置

mask1=[1 1 1 1 1 0 0 0

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];

mask2=[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];

mask3=[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

0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0];

X = blkproc(C,[8,8],'P1.*x',mask1); %保留15个系数

I1 = blkproc(X,[8,8],'P1*x*P2',D',D); %重构图像

X2 = blkproc(C,[8,8],'P1.*x',mask2); %保留10个系数

I2 = blkproc(X2,[8,8],'P1*x*P2',D',D); %重构图像

X3 = blkproc(C,[8,8],'P1.*x',mask3); %保留3个系数

I3 = blkproc(X3,[8,8],'P1*x*P2',D',D); %重构图像

subplot(2,4,1);imshow(I);

subplot(2,4,2);imshow(I1);

subplot(2,4,3);imshow(I2);

subplot(2,4,4);imshow(I3);

上面代码中,通过求得图像DCT系数,利用mask等矩阵对其进行量化,保留左上角主要的系数值,对于右下角的值由于其为非常小的高频系数,量化去除后对于图像的质量影响不大,可以利用这一性质对图像进行压缩处理。

保留系数越多则图像压缩质量越好,下面比较几幅图像质量,从左到右分别为原图,mask1,mask2,mask3;

0818b9ca8b590ca3270a3433284dd417.png

可以看到系数保留越少,则图像质量越差。

DCT变换这次就讲到这了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/529670.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

matlab验潮站,验潮站的作用是什么

验潮站的作用是什么?验潮站的建成投入使用,可实时观测沿海潮汐等观测要素,为潮汐预报、赤潮的发生、风暴潮预警报、海啸预警及海平面变化提供基础数据保障以及预测,同时为科学开发海洋提供有力的支持,为海洋经济健康发展保驾护航…

php收购,php中文网收购全国用户量最大的phpstudy集成开发环境揭秘

phpstudy介绍2008年第一个版本诞生,至今已有9年,该程序包集成最新的ApachePHPMySQLphpMyAdminZendOptimizer,一次性安装,无须配置即可使用,是非常方便、好用的PHP调试环境.该程序不仅包括PHP调试环境,还包括了开发工具、开发手册等.总之学习PHP只需一个包…

oracle lob值是什么,关于Oracle数据库LOB大字段总结

概述在ORACLE数据库中,DBA_OBJECTS视图中OBJECT_TYPE为LOB的对象是什么东西呢?其实OBJECT_TYPE为LOB就是大对象(LOB),它指那些用来存储大量数据的数据库字段。Oracle 11gR2 文档:http://download.oracle.com/docs/cd/E11882_01/Ap…

Oracle19C的dbhome,Windows server 安装Oracle19c (WINDOWS.X64_193000_db_home.zip) 过程碰到的问题总结...

Oracle19c的下载地址:链接: https://pan.baidu.com/s/1snqyViOAoeffAztPes_Tvw提取码: 9kb6Oracle19c的安装过程:解压缩安装包:解压结果 以管理员方式运行setup开始安装 一直默认走到安装完成即可创建用户cmd执行sqlplus命令,输入…

oracle数据库配置管理,Oracle配置管理

一、连接Oracle1、Oracle建立连接的过程无论是通过sqlplus命令连接还是第三方工具远程连接到Oracle,都需要建立客户端与服务端之间的连接。Oracle Net Service组件就是为了用于建立连接的,这个组件在安装Oracle时已经安装。1)在服务器端有一个listener监…

linux内核 默认路由表,[Linux] linux路由表-Go语言中文社区

路由表用于决定数据包从哪个网口发出,其主要判断依据是目标IP地址Linux路由表其实有2个主要概念:按顺序走路由策略,在路由策略对应的路由表中匹配规则路由策略(rule)路由表(table)查看所有的路由策略,32766那个策略最有用,对应的main路由表也是默认展示的…

linux添加源地址ping,实战经验:Linux Source NAT在Ping场景下的应用

原标题:实战经验:Linux Source NAT在Ping场景下的应用有时候,有这样的一种需求:需要修改IP数据包中的源地址,比如,从某一个主机发送Ping包到另一个主机,需要修改源地址为另一个源(通常&#xff…

Linux升级glibc版本汉字乱码,Linux CentOS6升级glibc库过程

CentOS6升级glibc库过程hadoop无法加载native库,可能原因是 glibc库版本过低,需要升级。第一:安装以下软件yum -y install zlib zlib-devel gcc gcc-c libtool openssl openssl-devel automake autoconf libtool pcre*第二、查看系统glibc版本…

linux图形界面 革命,Windows 95带来的革命

CDECDE1993年6月-在“公用桌面环境“是与Sun,惠普,IBM和合资Unix系统实验室。CDE,通用桌面环境(CommonDesktopEnvironment)的缩写。CDE是一种运行于UNIX,基于Motif部件工具箱开发的商业桌面环境。惠普的OpenVMS采用CDE作为标准的桌…

real time linux pdf,【整理】ubuntu real time Linux

ubuntu real timeUbuntu不支持实时可参考看看如何才能支持想要自己编译实时内核的话参考去:下载:The Real Time Preempt Patch然后自己编译即可。对于实时系统所支持的功能和特性以及平台,详见这里提供了 已编译好的实时的Debian相关内容或参…

苹方字体 for linux,苹果苹方字体

苹果苹方字体是一款很实用的字体软件,苹果苹方字体是为中国苹果用户打造的全新字体,共有六种字重,使用方便,能够满足用户在阅读时不同的字体需求,并且苹果苹方字体还可以在安卓、Linux 等其他平台和设备上使用&#xf…

c语言龙贝格积分法实验报告,数值作业:龙贝格算法计算积分C语言实现

数值作业:龙贝格算法计算积分C语言实现数值作业:龙贝格算法计算积分C语言实现根据Romberg算法计算定积分,和变步长的Simpson算法的输入都一样.算法基本分析:输入a,b(积分上下限),n为积分区间等分数,eps为计算精度,我这…

w ndows7文档加密取消,win7文件夹怎么加密?windows7文件加密方法

win7文件夹怎么加密?电脑文件隐私问题一直都是很多用户的关注重点,尤其是自己电脑经常被他人使用的朋友。也许使用第三方软件为文件夹加密比较方便,但如果能够不借助“外力”完成这一任务就更加完美。下面,我们就一起来看看windows7文件加密…

小世界网络模型代码 c 语言,新的小世界网络模型实现文本特征的提取方法与流程...

本发明涉及语义网络技术领域,具体涉及新的小世界网络模型实现文本特征的提取方法。背景技术:目前常用的文本特征提取方法,包括词频-反文档频率方法—TF-IDF、信息增益方法、互信息等方法;TF-IDF的简单结构并不能有效地反映词汇或短…

米4用linux刷机救转,小米4变砖之后如何刷机自救?大神教你小米4线刷救砖方法...

三:使用miflash工具刷机的步骤本工具适用于小米,华为,联想等手机品牌高通版本,不只是小米专用,教程仅供参考,看完一遍后再刷机。第一步:刷机工具安装1.下载小米手机刷机工具MiPhone2015731&…

com.android.phone已停止运行怎么解决方法,com.android.phone已停止运行怎么解决

在安卓手机上,不少用户都会遇过com.android.phone已停止的弹窗,尤其经常刷机的最明显。导致的原因实在太多,有刷机步骤不对的,乱改系统文件的,这里小编综合网上的情况以及自身经历,给广大安卓用户一个com.a…

android动画放大后缩小,Android 补间动画 scale(缩放)

今天又遇到了关于Android 动画方面的问题,免不了一番疯狂找资料,所幸解决了自己的问题,为了避免以后遇到同样的问题,再次到处找资料,于是决定写篇随笔记录下来,方便自己方便大家^_^;废话就不说了…

android 机器人动画,Android 5.X与Android4.X版本机器人动画的区别以及制作动画的方法...

今天翻了下墙,解决了一直以来的疑惑问题:为什么Android5.0以及6.0的recovery版本,机器人动画怎么就只有一张图片?这个问题,我百思不得其解,看了很多网文,也只是有了个概念。请参考以下文档&…

android .9编译,在Ubuntu 9.04下编译Android源码

一直都是刷官方的版本,准备自己编译一下刷机。首先是下载,Android的源码是托管在Linux Kernel的源码站点,所以版本工具是git。关于git的使用和安装请见我的另一篇文章《在Ubuntu Server上安装Git》。创建一个存放Andorid的目录,然…

android rn框架开发的例子,RN与安卓通信架构篇

本篇文章介绍的搭建Android与Rn之间的简易通信架构,需要了解通信的基本使用的同学可以参考下面的链接开篇先上图 - “简易版的通信架构图”RN与Android之间通信的架构图本架构实现的功能有:自定义通信规则,并以Json作为数据传输格式进行传输实…