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

📄 sptransform.cpp

📁 图像无损压缩 TI常用例程 希望能对大家有所帮助
💻 CPP
字号:
// SPTransform.cpp: implementation of the CSPTransform class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "HIC.h"
#include "SPTransform.h"
#include "math.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CSPTransform::CSPTransform()
{

}

CSPTransform::~CSPTransform()
{

}

void CSPTransform::Dwt1D(int *buffer, int buflen)
{
  float *l,*h,*d;
  float  *h1;
  l=new float[buflen/2];
  h=new float [buflen/2];
  d=new float [buflen/2];
  h1=new float [buflen/2];

  //S变换
  int i,j;
  for(i=0;i<buflen;i=i+2)
  {
	  l[i/2]=int(floor((buffer[i]+buffer[i+1])/2.));
	  h[i/2]=buffer[i]-buffer[i+1]; 
  }

  //预测
  for(i=1;i<buflen/2-1;i++)
  {
	  h1[i]=(2*l[i-1]+l[i]-3*l[i+1]-2*h[i+1])/8;
      d[i]=h[i]-int(floor((h1[i]+0.5)));
  }
  
  //边界处理 
  h1[0]=(l[0]-l[1])/4;
  h1[buflen/2-1]=(l[buflen/2-2]-l[buflen/2-1])/4;

  d[0]=h[0]-int(floor(h1[0]+0.5));
  d[buflen/2-1]=h[buflen/2-1]-int(floor(h1[buflen/2-1]+0.5));

  for(i=0;i<buflen/2;i++)
  {
     buffer[i]=l[i];
	 buffer[buflen/2+i]=d[i];
  }

  delete []l;
  delete []h;
  delete []d;
  delete []h1;

}



void CSPTransform::Dwt1D(int *buffer, int width, int lv)
{
	int j,k;
 	int nwidth;
	int *pbuffer;
 
	for ( k=0; k<lv; k++)
	{
       nwidth=width>>k;
       pbuffer = new int [nwidth];
   
	   for(j=0; j<nwidth; j++)
		  *(pbuffer+j) = *(buffer+j);
			
	      Dwt1D(pbuffer,nwidth);
			
	   for(j=0; j<nwidth; j++)
		 *(buffer+j) = *(pbuffer+j);
	 }
		
		delete []pbuffer;

}

void CSPTransform::IDwt1D(int *buffer, int buflen)
{
  float *l,*h,*d;
  float *h1;
  l=new float[buflen/2];
  h=new float[buflen/2];
  d=new float[buflen/2];
  h1=new float[buflen/2];

  int i,j;
  
  for(i=0;i<buflen/2;i++)
  {
     l[i]=buffer[i];
	 d[i]=buffer[buflen/2+i];
  }

  h1[0]=(l[0]-l[1])/4;
  h1[buflen/2-1]=(l[buflen/2-2]-l[buflen/2-1])/4;
  h[0]=d[0]+int(floor(h1[0]+0.5));
  h[buflen/2-1]=d[buflen/2-1]+int(floor(h1[buflen/2-1]+0.5));
  
  for(i=0;i<buflen/2-2;i++)
  {
  h1[buflen/2-2-i]=(2*l[buflen/2-3-i]+l[buflen/2-2-i]-3*l[buflen/2-1-i]-2*h[buflen/2-1-i])/8;
  h[buflen/2-2-i]=d[buflen/2-2-i]+int(floor(h1[buflen/2-2-i]+0.5));
 
  }
 
  for(i=0;i<buflen;i=i+2)
  {
     buffer[i]=int(floor((2*l[i/2]+h[i/2])/2+0.5));
	 buffer[i+1]=int(floor((2*l[i/2]-h[i/2])/2+0.5));
  }
  delete []l;
  delete []h;
  delete []d;
  delete []h1;


}

void CSPTransform::Dwt2D(int *buffer, int height, int width, int lv)
{
	int i,j,k;
 	int nheight,nwidth;
	int *pbuffer1,*pbuffer2;
 
	for ( k=0; k<lv; k++)
	{
       nheight=height>>k;
	   nwidth=width>>k;

	   pbuffer1 = new int [nheight];	 
	   pbuffer2 = new int [nwidth];
         
		//列变换
		for(j=0; j<nwidth; j++)
		{
			for (i=0; i<nheight; i++)
				*(pbuffer2+i)= *(buffer+i*width+j);

			Dwt1D(pbuffer2,nheight);
			
			for(i=0; i<nheight; i++)
				 *(buffer+i*width+j) = *(pbuffer2+i);
		}
		delete []pbuffer2;
	
		 //行变换
	   for (i=0; i<nheight; i++)
		{
			for(j=0; j<nwidth; j++)
				*(pbuffer1+j) = *(buffer+i*width+j);
			
			Dwt1D(pbuffer1,nwidth);
			
			for(j=0; j<nwidth; j++)
				 *(buffer+i*width+j) = *(pbuffer1+j);
		}
		delete []pbuffer1;
	}

}

void CSPTransform::IDwt1D(int *buffer, int width, int lv)
{
	int j,k;
 	int nwidth;
	int *pbuffer;
	  
	for (k=0; k<lv; k++)
	{
	    nwidth=width>>(lv-k-1);
		pbuffer = new int [nwidth];
	    
		for(j=0; j<nwidth; j++)
 			*(pbuffer+j)=*(buffer+j);
 			IDwt1D(pbuffer,nwidth);
 		for(j=0; j<nwidth; j++)
 			*(buffer+j) = *(pbuffer+j);
 		
	}
	delete []pbuffer;

}

void CSPTransform::IDwt2D(int *buffer, int height, int width, int lv)
{
	int i,j,k;
 	int nheight,nwidth;
	int *pbuffer1,*pbuffer2;
	  
	for (k=0; k<lv; k++)
	{
		nheight=height>>(lv-k-1);
 		nwidth=width>>(lv-k-1);
	    
		pbuffer1 = new int [nheight];	 
	    pbuffer2 = new int [nwidth];
        
		 
        //行反变换
		for (i=0; i<nheight; i++)
		{
 			for(j=0; j<nwidth; j++)
 				*(pbuffer2+j)=*(buffer+i*width+j);
 			IDwt1D(pbuffer2,nwidth);
 			for(j=0; j<nwidth; j++)
 				 *(buffer+i*width+j) = *(pbuffer2+j);
 		}
		delete []pbuffer2;

		//列反变换
		for(j=0; j<nwidth; j++)
		{
 			for (i=0; i<nheight; i++)
 				*(pbuffer1+i) =  *(buffer+i*width+j);
 		
			IDwt1D(pbuffer1,nheight);
 			
			for(i=0; i<nheight; i++)
 				 *(buffer+i*width+j) = *(pbuffer1+i);
 		}
 		delete []pbuffer1;
		
 	}

}

⌨️ 快捷键说明

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