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

📄 image_bw.cpp

📁 设计并实现了两种分层多描述视频编码器.通过对小波域的运动估计算法进行了分析和研究
💻 CPP
📖 第 1 页 / 共 2 页
字号:

    for (i = 0; i < nx; i++) {
      memcpy(in_line, coeff[i], ny * sizeof(Pel_Type));
#ifdef LOSSLESS
      SP_Transform(my, in_line, coeff[i], coeff[i] + my); } }
#else
      Reflection(in_line, in_line + ny - 1);
      for (j = 0, t = in_line; j < my; j++) {
        coeff[i][j] = Filter_L(T_LowPass, t++);
        coeff[i][j+my] = Filter_H(T_HighPass, t++); } } }
#endif

  delete [] temp_line;
//  levels=-1;

}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -void Image_BW::recover(void){  if (levels <= 0) Error("cannot recover < Image_BW >");  Chronometer cpu_time;  cpu_time.start("\n  Starting inverse transformation...");#ifdef LOSSLESS  int i = 0, j = Max(dim.x, dim.y), k = j << 1;#else  int i = NumbTap, j = 0, k = Max(dim.x, dim.y) + (i << 1);#endif  CREATE_VECTOR(temp_line, k, Pel_Type, M_MSG);  Pel_Type * t, * in_line = temp_line + i, * out_line = in_line + j;  int mx, my, nx = dim.x >> levels, ny = dim.y >> levels;  Pel_Type s=0, mse, psnr, peak_2=65025.0;// add mean  for (i = 0; i < nx; i++)    for (j = 0; j < ny; j++) coeff[i][j] += mean;// inverse hierarchical subband or S+P transformation  for (int lv = 0; lv < levels; lv++) {  // shifts are doubled    mx = nx;  nx <<= 1;  my = ny;  ny <<= 1;  // inverse transformation of rows    for (i = 0; i < nx; i++) {#ifdef LOSSLESS      memcpy(in_line, coeff[i], ny * sizeof(Pel_Type));      SP_Recover(my, in_line, in_line + my, coeff[i]); }#else      for (j = 0, t = in_line; j < my; j++) {        *(t++) = coeff[i][j];  *(t++) = coeff[i][j+my]; }      Reflection(in_line, in_line + ny - 1);      for (j = 0, t = in_line; j < ny;) {        coeff[i][j++] = Filter_H(R_HighPass, t++);        coeff[i][j++] = Filter_L(R_LowPass, t++); } }#endif  // inverse transformation of columns    for (j = 0; j < ny; j++) {#ifdef LOSSLESS      for (i = 0; i < nx; i++) in_line[i] = coeff[i][j];      SP_Recover(mx, in_line, in_line + mx, out_line);      for (i = 0; i < nx; i++) coeff[i][j] = out_line[i]; } }#else      for (i = 0, t = in_line; i < mx; i++) {        *(t++) = coeff[i][j];  *(t++) = coeff[i+mx][j]; }      Reflection(in_line, in_line + nx - 1);      for (i = 0, t = in_line; i < nx;) {        coeff[i++][j] = Filter_H(R_HighPass, t++);        coeff[i++][j] = Filter_L(R_LowPass, t++); } } }#endif

  mse = compare(0,"input.y");
  if (mse > 0.0) {
  psnr = dBW(peak_2 / mse);
  printf("mean squared-error =%8.3f =%7.2f dB PSNR\n", mse, psnr); }

	 
/*  for (i = 0; i < 144; i++)
    for (j = 0; j < 176; j++)  s+=coeff[i][j] ;

  long mean1 = Round((s / double(144)) / 176);
  for (i = 0; i < 144; i++)
    for (j = 0; j < 176; j++)  coeff[i][j]-=mean1;
  for(i=0;i<10;i++)
	  for(int j=0;j<10;j++)
		  printf("coeff[%d][%d]=%f",i,j,coeff[i][j]);*/
		    levels = 0;  delete [] temp_line;  cpu_time.display(" Image transformed in");}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

void Image_BW::recover(unsigned char ** Wcoeff)
{
  
  if (levels <= 0) Error("cannot recover < Image_BW >");

  Chronometer cpu_time;
  cpu_time.start("\n  Starting inverse transformation...");

#ifdef LOSSLESS
  int i = 0, j = Max(dim.x, dim.y), k = j << 1;
#else
  int i = NumbTap, j = 0, k = Max(dim.x, dim.y) + (i << 1);
#endif
  CREATE_VECTOR(temp_line, k, Pel_Type, M_MSG);
  Pel_Type * t, * in_line = temp_line + i, * out_line = in_line + j;

  int mx, my, nx = dim.x >> levels, ny = dim.y >> levels;
  Pel_Type s=0;
  double mse, psnr,peak_2 = 65025.0;

// add mean

  for (i = 0; i < nx; i++)
    for (j = 0; j < ny; j++) coeff[i][j] += mean;

// inverse hierarchical subband or S+P transformation

  for (int lv = 0; lv < levels; lv++) {

  // shifts are doubled

    mx = nx;  nx <<= 1;  my = ny;  ny <<= 1;

  // inverse transformation of rows

    for (i = 0; i < nx; i++) {
#ifdef LOSSLESS
      memcpy(in_line, coeff[i], ny * sizeof(Pel_Type));
      SP_Recover(my, in_line, in_line + my, coeff[i]); }
#else
      for (j = 0, t = in_line; j < my; j++) {
        *(t++) = coeff[i][j];  *(t++) = coeff[i][j+my]; }
      Reflection(in_line, in_line + ny - 1);
      for (j = 0, t = in_line; j < ny;) {
        coeff[i][j++] = Filter_H(R_HighPass, t++);
        coeff[i][j++] = Filter_L(R_LowPass, t++); } }
#endif

  // inverse transformation of columns

    for (j = 0; j < ny; j++) {
#ifdef LOSSLESS
      for (i = 0; i < nx; i++) in_line[i] = coeff[i][j];
      SP_Recover(mx, in_line, in_line + mx, out_line);
      for (i = 0; i < nx; i++) coeff[i][j] = out_line[i]; } }
#else
      for (i = 0, t = in_line; i < mx; i++) {
        *(t++) = coeff[i][j];  *(t++) = coeff[i+mx][j]; }
      Reflection(in_line, in_line + nx - 1);
      for (i = 0, t = in_line; i < nx;) {
        coeff[i++][j] = Filter_H(R_HighPass, t++);
        coeff[i++][j] = Filter_L(R_LowPass, t++); } } }
#endif
	 
  for (i = 0; i < 144; i++)
    for (j = 0; j < 176; j++)  
	{
		s+=coeff[i][j];
		Wcoeff[i][j]=coeff[i][j]+0.5;
	}

  levels = 0; 
	
  mse = compare(0,"input.y");
  if (mse > 0.0) {
  psnr = dBW(peak_2 / mse);
  printf("mean squared-error =%8.3f =%7.2f dB PSNR\n", mse, psnr); }

  long mean1 = Round((s / double(144)) / 176);
  for (i = 0; i < 144; i++)
    for (j = 0; j < 176; j++)  coeff[i][j]-=mean1;
/*  for(i=0;i<10;i++)
	  for(int j=0;j<10;j++)
		  printf("coeff[%d][%d]=%f",i,j,coeff[i][j]);*/
		  
   delete [] temp_line;
  cpu_time.display(" Image transformed in");
  

}

// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

void Image_BW::recover(long mean)
{
  if (levels <= 0) Error("cannot recover < Image_BW >");

  Chronometer cpu_time;
  cpu_time.start("\n  Starting inverse transformation...");

#ifdef LOSSLESS
  int i = 0, j = Max(dim.x, dim.y), k = j << 1;
#else
  int i = NumbTap, j = 0, k = Max(dim.x, dim.y) + (i << 1);
#endif
  CREATE_VECTOR(temp_line, k, Pel_Type, M_MSG);
  Pel_Type * t, * in_line = temp_line + i, * out_line = in_line + j;

  int mx, my, nx = dim.x >> levels, ny = dim.y >> levels;
  Pel_Type s=0;

// add mean

/*  for (i = 0; i < nx; i++)
    for (j = 0; j < ny; j++) coeff[i][j] += mean;*/

// inverse hierarchical subband or S+P transformation

  for (int lv = 0; lv < levels; lv++) {

  // shifts are doubled

    mx = nx;  nx <<= 1;  my = ny;  ny <<= 1;

  // inverse transformation of rows

    for (i = 0; i < nx; i++) {
#ifdef LOSSLESS
      memcpy(in_line, coeff[i], ny * sizeof(Pel_Type));
      SP_Recover(my, in_line, in_line + my, coeff[i]); }
#else
      for (j = 0, t = in_line; j < my; j++) {
        *(t++) = coeff[i][j];  *(t++) = coeff[i][j+my]; }
      Reflection(in_line, in_line + ny - 1);
      for (j = 0, t = in_line; j < ny;) {
        coeff[i][j++] = Filter_H(R_HighPass, t++);
        coeff[i][j++] = Filter_L(R_LowPass, t++); } }
#endif

  // inverse transformation of columns

    for (j = 0; j < ny; j++) {
#ifdef LOSSLESS
      for (i = 0; i < nx; i++) in_line[i] = coeff[i][j];
      SP_Recover(mx, in_line, in_line + mx, out_line);
      for (i = 0; i < nx; i++) coeff[i][j] = out_line[i]; } }
#else
      for (i = 0, t = in_line; i < mx; i++) {
        *(t++) = coeff[i][j];  *(t++) = coeff[i+mx][j]; }
      Reflection(in_line, in_line + nx - 1);
      for (i = 0, t = in_line; i < nx;) {
        coeff[i++][j] = Filter_H(R_HighPass, t++);
        coeff[i++][j] = Filter_L(R_LowPass, t++); } } }
#endif

  for (i = 0; i < 144; i++)
    for (j = 0; j < 176; j++) coeff[i][j] += mean;
	 
/*  for(i=0;i<10;i++)
	  for(int j=0;j<10;j++)
		  printf("coeff[%d][%d]=%f",i,j,coeff[i][j]);*/
		  
  levels = 0;  delete [] temp_line;
  cpu_time.display(" Image transformed in");
}

//----------------------------------------------------------------------

void Image_BW::recover(long mean, Pel_Type ** recoeff)
{
  if (levels <= 0) Error("cannot recover < Image_BW >");

  Chronometer cpu_time;
  cpu_time.start("\n  Starting inverse transformation...");

#ifdef LOSSLESS
  int i = 0, j = Max(dim.x, dim.y), k = j << 1;
#else
  int i = NumbTap, j = 0, k = Max(dim.x, dim.y) + (i << 1);
#endif
  CREATE_VECTOR(temp_line, k, Pel_Type, M_MSG);
  Pel_Type * t, * in_line = temp_line + i, * out_line = in_line + j;

  int mx, my, nx = dim.x >> levels, ny = dim.y >> levels;
  Pel_Type s=0;

// add mean

/*  for (i = 0; i < nx; i++)
    for (j = 0; j < ny; j++) coeff[i][j] += mean;*/

// inverse hierarchical subband or S+P transformation

  for (int lv = 0; lv < levels; lv++) {

  // shifts are doubled

    mx = nx;  nx <<= 1;  my = ny;  ny <<= 1;

  // inverse transformation of rows

    for (i = 0; i < nx; i++) {
#ifdef LOSSLESS
      memcpy(in_line, coeff[i], ny * sizeof(Pel_Type));
      SP_Recover(my, in_line, in_line + my, coeff[i]); }
#else
      for (j = 0, t = in_line; j < my; j++) {
        *(t++) = coeff[i][j];  *(t++) = coeff[i][j+my]; }
      Reflection(in_line, in_line + ny - 1);
      for (j = 0, t = in_line; j < ny;) {
        coeff[i][j++] = Filter_H(R_HighPass, t++);
        coeff[i][j++] = Filter_L(R_LowPass, t++); } }
#endif

  // inverse transformation of columns

    for (j = 0; j < ny; j++) {
#ifdef LOSSLESS
      for (i = 0; i < nx; i++) in_line[i] = coeff[i][j];
      SP_Recover(mx, in_line, in_line + mx, out_line);
      for (i = 0; i < nx; i++) coeff[i][j] = out_line[i]; } }
#else
      for (i = 0, t = in_line; i < mx; i++) {
        *(t++) = coeff[i][j];  *(t++) = coeff[i+mx][j]; }
      Reflection(in_line, in_line + nx - 1);
      for (i = 0, t = in_line; i < nx;) {
        coeff[i++][j] = Filter_H(R_HighPass, t++);
        coeff[i++][j] = Filter_L(R_LowPass, t++); } } }
#endif
   
  
  
  for (i = 0; i < 144; i++)
    for (j = 0; j < 176; j++) 
	{
		recoeff[i][j]=coeff[i][j];
		coeff[i][j] += mean;
	}
	 
/*  for(i=0;i<10;i++)
	  for(int j=0;j<10;j++)
		  printf("coeff[%d][%d]=%f",i,j,coeff[i][j]);*/
		  
  levels = 0;  delete [] temp_line;
  cpu_time.display(" Image transformed in");

}
// = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =void Image_BW::decimate(int select, int level1) 
{
  int i, j, mx = dim.x, my = dim.y;
  for (i = 0; i < mx; i++)
    for (j = select; j < my; j+=2) 
		if (fabs(coeff[i][j])<level1) coeff[i][j]=.0;
}
/*
void Image_BW::decimate1(int s, int level1) //对1,2,3的特殊处理,描述1,2-->1
{
  int i, j, mx = dim.x, my = dim.y, k, k1=level1>>1, k2=level1>>2;
  for (i = 0; i < mx; i++)
    for (j = 0; j < my; j++) 
		if ((k=(int)fabs(coeff[i][j]))<level1 && k>=k2 ) {//相当于原先对1,2,3的处理。2=(1,0),3=(1,1),1=(0,1)
			if (!s) coeff[i][j]/=2.;//描述1,去掉倒数第1位
			else if(k>=<k1) {//描述2,去掉倒数第2位
				if (coeff[i][j]>0) coeff[i][j]-=(double)k1;
				else coeff[i][j]+=(double)k1;
			}
			else if(k<k1+k2) coeff[i][j]=0;//描述2,2-->0
		}
}
*/
void Image_BW::decimate2(int level1) //对1,2,3的特殊处理
{
  int i, j, mx = dim.x, my = dim.y, k, k1=level1>>1, k2=level1>>2;
  for (i = 0; i < mx; i++)
    for (j = 0; j < my; j++) 
		if ((k=(int)fabs(coeff[i][j]))<level1 && k>=k2 ) {//相当于原先对1,2,3的处理。2=(1,0),3=(1,1),1=(0,1)
			if(k<k1) {//描述2,1-->2
				if (coeff[i][j]>0) coeff[i][j]+=(double)k2;
				else coeff[i][j]-=(double)k2;
			}
			else if(k<k1+k2) coeff[i][j]=0;//描述2,2-->0
		}
}

void Image_BW::coewrite(void)
{   
	int i,j;
	FILE * cmp_file = fopen("cmpfile", "wb");
    for (i=0;i<512;i++)
		for(j=0;j<512;j++) 
		  fwrite(&coeff[i][j], sizeof(double), 1, cmp_file);
    fclose (cmp_file);
}

void Image_BW::coecmp(void)
{  
	int i,j;
	double cmp[144][176],m1;//512,512
	FILE * cmp_file = fopen("cmpfile", "rb");
    for (i=0;i<dim.x;i++)
		for (j=0;j<dim.y;j++) {
		  fread(&cmp[i][j], sizeof(double), 1, cmp_file);
		  if (fabs(cmp[i][j]-coeff[i][j])>16.) {
			  printf("error\n");
		  }
		}
  fclose (cmp_file);
}
/*
void Image_BW::upsample(int select, int level1) 
{
  int i, j, mx = dim.x, my = dim.y, k=level1>>1;
  double d1;
  for (i = 0; i < mx; i++)
    for (j = select; j < my; j+=2) 
		if ((d1=fabs(coeff[i][j]))<level1 && d1>=(double)k) coeff[i][j]*=2;
}

void Image_BW::decimate1(int select, int level1) 
{
  int i, j, i1, j1, k, Bsize=2, mx = dim.x >>level1, my = dim.y>>level1;
  for (k=0; k<level1; k++) {
	  for (i = 0; i < mx; i+=Bsize) {
		for (j = select*Bsize; j < my; j+=Bsize) {
			for (i1=0; i1<Bsize; i1++) {
				for (j1=0; j1<Bsize; j1++) {
					coeff[i+i1][j+my+j1]=.0;
					coeff[i+mx+i1][j+j1]=.0;
					coeff[i+mx+i1][j+my+j1]=.0;
				}
			}
		}
	  }
	  mx<<=1; my<<=1; Bsize<<=1;
  }
}
*/
void Image_BW::coe(double gene) //把系数乘上一个常数
{
  int i, j, mx = dim.x, my = dim.y;
  for (i = 0; i < mx; i++)
    for (j = 0; j < my; j++) 
	   coeff[i][j]=gene*coeff[i][j];
}

void Image_BW::coeP(double gene,Pel_Type** DePcoeff)
{
  int i, j, mx = dim.x, my = dim.y;
  for (i = 0; i < mx; i++)
    for (j = 0; j < my; j++) 
	   DePcoeff[i][j]=gene*DePcoeff[i][j];
}

void Image_BW::coeprintf(void) 
{
  int i, j, mx = dim.x, my = dim.y, n;
  FILE *outfile=fopen("outcoe","wb");
  fprintf(outfile, "   ");
  for (i = 0; i < my; i++)  fprintf(outfile, "%5d",i);
  fprintf(outfile, "\n");
  for (i = 0; i < mx; i++) {
	  fprintf(outfile, "%3d",i);
	  for (j = 0; j < my; j++) {
		  n=int(coeff[i][j]+.5);
		  fprintf(outfile, "%5d",n); }
	  fprintf(outfile, "\n");
  }
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void Image_BW::decimate1(int select, int level1) //对于小于level1的树枝,两树删一
{
  int i, j, i1, j1, k, Bsize=2, mx = dim.x >>(levels), my = dim.y>>(levels);
  for (k=0; k<levels; k++) {
	  for (i = 0; i < mx; i+=Bsize) {
		for (j = select*Bsize; j < my; j+=Bsize) {
			for (i1=0; i1<Bsize; i1++) {
				for (j1=0; j1<Bsize; j1++) {
					if (fabs(coeff[i+i1][j+my+j1])<level1) coeff[i+i1][j+my+j1]=.0;
					if (fabs(coeff[i+mx+i1][j+j1])<level1) coeff[i+mx+i1][j+j1]=.0;
					if (fabs(coeff[i+mx+i1][j+my+j1])<level1) coeff[i+mx+i1][j+my+j1]=.0;
				}
			}
			j+=Bsize;
		}
		i+=Bsize;
	  }
	  mx<<=1; my<<=1; Bsize<<=1;
  }
}
//-----------------------------------------------------------------------------
void Image_BW::recall(int level1)
{
	int i, j;
	for (i=0; i<dim.x; i++)
		for (j=0; j<dim.y; j++) coeff[i][j] = coeff1[i][j];
	levels = level1;
}

// end of file  < Image_BW.C >

⌨️ 快捷键说明

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