1. 图像的二维离散变换

  与一维的有限长离散非周期信号存在傅里叶变换(DFT)一样,图像作为一个二维离散信号同样存在着二维离散变换(注意这里是介绍一个通用的概念,二维离散变换,包括了DFT、DCT等多种变换在内的一种通式写法),其通式可以表达为

1.1 二维变换的可分性与对称性


  如果一个二维变换核同时具备可分性与对称性,此时允许用两个一维变换来计算二维变换,即首先沿着输入的行(列)进行一维变换,接着用第一步得到的结果再对列(行)进行一维变换。当变换对的正反变换都满足这个条件时,且 f(x,y) f(x,y) 是大小为 M×M M×M 的方形图像时,式(2.6-30)和式(2.6-31)可表示为矩阵形式

T=AFAT

T=AFA^T
其中 F F 矩阵是包含元素 f(x,y)f(x,y) 的 的M×M 的M×M 矩阵, A A 矩阵是有元素 ai,j=r1(i,j)a_{i,j}=r_1(i,j) 的 M×M M×M 矩阵, T T 是 M×MM×M 变换的结果,其值为 T(u,v),u,v=0,1,...,M−1 T(u,v),u,v=0,1,...,M-1,其中的 A A 矩阵并不是所说的基函数或者基图像,而由r(x,y,u,v)r(x,y,u,v) 构成的图像才是基图像。具体什么事基函数,如何获得基图像将在下面说明。

1.2 为什么二维变换可以用矩阵表示

  首先回顾一下什么样的图像可以使用 T=AFAT T=AFA^T 来进行表示,要求二维变换核同时具备可分性与对称性且图像是正方形的图。当满足上述条件式,一个二维变换可以用两个一维变换计算,即首先变换图像的每一列再变换图像的每一行。对每一列进行变换就是用矩阵乘以图像的每一列,有线性代数知识可知

XF=X[f1,f2,f3,…,fn]

XF=X[f_1,f_2,f_3,…,f_n]
其中的F是图像矩阵,而 f1,…fn f_1,…f_n 是图像矩阵中的每一列。

1.3 二维离散余弦变换

  正变换

  反变换

  由上可知当 M=N M=N的时候,DCT变换可以表示为矩阵相乘的形式,其中 T=AFAT T=AFA^T 的 A A 的形式为

注意矩阵中有一个元素写错了,第3行第1列的元素应该是 cos(2π/2N)cos(2\pi/2N) 。在上述利用矩阵进行DCT变换的过程中,关于矩阵的维数是需要说明的,根据定义可以知道,被变换的图像必须是一个正方形的图像,也就是说图像矩阵必须是一个方阵。根据最开始关于二维离散变换的定义我们可以知道,被变换的图像是一个 M×N M×N 矩阵,但是这里使用一个方阵主要是因为这样的图像在计算的时候才会产生 T=AFAT T=AFA^T ,否则 F F 前后矩阵的维数不相同,计算出的变换矩阵当然也不同,这时的计算就变成了 T=AFBTT=AFB^T 的形式了。所以为了分解方便都会假设图像是正方形的,如果图像不是正方形的,会在图像上取一个个正方形块,分块计算(实际上常常在图像上取 8 × 8 的子图象进行计算,因为这样的计算量不是很大。这时矩阵 F 和 A 都是方阵。

2. DCT余弦变换的相关代码

2.1 编写DCT余弦变化矩阵 A 的代码

  本代码根据网友“彼岸之音”的CSDN博客改写,如想了解更多细节请浏览 Matlab DCT详解。

clc;clear all;close all;
N = 8;          % 这个是一个可以修改的参数,与原始的正方形图像的尺寸相同。
I = rand(N)     % 被变换的矩阵,这里是一个随机生成的、元素分布在0到1的N*N的方阵
for i = 0:N-1for j = 0:N-1if i == 0a = sqrt(1/N);elsea = sqrt(2/N);endA(i+1,j+1) = a*cos((j+0.5)*pi*i/N)end
end
D = A*I*A'      % DCT变换
D1 = dct2(I)    % matlab DCT函数进行DCT变换
D2 = A'*D*A     % DCT逆变换

2.2 用矩阵相乘代替上述的 for 循环

  无论是在MATLAB中,还是在puthon中使用numpy都有一个共同的特点,使用向量相乘或者矩阵相乘可以加快计算速度,所以下面的代码是在 2.1 代码的基础上,用矩阵相乘来代替 for 循环的一种形式。如果想了解这种方法的具体原理,可以参考博客《从 DTFT 的角度用矩阵相乘代替 for 循环进行计算》

clc;clear all;close all;
N = 4;          % 这个是一个可以修改的参数,与原始的正方形图像的尺寸相同。
I = rand(N)     % 被变换的矩阵,这里是一个随机生成的、元素分布在0到1的N*N的方阵
A = sqrt(2 / N)*cos((0:N-1)'*((0:N-1)+0.5)*pi/N);
A(1,:) = A(1,:) / sqrt(2)
D = A*I*A'      % DCT变换
D1 = dct2(I)    % matlab DCT函数进行DCT变换
D2 = A'*D*A     % DCT逆变换

  上面通过10行进行的计算在这里通过三行的矩阵相乘就可以代替了,代码精简了,而且会提高运算速度。

2.3 DCT 余弦变换的MATLAB命令

D = dct2(I)     % matlab DCT函数对I进行DCT变换
D = dctmtx(N)   % 如果矩阵A是N×N方阵,则A的DCT变换可用D×A×D’来计算,注意其中的N是维数,不是矩阵

离散余弦变换(DCT)的来龙去脉相关推荐

  1. 压缩感知稀疏基之离散余弦变换(DCT)和离散正弦变换(DST)

    题目:压缩感知稀疏基之离散余弦变换(DCT)和离散正弦变换(DST) 在前面一篇<压缩感知的常见稀疏基名称及离散傅里叶变换基>中集结了九篇压缩感知文献中有关稀疏基名称,并且直白地告诉大家稀 ...

  2. 二维离散变换由c语言编写,离散余弦变换(DCT)的DSP程序设计与实现

    <离散余弦变换(DCT)的DSP程序设计与实现>由会员分享,可在线阅读,更多相关<离散余弦变换(DCT)的DSP程序设计与实现(15页珍藏版)>请在人人文库网上搜索. 1.DS ...

  3. 离散余弦变换(DCT)原理及应用

    1.预备知识 1.1可分离变换 二维傅立叶变换可用通用的关系式来表示: 式中:x, u=0, 1, 2,  -,  M-1:y,  v=0,  1,  2,  -,  N-1:g(x,y,u,v)和h ...

  4. C语言实现离散余弦变换(DCT)并用MATLAB和Python验证

    概念 离散余弦变换(Discrete Cosine Transform,DCT)是可分离的变换,其变换核为余弦函数.是与傅里叶变换相关的一种变换,它相当于把离散傅里叶变换的虚数部分丢掉,只使用实数.D ...

  5. 离散余弦变换 DCT

    MPEG采用了Ahmed(一个巨牛的数学家) 等人于70年代提出的离散余弦变换(DCT-Discrete Cosine Transform)压缩算法,降低视频信号的空间冗余度. DCT将运动补偿误差或 ...

  6. jpg图片与jpeg图片格式的区别(没有区别,.jpg只是扩展名.jpeg的缩写)JPEG图像压缩(YUV4:2:0 缩减采样、缩减取样)(离散余弦变换 DCT算法)(量化)(熵编码)(霍夫曼哈夫曼)

    文章目录 20191026 20220414 更新,更系统去了解里面的编码压缩流程 科普:关于图像格式JPG和JPEG你知多少? 一.前言 二.JPEG和JPG的关系 三.色彩空间转换 缩减取样 离散 ...

  7. 离散余弦变换(DCT)

    DCT变换.DCT反变换.分块DCT变换 一.引言 DCT变换的全称是离散余弦变换*(Discrete Cosine Transform)*,主要用于将数据或图像的压缩,能够将空域的信号转换到频域上, ...

  8. 基于离散余弦变换(DCT)傅里叶变换(DFT)小波变换(DWT)的彩色图像数字水印的嵌入、提取简介及MATLAB实现

    一.引言 该篇包括三部分,1)引言.2)图像变化技术简介和代码实现 .3)基于图像变换技术的数字水印技术及代码实现. 数字水印是一种有效的数字产品版权保护和数据安全维护技术, 是信息隐藏领域的一个重要 ...

  9. dct余弦离散c语言,DCT离散余弦变换的DSP实现.doc

    DCT离散余弦变换的DSP实现 学生姓名: 指导老师: TMS320VC5402的特性,以运用TMS320VC5402定点DSP芯片完成MPEG-4标准中DCT系数量化为例,简要介绍MPEG-4标准的 ...

  10. 【 MATLAB 】逆离散余弦变换(idct)的基础知识介绍

    基础知识介绍 逆离散余弦变换从离散余弦变换 (DCT) 系数中重建序列.idct 函数是 dct 函数的逆. The DCT has four standard variants. For a tra ...

最新文章

  1. ps混合模式glsl代码
  2. Spark集群启动时worker节点启不起来
  3. python生成epub文件_python在内存中生成Zip文件!
  4. qpushbutton设置居中_Qt QGridLayout自动将项目居中(移动)到中间。
  5. XCode连接手机时提示A Valid provisioning profile for this executable was not found
  6. oracle dba笔试,一个好资企业的的oracle DBA面试试题 大家来看看啊 把答案写下来 最好带注释 测试一下 了 最后30分散分 快来啊...
  7. 关于人脸识别最近浏览器打不开摄像头的解决方案
  8. 微信小程序时代,哪些人能赚到第一桶金
  9. 惯性制导精度是多少_美军激光炸弹真实精度性能:炸小卡车,直接从驾驶员车窗钻进去炸...
  10. linux学习命令总结⑩②
  11. 冒泡排序及其优化(三种优化)
  12. linux系统下回收站,Linux怎么开启回收站功能
  13. Klari汽车静态电流(暗电流)测试数据采集系统专用电流探头
  14. php yar 安装失败_全面解析php7安装yar扩展的方法
  15. 天池比赛notebook
  16. 读《哈佛情商课》有感
  17. 词向量经典模型:从word2vec、glove、ELMo到BERT
  18. 使用Nginx负载均衡及动静分离
  19. winrar5.9-64位最新版
  20. Cordova官方插件 -- Vibration、Media、NativeAudio

热门文章

  1. oracle19c查看pdb表空间,19c pdb如何保存启动状态
  2. 企业宣传片拍摄制作经验
  3. MacBook 卸载ESET Endpoint Antivirus
  4. 一种日志采集装置及方法
  5. bzoj 1902: Zju2116 Christopher lucas定理 数位DP
  6. java计算机毕业设计服装连锁店后台管理系统源码+mysql数据库+系统+lw文档+部署
  7. java导入进度显示_java excel导入获取实时进度
  8. 本地图书管理:通过calibre-web打造个人在线书城
  9. 分分钟带你读懂 ButterKnife 的源码
  10. 【游戏动画】游戏动画总结