⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 liftingschemeview.cpp

📁 正交变换.rar文件压缩的基础知识无毒good
💻 CPP
📖 第 1 页 / 共 3 页
字号:
	for(i = 0; i < h; i++)
	{
	    // 对y方向进行快速付立叶反变换
		IFFT(&FD[w * i], &TD[w * i], wp);
	}
	// 行
	for(i = 0; i < h; i++)
	{	// 列
		for(j = 0; j < w; j++)
		{
			// 计算频谱
			dTemp = TD[j * h + i].real();
			dTemp=(dTemp > 255)?255:dTemp;
			finalImage[ i+ j*hh]=dTemp;
		}
	}
	
	// 显示
	DisplayImage(ww,hh,512,TRUE,ImageToRe);
	if(reconstruct)
       DisplayImage(ww,hh,512,TRUE,finalImage);
	delete TD;
	delete FD;
	delete finalImage;
	delete ImageToRe;	
}

void CLiftingschemeView::DCTtransform(BYTE *Image, long ww, long hh, BOOL reconstruct,int n)
{
	finalImage=new double[ww*hh];
	ImageToRe=new double[ww*hh];
	memset(finalImage, 0, sizeof(double) * ww* hh);
	memset(ImageToRe, 0, sizeof(double) * ww* hh);

	int GOB_num; 
	int MB_num;	
	int Block_num; 
    for(GOB_num=0;GOB_num<hh/16;GOB_num++)
	{	for(MB_num=0;MB_num<ww/16;MB_num++)
		{	for(Block_num=1;Block_num<=4;Block_num++)
			{
				unsigned char* lpSrc;//指向原图像指针
				LONG i,j;
//	int dTemp;//中间变量
	//图像每行的字节数
    LONG lLineBytes;
    lLineBytes=WIDTHBYTES(ww*8);
	double *f=new double[8*8];//分配内存f时域F频域
	double *F=new double[8*8];
	memset(F, 0, sizeof(double) * 8 * 8);//F赋初值
	int x_Block,y_Block;
	switch(Block_num)
	{
	case 1:x_Block=0;y_Block=0;break;
	case 2:x_Block=0;y_Block=8;break;
	case 3:x_Block=8;y_Block=0;break;
	case 4:x_Block=8;y_Block=8;break;
	}
	//i,x_Block指行;j,y_Block指列
	for(i=0;i<8;i++)
	{
		for(j=0;j<8;j++)
		{
			lpSrc=(unsigned char*)Image+lLineBytes*(hh-1-i-x_Block-GOB_num*16)+j+MB_num*16+y_Block;
			f[j+i*8]=*(lpSrc);
		}
	}

    // 正变换
	if(n==0)
	    DCT(f,F,3);
	else if(n==1)
		FDT(f,F);

    F[0]/=8;
    for(i=1;i<64;i++)
	{
		F[i]/=8;       //F[i]/=quant[GOB_num*22*4+MB_num*4+Block_num];
		if(F[i]>127){F[i]=127;}
		else if(F[i]<-127){F[i]=-127;}
	}

	for(i=0;i<8;i++)
		for(j=0;j<8;j++)
			ImageToRe[(i+x_Block+GOB_num*16)*lLineBytes+j+MB_num*16+y_Block]=F[j+i*8];


	// 反变换
	int tempp;
    for(i=0;i<64;i++)
	{tempp=(int)F[i];
	f[i]=(double)tempp;}
	{   f[0]*=8;
		for(i=1;i<64;i++) //f[i]*=quant[GOB_num*22*4+MB_num*4+Block_num];
		  f[i]*=8;
		if(n==0)
   		   IDCT(f,F,3);
		else if(n==1)
           IFDT(f,F);
	}
	for(i=0;i<8;i++)
		for(j=0;j<8;j++)
			finalImage[(i+x_Block+GOB_num*16)*lLineBytes+j+MB_num*16+y_Block]=F[j+i*8];
	delete f;
	delete F;	
	}}}
	
	// 显示
	DisplayImage(ww,hh,512,TRUE,ImageToRe);
	Sleep(500);
	if(reconstruct)
       DisplayImage(ww,hh,512,TRUE,finalImage);
	delete finalImage;
	delete ImageToRe;
}

void CLiftingschemeView::DCT(double *f, double *F, int r)
{
	// 离散余弦变换点数
    int	count;
	count = 1<<r;
	// 循环变量
	int		m,n,x;
	// 中间变量
    double *dTemp=new double[count*count];
    double *coff=new double[count];

	// 设定系数coff
	coff[0]=1/sqrt(count);
	for(m=1;m<count;m++)
	{	coff[m]=sqrt(2)/sqrt(count);
	}
	//dTemp赋初值
	memset(dTemp, 0, sizeof(double) * count * count);
	memset(F, 0, sizeof(double) * count * count);
	// 求F[m,n]	
	for(n=0; n< count; n++)
	{
		for(m=0; m< count; m++)
		{
			for(x=0; x< count; x++)
			{
		    	dTemp[m*count+n]+=f[x*count+n]*coff[m]*cos((2*x+1)*PI*m/(2*count));
			}
		}
	}

   for(m=0; m< count; m++)
	{
    	for(n=0; n< count; n++)	
		{
			for(x=0; x< count; x++)
			{
				F[m*count+n]+=dTemp[m*count+x]*coff[n]*cos((2*x+1)*PI*n/(2*count));
			}
		}
	}
		
	// 释放内存
	delete dTemp;
	delete coff;
}

void CLiftingschemeView::IDCT(double *F, double *f, int r)
{
// 离散余弦变换点数
    int	count;
	count = 1<<r;

	int		m,y,x;
    double *dTemp=new double[count*count];
    double *coff=new double[count];

	// 设定系数coff
	coff[0]=1/sqrt(count);
	for(m=1;m<count;m++)
	{	coff[m]=sqrt(2)/sqrt(count);
	}
	//dTemp赋初值
	memset(dTemp, 0, sizeof(double) * count * count);
	memset(f, 0, sizeof(double) * count * count);
	// 求F[m,n]	
	for(x=0; x< count; x++)
    	for(y=0; y< count; y++)	
			for(m=0; m< count; m++)
				dTemp[x*count+y]+=F[x*count+m]*coff[m]*cos((2*y+1)*PI*m/(2*count));
	for(y=0; y< count; y++)
		for(x=0; x< count; x++)
			for(m=0; m< count; m++)
		    	f[x*count+y]+=dTemp[m*count+y]*coff[m]*cos((2*x+1)*PI*m/(2*count));
		
	// 释放内存
	delete dTemp;
	delete coff;
}

void CLiftingschemeView::FDT(double *block, double *coeff)
{
  int        j1, i, j, k;
  float	b[8];
  float        b1[8];
  float        d[8][8];
  float f0=(float).7071068;
  float f1=(float).4903926;
  float f2=(float).4619398;
  float f3=(float).4157348;
  float f4=(float).3535534;
  float f5=(float).2777851;
  float f6=(float).1913417;
  float f7=(float).0975452;

  for (i = 0, k = 0; i < 8; i++, k += 8) {
    for (j = 0; j < 8; j++) {
      b[j] = (float)block[k+j];
    }
    /* Horizontal transform */
    for (j = 0; j < 4; j++) {
      j1 = 7 - j;
      b1[j] = b[j] + b[j1];
      b1[j1] = b[j] - b[j1];
    }
    b[0] = b1[0] + b1[3];
    b[1] = b1[1] + b1[2];
    b[2] = b1[1] - b1[2];
    b[3] = b1[0] - b1[3];
    b[4] = b1[4];
    b[5] = (b1[6] - b1[5]) * f0;
    b[6] = (b1[6] + b1[5]) * f0;
    b[7] = b1[7];
    d[i][0] = (b[0] + b[1]) * f4;
    d[i][4] = (b[0] - b[1]) * f4;
    d[i][2] = b[2] * f6 + b[3] * f2;
    d[i][6] = b[3] * f6 - b[2] * f2;
    b1[4] = b[4] + b[5];
    b1[7] = b[7] + b[6];
    b1[5] = b[4] - b[5];
    b1[6] = b[7] - b[6];
    d[i][1] = b1[4] * f7 + b1[7] * f1;
    d[i][5] = b1[5] * f3 + b1[6] * f5;
    d[i][7] = b1[7] * f7 - b1[4] * f1;
    d[i][3] = b1[6] * f3 - b1[5] * f5;
  }
  /* Vertical transform */
  for (i = 0; i < 8; i++) {
    for (j = 0; j < 4; j++) {
      j1 = 7 - j;
      b1[j] = d[j][i] + d[j1][i];
      b1[j1] = d[j][i] - d[j1][i];
    }
    b[0] = b1[0] + b1[3];
    b[1] = b1[1] + b1[2];
    b[2] = b1[1] - b1[2];
    b[3] = b1[0] - b1[3];
    b[4] = b1[4];
    b[5] = (b1[6] - b1[5]) * f0;
    b[6] = (b1[6] + b1[5]) * f0;
    b[7] = b1[7];
    d[0][i] = (b[0] + b[1]) * f4;
    d[4][i] = (b[0] - b[1]) * f4;
    d[2][i] = b[2] * f6 + b[3] * f2;
    d[6][i] = b[3] * f6 - b[2] * f2;
    b1[4] = b[4] + b[5];
    b1[7] = b[7] + b[6];
    b1[5] = b[4] - b[5];
    b1[6] = b[7] - b[6];
    d[1][i] = b1[4] * f7 + b1[7] * f1;
    d[5][i] = b1[5] * f3 + b1[6] * f5;
    d[7][i] = b1[7] * f7 - b1[4] * f1;
    d[3][i] = b1[6] * f3 - b1[5] * f5;
  }

  for (i = 0; i < 8; i++) {
    for (j = 0; j < 8; j++) {
      *(coeff+i*8+j) = (int)(d[i][j]);
    }
  }
}

void CLiftingschemeView::IFDT(double *coeff, double *block)
{
  int    j1, i, j;
  double b[8], b1[8], d[8][8];
  double f0=.7071068;
  double f1=.4903926;
  double f2=.4619398;
  double f3=.4157348;
  double f4=.3535534;
  double f5=.2777851;
  double f6=.1913417;
  double f7=.0975452;
  double e, f, g, h;

  /* Horizontal */

  /* Descan coefficients first */

  for (i = 0; i < 8; i++) {
    for (j = 0; j < 8; j++) {
      b[j] = *( coeff+i*8+j);
    }
    e = b[1] * f7 - b[7] * f1;
    h = b[7] * f7 + b[1] * f1;
    f = b[5] * f3 - b[3] * f5;
    g = b[3] * f3 + b[5] * f5;

    b1[0] = (b[0] + b[4]) * f4;
    b1[1] = (b[0] - b[4]) * f4;
    b1[2] = b[2] * f6 - b[6] * f2;
    b1[3] = b[6] * f6 + b[2] * f2;
    b[4] = e + f;
    b1[5] = e - f;
    b1[6] = h - g;
    b[7] = h + g;
    
    b[5] = (b1[6] - b1[5]) * f0;
    b[6] = (b1[6] + b1[5]) * f0;
    b[0] = b1[0] + b1[3];
    b[1] = b1[1] + b1[2];
    b[2] = b1[1] - b1[2];
    b[3] = b1[0] - b1[3];

    for (j = 0; j < 4; j++) {
      j1 = 7 - j;
      d[i][j] = b[j] + b[j1];
      d[i][j1] = b[j] - b[j1];
    }
  }

  /* Vertical */
  
  for (i = 0; i < 8; i++) {
    for (j = 0; j < 8; j++) {
      b[j] = d[j][i];
    }
    e = b[1] * f7 - b[7] * f1;
    h = b[7] * f7 + b[1] * f1;
    f = b[5] * f3 - b[3] * f5;
    g = b[3] * f3 + b[5] * f5;

    b1[0] = (b[0] + b[4]) * f4;
    b1[1] = (b[0] - b[4]) * f4;
    b1[2] = b[2] * f6 - b[6] * f2;
    b1[3] = b[6] * f6 + b[2] * f2;
    b[4] = e + f;
    b1[5] = e - f;
    b1[6] = h - g;
    b[7] = h + g;

    b[5] = (b1[6] - b1[5]) * f0;
    b[6] = (b1[6] + b1[5]) * f0;
    b[0] = b1[0] + b1[3];
    b[1] = b1[1] + b1[2];
    b[2] = b1[1] - b1[2];
    b[3] = b1[0] - b1[3];

    for (j = 0; j < 4; j++) {
      j1 = 7 - j;
      d[j][i] = b[j] + b[j1];
      d[j1][i] = b[j] - b[j1];
    }
  }

  for (i = 0; i < 8; i++) {
    for (j = 0; j < 8; j++) {
      *(block + i * 8 + j) = mnint(d[i][j]);
    }
  }

}

void CLiftingschemeView::OnTransDCT2() 
{
	CChoose dlg;
	BOOL reconstruct;
	if(dlg.DoModal()==IDOK)
		reconstruct=TRUE;
	else
		reconstruct=FALSE;
    DCTtransform(m_pImageData,m_orgWidth,m_orgHeight,reconstruct,1);	
}

void CLiftingschemeView::FFT(complex<double> * TD, complex<double> * FD, int r)
{
	// 付立叶变换点数
	LONG	count;
	
	// 循环变量
	int		i,j,k;
	
	// 中间变量
	int		bfsize,p;
	
	// 角度
	double	angle;
	
	complex<double> *W,*X1,*X2,*X;
	
	// 计算付立叶变换点数
	count = 1 << r;
	
	// 分配运算所需存储器
	W  = new complex<double>[count / 2];
	X1 = new complex<double>[count];
	X2 = new complex<double>[count];
	
	// 计算加权系数
	for(i = 0; i < count / 2; i++)
	{
		angle = -i * PI * 2 / count;
		W[i] = complex<double> (cos(angle), sin(angle));
	}
	
	// 将时域点写入X1
	memcpy(X1, TD, sizeof(complex<double>) * count);
	
	// 采用蝶形算法进行快速付立叶变换
	for(k = 0; k < r; k++)
	{
		for(j = 0; j < 1 << k; j++)
		{
			bfsize = 1 << (r-k);
			for(i = 0; i < bfsize / 2; i++)
			{
				p = j * bfsize;
				X2[i + p] = X1[i + p] + X1[i + p + bfsize / 2];
				X2[i + p + bfsize / 2] = (X1[i + p] - X1[i + p + bfsize / 2]) * W[i * (1<<k)];
			}
		}
		X  = X1;
		X1 = X2;
		X2 = X;
	}
	
	// 重新排序
	for(j = 0; j < count; j++)
	{
		p = 0;
		for(i = 0; i < r; i++)
		{
			if (j&(1<<i))
			{
				p+=1<<(r-i-1);
			}
		}
		FD[j]=X1[p];
	}
	
	// 释放内存
	delete W;
	delete X1;
	delete X2;
}

void CLiftingschemeView::IFFT(complex<double> * FD, complex<double> * TD, int r)
{
	// 付立叶变换点数
	LONG	count;
	
	// 循环变量
	int		i;
	
	complex<double> *X;
	
	// 计算付立叶变换点数
	count = 1 << r;
	
	// 分配运算所需存储器
	X = new complex<double>[count];
	
	// 将频域点写入X
	memcpy(X, FD, sizeof(complex<double>) * count);
	
	// 求共轭
	for(i = 0; i < count; i++)
	{
		X[i] = complex<double> (X[i].real(), -X[i].imag());
	}
	
	// 调用快速付立叶变换
	FFT(X, TD, r);
	
	// 求时域点的共轭
	for(i = 0; i < count; i++)
	{
		TD[i] = complex<double> (TD[i].real() / count, -TD[i].imag() / count);
	}
	
	// 释放内存
	delete X;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -