离散余弦变换(C++实现)
理论部分转载自这篇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++实现)相关推荐
- 【 MATLAB 】逆离散余弦变换(idct)的基础知识介绍
基础知识介绍 逆离散余弦变换从离散余弦变换 (DCT) 系数中重建序列.idct 函数是 dct 函数的逆. The DCT has four standard variants. For a tra ...
- JPEG压缩原理与DCT离散余弦变换 量化
原文网址:http://blog.csdn.net/newchenxf/article/details/51719597 1 前言 JPEG是joint Photographic Experts Gr ...
- Python二维离散余弦变换图像压缩应用(基于OpenCV)
参考:https://blog.csdn.net/James_Ray_Murphy/article/details/79163705 离散余弦变换的特征是将物体信息能量汇聚到低频成分,高频成分接近0, ...
- 离散余弦变换和C语言实现-win32版本
离散余弦变换,DCT for Discrete Cosine Transform. 是与傅里叶变换相关的一种变换,它类似于离散傅里叶变换(DFT for Discrete Fourier Transf ...
- C语言实现离散余弦变换(DCT)并用MATLAB和Python验证
概念 离散余弦变换(Discrete Cosine Transform,DCT)是可分离的变换,其变换核为余弦函数.是与傅里叶变换相关的一种变换,它相当于把离散傅里叶变换的虚数部分丢掉,只使用实数.D ...
- DCT(离散余弦变换(DiscreteCosineTransform))
离散余弦变换(Discrete Cosine Transform,简称DCT变换)是一种与傅立叶变换紧密相关的数学运算.在傅立叶级数展开式中,如果被展开的函数是实偶函数,那么其傅立叶级数中只包含余弦项 ...
- java dct变换_Discrete Cosine Transform [DCT] (离散余弦变换)
Discrete Cosine Transform [DCT] (离散余弦变换) 描述:Binarizer是一个Transformer. 离散余弦变换是与傅里叶变换相关的一种变换,它类似于离散傅立叶变 ...
- 离散余弦变换原理及实现【转载】
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, ...
- 离散余弦变换原理及实现过程【转载】
背景与原理 1974年,K. R. Rao.N. Ahmed.T. Natarajan三位教授创立了离散余弦变换(Discrete Cosine Transform, DCT).在数字信号.数字图像处 ...
- 实验验证离散余弦变换和简单压缩应用,显示对应的原图,dct图和恢复的图像
实验验证离散余弦变换和简单压缩应用,显示对应的原图,dct图和恢复的图像 离散余弦变换 压缩 离散余弦变换 import cv2 import numpy as np import matplotli ...
最新文章
- 运行ORB-SLAM笔记_编译篇(一)
- 为了你的幸福,你知道细菌有多努力吗?
- python是什么编程教程-编程python是什么_谁的Python教程最好?
- mysql 取一行_MySql – 如何获取上一行中的值和下一行中的值?
- BZOJ4426 : [Nwerc2015]Better Productivity最大生产率
- Linux内核中的GPIO系统
- 关于 Oracle 存储双活配置和实战
- python断点调试出现问题_Python错误、调试
- 图片压缩的另一种实现(3)
- UIApplication深入研究
- 随想录(mmu的学习)
- 【CSS】Table样式
- 最近好颓废啊,改过自新就从收拾自己的东西开始吧
- RDV需要什么服务器系统,锐起RDV的教程
- 【原创】Linux学习笔记
- 三菱PLC源型漏型输入输出
- 【PMI-PMP®模考三】2022
- 2020年度十大高薪岗位出炉,程序员霸榜!
- Pic3D裸眼3D贴膜诞生
- HP-UX之MP管理