DCT离散余弦变换及其逆变换+代码
2015-07-31 10:40
225 查看
DCT离散余弦变换及其逆变换计算原理如下:
在OPENCV环境下编写DCT变换和逆变换代码:
(只适用于方阵,OPENCV中的cvDCT()函数也只适用于方阵,原因如上述DCT变换原理可知。)
#include "highgui.h"
#include <math.h>
#include <cv.h>
#include "stdlib.h"
void IDCT(CvMat* scr, CvMat *dst); //逆DCT变换
void DCT(CvMat *scr, CvMat *dst); //DCT变换
#pragma comment(lib, "opencv_highgui220d.lib")
#pragma comment(lib, "opencv_core220d.lib")
void main()
{
double A[3][3]={1,2,3,4,5,6,7,8,9};
CvMat A_Mat=cvMat(3,3,CV_64FC1,A);
CvMat *R_Mat=cvCreateMat(3,3,CV_64FC1);
CvMat *D_Mat=cvCreateMat(3,3,CV_64FC1);
DCT(&A_Mat, R_Mat);
IDCT(R_Mat, D_Mat);
printf("%lf ", cvmGet(R_Mat,2,1));
printf("%lf ", cvmGet(D_Mat,2,1));
system("pause");
}
//DCT变换
void DCT(CvMat *scr, CvMat *dst)
{
int i,j;
double pi=3.141592657;
CvMat *C_Mat=cvCreateMat(scr->height,scr->width,CV_64FC1);
CvMat *CT_Mat=cvCreateMat(scr->height,scr->width,CV_64FC1);
for(j=0; j<C_Mat->height; j++)
{
cvmSet(C_Mat,0,j,sqrtf(2.0/C_Mat->height)*sqrtf(1.0/2));
}
for(i=1; i<C_Mat->height; i++)
for(j=0; j<C_Mat->width; j++)
{
cvmSet(C_Mat,i,j,sqrtf(2.0/C_Mat->height)*cos(pi*(i+i*2*j)/2/C_Mat->height));
}
cvTranspose(C_Mat, CT_Mat);
CvMat *T_Mat=cvCreateMat(scr->height,scr->width,CV_64FC1);
cvMatMul(C_Mat, scr, T_Mat);
cvMatMul(T_Mat,CT_Mat,dst);
}
//逆DCT变换
void IDCT(CvMat *scr, CvMat *dst)
{
int i,j;
double pi=3.141592657;
CvMat *C_Mat=cvCreateMat(scr->height,scr->width,CV_64FC1);
CvMat *CT_Mat=cvCreateMat(scr->height,scr->width,CV_64FC1);
for(j=0; j<C_Mat->height; j++)
{
cvmSet(C_Mat,0,j,sqrtf(2.0/C_Mat->height)*sqrtf(1.0/2));
}
for(i=1; i<C_Mat->height; i++)
for(j=0; j<C_Mat->width; j++)
{
cvmSet(C_Mat,i,j,sqrtf(2.0/C_Mat->height)*cos(pi*(i+i*2*j)/2/C_Mat->height));
}
cvTranspose(C_Mat, CT_Mat);
CvMat *T_Mat=cvCreateMat(scr->height,scr->width,CV_64FC1);
cvMatMul(CT_Mat, scr, T_Mat);
cvMatMul(T_Mat,C_Mat,dst);
}
在OPENCV环境下编写DCT变换和逆变换代码:
(只适用于方阵,OPENCV中的cvDCT()函数也只适用于方阵,原因如上述DCT变换原理可知。)
#include "highgui.h"
#include <math.h>
#include <cv.h>
#include "stdlib.h"
void IDCT(CvMat* scr, CvMat *dst); //逆DCT变换
void DCT(CvMat *scr, CvMat *dst); //DCT变换
#pragma comment(lib, "opencv_highgui220d.lib")
#pragma comment(lib, "opencv_core220d.lib")
void main()
{
double A[3][3]={1,2,3,4,5,6,7,8,9};
CvMat A_Mat=cvMat(3,3,CV_64FC1,A);
CvMat *R_Mat=cvCreateMat(3,3,CV_64FC1);
CvMat *D_Mat=cvCreateMat(3,3,CV_64FC1);
DCT(&A_Mat, R_Mat);
IDCT(R_Mat, D_Mat);
printf("%lf ", cvmGet(R_Mat,2,1));
printf("%lf ", cvmGet(D_Mat,2,1));
system("pause");
}
//DCT变换
void DCT(CvMat *scr, CvMat *dst)
{
int i,j;
double pi=3.141592657;
CvMat *C_Mat=cvCreateMat(scr->height,scr->width,CV_64FC1);
CvMat *CT_Mat=cvCreateMat(scr->height,scr->width,CV_64FC1);
for(j=0; j<C_Mat->height; j++)
{
cvmSet(C_Mat,0,j,sqrtf(2.0/C_Mat->height)*sqrtf(1.0/2));
}
for(i=1; i<C_Mat->height; i++)
for(j=0; j<C_Mat->width; j++)
{
cvmSet(C_Mat,i,j,sqrtf(2.0/C_Mat->height)*cos(pi*(i+i*2*j)/2/C_Mat->height));
}
cvTranspose(C_Mat, CT_Mat);
CvMat *T_Mat=cvCreateMat(scr->height,scr->width,CV_64FC1);
cvMatMul(C_Mat, scr, T_Mat);
cvMatMul(T_Mat,CT_Mat,dst);
}
//逆DCT变换
void IDCT(CvMat *scr, CvMat *dst)
{
int i,j;
double pi=3.141592657;
CvMat *C_Mat=cvCreateMat(scr->height,scr->width,CV_64FC1);
CvMat *CT_Mat=cvCreateMat(scr->height,scr->width,CV_64FC1);
for(j=0; j<C_Mat->height; j++)
{
cvmSet(C_Mat,0,j,sqrtf(2.0/C_Mat->height)*sqrtf(1.0/2));
}
for(i=1; i<C_Mat->height; i++)
for(j=0; j<C_Mat->width; j++)
{
cvmSet(C_Mat,i,j,sqrtf(2.0/C_Mat->height)*cos(pi*(i+i*2*j)/2/C_Mat->height));
}
cvTranspose(C_Mat, CT_Mat);
CvMat *T_Mat=cvCreateMat(scr->height,scr->width,CV_64FC1);
cvMatMul(CT_Mat, scr, T_Mat);
cvMatMul(T_Mat,C_Mat,dst);
}
相关文章推荐
- eclipse调试mapreduce源码
- TDD in Expert Python Programmin
- Struts 2表达式语言
- Spring MVC与JAX-RS比较与分析
- EclipseLink JPA 2.1
- java 中四大加密基本算法解析
- C语言经典算法100例(三)
- C语言经典算法100例(二)
- PHP对字符的递增运算
- Spring之旅(2)
- js跨域访问接口(springmvc)
- C语言经典算法100例(一)
- 如何阅读别人的代码
- spring MVC配置详解
- PHP内核探索:哈希表碰撞攻击原理
- Github上传代码菜鸟超详细教程【转】
- C#装java工具
- [转]Spring MVC 4常用的那些注解
- 2015-07-31 java错题
- 7.31java学习笔记