最近网上有朋友因为要进行图像处理,而问及离散余弦正逆变换的问题,我在网上找了一些资料,网下也找了一些参考书,发现居然有很多错误,尤其是逆变换(IDCT)的公式都是错的!怪不得网友做完DCT后,再IDCT,却得不到原来的初始数据了(四舍五入的误差除外),实在误人甚深。写此博文,以正其谬。
说明:
下面实现的代码,严格遵循离散余弦正逆变换的公式,仅供理解离散余弦逆变换的原理而写。并未考虑代码优化,也未考虑快速算法,快速算法见快速离散余弦变换代码实现(FDCT) 和快速逆离散余弦变换代码实现(FIDCT)。
离散余弦变换(DCT)公式:
离散余弦逆变换(IDCT)公式:
注:严格的离散余弦变换公式中,其中一个N可以写为M,且M和N可以不相等。这里由于为图像处理服务,所以都写成了N。
代码实现:
#include <iostream>
#include <math.h>
using namespace std;
#define NUM 8
#define PI 3.1415926
short round(double a)
{
if (a >= 0)
{
return (short)(a + 0.5);
}
else
{
return (short)(a - 0.5);
}
}
// DCT - Discrete Cosine Transform
void DCT(short data[NUM][NUM])
{