DCT離散餘弦變換及其逆變換+代碼

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

發佈了38 篇原創文章 · 獲贊 34 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章