关于其中的参数,f(x,y) 即对应原图像的值,M和N是DCT变换在矩阵大小,在JPEG的压缩中,就是8。这里的DCT是对图像中每8乘8的矩阵进行转换的
c(x) 函数 是 c(x)=1, x=0 , else c(x)=sqrt(2).
代码,来自 http://bbs.bccn.net/thread-294805-1-1.html
#if 0 /* 数学表达式版本 */
/* 内部常量定义 */
#define M_PI 3.14159265358979323846f
/* 函数实现 */
static float alpha(int n)
{
if (n == 0) return 1.0f / (float)sqrt(8);
else return 1.0f / 2.0f;
}
void fdct2d8x8(float *data)
{
int u, v;
int x, y, i;
float buf[64];
float temp;
for (u=0; u<8; u++)
{
for (v=0; v<8; v++)
{
temp = 0;
for (x=0; x<8; x++)
{
for (y=0; y<8; y++)
{
temp += data[y * 8 + x]
* (float)cos((2.0f * x + 1.0f) / 16.0f * u * M_PI)
* (float)cos((2.0f * y + 1.0f) / 16.0f * v * M_PI);
}
}
buf[v * 8 + u] = alpha(u) * alpha(v) * temp;
}
}
for (i=0; i<64; i++) data[i] = buf[i];
}
这是表达式的版本,DCT还有更快的方法(在上网址中亦有代码),仍在研究~