理论部分转载自这篇blog: http://blog.csdn.net/luoweifu/article/details/8214959  该blog给出的是java代码,我用c++将其实现了。

理论:

图像处理中常用的正交变换除了傅里叶变换外,还有其他一些有用的正交变换,其中离散余弦就是一种。离散余弦变换表示为DCT( Discrete Cosine Transformation),常用于图像处理和图像识别等。

一维离散余弦变换

正变换

                                   (1)

                            (2)

式中F(u)是第u个余弦变换系数,u是广义频率变量,u=1,2,3......N-1; f(x)是时域N点序列, x=0,1,2......N-1

反变换

  (3)

显然,式(1)式(2)和式(3)构成了一维离散余弦变换对。

二维离散余弦变换

正变换

  (4)

式(4)是正变换公式。其中f(x,y)是空间域二维向量之元素, x,y=0,1,2,......N-1;F(u,v)是变换系数阵列之元素。式中表示的阵列为N×N

反变换

 (5)

式中的符号意义同正变换式一样。式(4)和式(5)是离散余弦变换的解析式定义。

矩阵表示法

更为简洁的定义方法是采用矩阵式定义。根据以上公式定义可知,离散余弦变换的系数矩阵可以写成如下:

如果令N=4,那么由一维解析式定义可得如下展开式。

写成矩阵式

若定义F(u)为变换矩阵,A为变换系数矩阵,f(x)为时域数据矩阵,则一维离散余弦变换的矩阵定义式可写成如下形式

[F(u)]=[A][f(x)]                       (6)

同理,可得到反变换展开式

写成矩阵式即

[f(x)]=[A]T[F(u)]                      (7)

二维离散余弦变换也可以写成矩阵式:

[F(u,v)]=[A][f(x,y)][A]T            (8)

[f(x,y)]=[A]T[F(u,v)][A]                     

式中[f(x,y)]是空间数据阵列,A是变换系数阵列,[F(u,v)]是变换矩阵,[A]T是[A]的转置。

对二维图像进行离散余弦变换

由以上对二维离散余弦变换的定义及公式(7)可知,求二维图像的离散余弦变换要进行以下步骤:

1.获得图像的二维数据矩阵f(x,y);

2.求离散余弦变换的系数矩阵[A];

3.求系数矩阵对应的转置矩阵[A]T;

4.根据公式(7)[F(u,v)]=[A][f(x,y)][A]T 计算离散余弦变换;

以下是我的c++代码实现<当然其中针对的是图像,故用到了opencv的库函数>:

C++代码:

/*功能:获取DCT系数n:矩阵大小quotient: 系数quotientT: 系数转置
*/
void coefficient(const int &n, double **quotient, double **quotientT){double sqr = 1.0/sqrt(n+0.0);for(int i = 0; i < n; i++){quotient[0][i] = sqr;quotientT[i][0] =  sqr;}for(int i = 1; i < n; i++){for(int j = 0; j < n; j++){quotient[i][j] = sqrt(2.0/n)*cos(i*(j+0.5)*PI/n);  // 由公式得到quotientT[j][i] = quotient[i][j];}}}
/*功能:两矩阵相乘A和B:源输入矩阵result:输出矩阵
*/
void matrixMultiply(double **A, double **B, int n, double **result){  double t = 0;for(int i = 0; i < n; i++){for(int j = 0; j < n; j++){t = 0;for(int k = 0; k < n; k++)t += A[i][k]*B[k][j];   result[i][j] = t;}}
}//  DCT变换
void DCT(Mat_<uchar> image, const int &n, double **iMatrix){for(int i = 0; i < n; i++){for(int j = 0; j < n; j++){iMatrix[i][j] = (double)image(i,j);}}// 为系数分配空间double **quotient = new double*[n];double **quotientT = new double*[n];double **tmp = new double*[n];for(int i = 0; i < n; i++){quotient[i] = new double[n];quotientT[i] = new double[n]; tmp[i] = new double[n];}// 计算系数矩阵coefficient(n, quotient, quotientT);matrixMultiply(quotient, iMatrix, n, tmp);  // 由公式成绩结果matrixMultiply(tmp, quotientT, n, iMatrix);for(int i = 0; i < n; i++){delete []tmp[i];delete []quotient[i];delete []quotientT[i];}delete []tmp;delete []quotient;delete []quotientT;
}


离散余弦变换(C++实现)相关推荐

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

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

  2. JPEG压缩原理与DCT离散余弦变换 量化

    原文网址:http://blog.csdn.net/newchenxf/article/details/51719597 1 前言 JPEG是joint Photographic Experts Gr ...

  3. Python二维离散余弦变换图像压缩应用(基于OpenCV)

    参考:https://blog.csdn.net/James_Ray_Murphy/article/details/79163705 离散余弦变换的特征是将物体信息能量汇聚到低频成分,高频成分接近0, ...

  4. 离散余弦变换和C语言实现-win32版本

    离散余弦变换,DCT for Discrete Cosine Transform. 是与傅里叶变换相关的一种变换,它类似于离散傅里叶变换(DFT for Discrete Fourier Transf ...

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

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

  6. DCT(离散余弦变换(DiscreteCosineTransform))

    离散余弦变换(Discrete Cosine Transform,简称DCT变换)是一种与傅立叶变换紧密相关的数学运算.在傅立叶级数展开式中,如果被展开的函数是实偶函数,那么其傅立叶级数中只包含余弦项 ...

  7. java dct变换_Discrete Cosine Transform [DCT] (离散余弦变换)

    Discrete Cosine Transform [DCT] (离散余弦变换) 描述:Binarizer是一个Transformer. 离散余弦变换是与傅里叶变换相关的一种变换,它类似于离散傅立叶变 ...

  8. 离散余弦变换原理及实现【转载】

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

  9. 离散余弦变换原理及实现过程【转载】

    背景与原理 1974年,K. R. Rao.N. Ahmed.T. Natarajan三位教授创立了离散余弦变换(Discrete Cosine Transform, DCT).在数字信号.数字图像处 ...

  10. 实验验证离散余弦变换和简单压缩应用,显示对应的原图,dct图和恢复的图像

    实验验证离散余弦变换和简单压缩应用,显示对应的原图,dct图和恢复的图像 离散余弦变换 压缩 离散余弦变换 import cv2 import numpy as np import matplotli ...

最新文章

  1. 运行ORB-SLAM笔记_编译篇(一)
  2. 为了你的幸福,你知道细菌有多努力吗?
  3. python是什么编程教程-编程python是什么_谁的Python教程最好?
  4. mysql 取一行_MySql – 如何获取上一行中的值和下一行中的值?
  5. BZOJ4426 : [Nwerc2015]Better Productivity最大生产率
  6. Linux内核中的GPIO系统
  7. 关于 Oracle 存储双活配置和实战
  8. python断点调试出现问题_Python错误、调试
  9. 图片压缩的另一种实现(3)
  10. UIApplication深入研究
  11. 随想录(mmu的学习)
  12. 【CSS】Table样式
  13. 最近好颓废啊,改过自新就从收拾自己的东西开始吧
  14. RDV需要什么服务器系统,锐起RDV的教程
  15. 【原创】Linux学习笔记
  16. 三菱PLC源型漏型输入输出
  17. 【PMI-PMP®模考三】2022
  18. 2020年度十大高薪岗位出炉,程序员霸榜!
  19. Pic3D裸眼3D贴膜诞生
  20. HP-UX之MP管理

热门文章

  1. 敏捷实施时的五个不当做法
  2. Open3D:如何使用RGBD图像集成实现三维重建?
  3. linux系统编程之管道(二):管道读写规则和Pipe Capacity、PIPE_BUF
  4. 博弈论 之 1 什么是博弈论
  5. 利用 SWOT 分析教育机构
  6. element el-dropdown 水平居中
  7. 图片预加载与addLoadEvent
  8. 卧龙岗大学厉万庆老师访问ZZUNLP交流记录
  9. python爬虫获取vpn代理
  10. 俞敏洪:人要树一样活着