离散余弦正逆变换程序

一. 公式

1. 离散余弦变换(DCT)公式:

离散余弦正逆变换程序_第1张图片


2. 离散余弦逆变换(IDCT)公式:

离散余弦正逆变换程序_第2张图片


注:严格的离散余弦变换公式中,其中一个N可以写为M,且MN可以不相等。这里由于为图像处理服务,所以都写成了N


二. 代码


1. 离散余弦变换(DCT):

<span style="font-size:14px;"><span style="font-size:12px;">// DCT - Discrete Cosine Transform
void DCT(short data[NUM][NUM])
{
	......
	for(u = 0; u < NUM; u++)
	{
		for(v = 0; v < NUM; v++)
		{
			double result = 0.0;
			for(i = 0; i < NUM; i++)
			{
				for(j = 0; j < NUM; j++)
				{
					result += data[i][j] * cos((2*i+1)*u*PI/(2.0 * NUM)) * 
						cos((2*j+1)*v*PI/(2.0 * NUM));
				}
			}
			output[u][v] = round(GetAlpha(u) * GetBeta(v) * result);
		}
	}
	......
}</span></span>

2. 离散余弦逆变换(IDCT):

<span style="font-size:14px;"><span style="font-size:12px;">// Inverse DCT
void IDCT(short data[NUM][NUM])
{
	......
	for(i = 0; i < NUM; i++)
	{
		for(short j = 0; j < NUM; j++)
		{
			double result = 0.0;

			for(short u = 0; u < NUM; u++)
			{
				for(v = 0; v < NUM; v++)
				{
					result += GetAlpha(u) * GetBeta(v) * data[u][v] * 
						cos((2*i+1)*u*PI/(2.0 * NUM)) * cos((2*j+1)*v*PI/(2.0 * NUM));
				}
			}
			output[i][j] = round(result);
		}
	}
    ......
}</span></span>

3. 测试代码(VS 2008):http://download.csdn.net/detail/u013354805/8812867

你可能感兴趣的:(测试,图像处理,离散余弦正逆变换)