您的位置:首页 > 编程语言

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);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: