DCT变换

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

二维DCT变换

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

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

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

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

clear;
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:3for j = 0:3if i == 0a = sqrt(1/4);elsea = sqrt(2/4);endA(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逆变换

由结果可以看出,D,D1方式得到的DCT系数相同,说明矩阵形式的DCT变换公式是正确的,D2的数据与原数据I相同,实现了数据恢复。

另外通过运行函数dctmtx(4)可以发现得到的变换矩阵与A完全相同。

Matlab 函数实现

matlab实现离散余弦变换有两种方法:

  1. 一种为函数dct2( ), 使用函数dct2,该函数用一个基于FFT的算法来提高当输入较大的方阵时的计算速度。
  2. 另一种为函数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( );
代码如下:

I = 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中主要数据都分布在左上角。

imshow(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’ 。

下面为应用例子:

I = 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;

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


DCT变换这次就讲到这了。

Matlab DCT详解相关推荐

  1. matlab dct稀疏系数,Matlab DCT详解

    转自:http://blog.csdn.net/ahafg/article/details/48808443 DCT变换 DCT又称离散余弦变换,是一种块变换方式,只使用余弦函数来表达信号,与傅里叶变 ...

  2. 数字信号处理实验matlab版答案,数字信号处理习题答案及matlab实验详解.pdf

    数字信号处理习题答案及matlab实验详解.pdf 第一章 参考答案: 1 (1)2 2 14 ,有理数,所以周期为 14 0 3  3 7 2 2 (2 ) 12 ,无理数,非周期  ...

  3. 非局部相似性 matlab,非局部均值滤波(NLM)和MATLAB程序详解视频教程保持图像细节...

    [内容简介]<非局部均值滤波与应用和MATLAB程序详解视频>共6章28节视频,总学时698分钟,合11.6小时.主要内容包括:非局部均值滤波类算法入门,基于滤波参数自适应的非局部均值滤波 ...

  4. 完全手册-MATLAB使用详解:基础、开发及工程应用

    [书名]完全手册-MATLAB使用详解:基础.开发及工程应用 [作者]董霖 编著 [ISBN]978-7-121-07397-7 [出版社]电子工业出版社 [出版日期]2009年1月 [内容简介] M ...

  5. 汽车理论matlab编程,汽车理论课后作业matlab编程详解(带注释)[试题学习]

    <汽车理论课后作业matlab编程详解(带注释)[试题学习]>由会员分享,可在线阅读,更多相关<汽车理论课后作业matlab编程详解(带注释)[试题学习](11页珍藏版)>请在 ...

  6. 汽车理论matlab编程,汽车理论课后作业matlab编程详解带注释[10页]

    <汽车理论课后作业matlab编程详解带注释[10页]>由会员分享,可在线阅读,更多相关<汽车理论课后作业matlab编程详解带注释[10页](11页珍藏版)>请在读根文库上搜 ...

  7. 汽车理论课后习题matlab程序,汽车理论课后作业matlab编程详解(带注释).doc

    汽车理论课后作业matlab编程详解(带注释) 1.3matlab程序: (1)%驱动力-行驶阻力平衡图%货车相关参数. m=3880;g=9.8;nmin=600;nmax=4000;G=m*g;i ...

  8. 单相全控桥有源逆变电路matlab仿真,单相桥式全控整流及有源逆变电路的MATLAB仿真详解.doc...

    单相桥式全控整流及有源逆变电路的MATLAB仿真详解.doc 学 号 天津城建大学 控制系统仿真 大作业 单相整流-逆变电路仿真模型 学生姓名班级成绩学院 年 月 日 一.仿真电路原理图:2 二.单相 ...

  9. 免疫算法(IA)MatLab代码详解

    CSDN编辑器里面没有MATLAB选项,所以我为了注释更清楚,用的是//,大家不要被误解了呀,算法看代码就好了 1 免疫算法的精髓 生物免疫系统:动态性免疫.自适应免疫 免疫算法-保证信息的无害性.有 ...

  10. matlab shift 详解,Matlab fftshift 详解

    说明:本文为转载加上自己的编辑,转载请注明出处. Matlab fftshift 详解 一.实信号情况 因为实信号以fs为采样速率的信号在fs/2处混叠,所以实信号fft的结果中前半部分对应[0, f ...

最新文章

  1. 40个出色的Wordpress cms插件
  2. 微信公众平台消息接口PHP版
  3. SQL数据库的数据体系结构
  4. Android 断点续传实现原理
  5. mysql inner join
  6. [CXF REST标准实战系列] 一、JAXB xml与javaBean的转换(转)
  7. html鼠标划过显示图片,jquery实现鼠标滑过小图查看大图的方法
  8. 《Python Cookbook 3rd》笔记(1.14):排序不支持原生比较的对象
  9. 使用xcode4做ios的国际化
  10. 云承软件和云溪哪个好_多工序开料机的软件对接及注意事项
  11. VB制作控件之图片命令按钮➀
  12. C语言 三角函数用法
  13. IE实现PDF在线预览功能
  14. 致远互联的下一步:从“协同”到“门户”
  15. 一个应届毕业生的求职回忆录(指引道路)
  16. android日历提醒小程序源码,微信小程序倒班日历简洁实用demo完整源码
  17. 弘辽科技:抖音电商,一场标准的「字节」式战役
  18. 最广泛使用的服务器软件爆出网络安全漏洞
  19. OAuth2 and OpenId 协议学习记录一
  20. 【马士兵】Python基础--01

热门文章

  1. QCC3040---coredump方法和注意事项
  2. 教师节HTML祝福网页,教师节的祝福语
  3. 微博营销的价值与注意点
  4. 设置计算机网络文件共享,局域网共享文件设置方法图文教程
  5. Android RabbitMQ使用之RabbitMQ安装及配置
  6. kindle电子书格式转换
  7. TCP自时钟/拥塞控制/带宽利用之脉络半景解析
  8. 李宏毅2020机器学习笔记2——CXK
  9. 数据聚合与分组操作(数据分析)
  10. Oracle (03)分组子句.where条件 与 having条件的区别.子查询.DDL.DML.数据的增删改.TCL