由于DCT的数学原理不好描述,直接放代码了:
#include<iostream>
#include<fstream>
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
using namespace std;
using namespace cv;
const double pi = 3.141592;
void initDctMat(Mat &A) //计算8x8块的离散余弦变换系数
{
for (int i = 0; i < 8; ++i)
for (int j = 0; j < 8; ++j)
{
float a;
if (i == 0)
a = sqrt(1.0 / 8.0);
else
a = sqrt(2.0 / 8.0);
A.ptr<float>(i)[j] = a*cos((j + 0.5)*pi*i / 8);
}
}
//dct变换
void myDct(Mat &image, const Mat &A, const Mat &mask)
{
//分块 8x8
for(int i = 0; i < 256; i+=8)
for (int j = 0; j < 256; j += 8)
{
//X = AXAT
image(Range(i, i + 8), Range(j, j + 8)) = A * image(Range(i, i + 8), Range(j, j + 8)) *A.t();
//用mask量化
image(Range(i, i + 8), Range(j, j + 8)) /= m