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

📄 no list spiht.txt

📁 无链表SPIHT算法
💻 TXT
字号:
图像压缩 无链表SPIHT算法,需要较小的内存
//input,输入小波系数矩阵;levels小波分解层数;wide图像宽 high 图像高
NLSPIHT(short *input, unsigned char *outbit, int levels, int wide,int high)

{   
    int index,i,j,indexlen,d,c,Idc, t;
	int skip[16],isskip[16];
	indexlen=wide*high;
	short *dmax, *gmax, *val,*sign;
    unsigned char *mark;
	sign=new short[indexlen];
    dmax=new short[indexlen/4];
    gmax=new short[indexlen/16];
    mark=new unsigned char[indexlen*16];
	
	val=new short[indexlen];
 
    //初始化
	this->SPIHTheight=high;	this->SPIHTwidth=wide;
	for (i=0;i<indexlen*16;i++) mark[i]=0;
	for (i=0;i<high;i++)
		for (j=0;j<wide;j++)
		{sign[i*wide+j]=0;}
	for (i=0;i<high;i++)
		for (j=0;j<wide;j++)
		{ index=SPIHTindex(i,j);
		  val[index]=abs(input[i*wide+j]);
		  if  (input[i*wide+j]<0) sign[index]=1;
		  else sign[index]=0;
		}
  /*/////程序调试
		CString QFile="c:\\blockcoding.txt";
       CString Signfile="c:\\blocksign.txt";
  FILE *stream1,*signstream1;
  int No=0;
  stream1 = fopen( QFile, "w" );
  signstream1=fopen( Signfile, "w" );
  for (i=0;i<high;i++)
   { 
	  fprintf( stream1, "%1s\n", " " );
	  fprintf(signstream1, "%1s\n", " " );
	  for (int j=0;j<wide;j++)  //width
	  {   if (sign[No]==0)  	  fprintf( stream1, "%7d", val[No] );
	      else if(sign[No]==1)    fprintf( stream1, "%7d", (-1)*val[No] );
	      
		  fprintf(signstream1, "%7d", sign[No] );
	  	  No=No+1;
	  }
	  fprintf( stream1, "%1s\n", " " );
	  fprintf(signstream1, "%1s\n", " " );
   }
   fclose( stream1 ); 
   fclose(signstream1); 
   ////////*/
   
     for (i=indexlen/16;i<indexlen/4;i++)
	 { dmax[i]=val[4*i]|val[4*i+1]|val[4*i+2]|val[4*i+3];
	   //if (dmax[i]<2) dmax[i]=0;
	   //val[4*i]=val[4*i+1]=val[4*i+2]=val[4*i+3]=0;
	   
	 }
	 if (indexlen/64>0)
	 {  for (i=indexlen/64;i<indexlen/16;i++)  gmax[i]=dmax[4*i]|dmax[4*i+1]|dmax[4*i+2]|dmax[4*i+3];
	    for (i=indexlen/64;i<indexlen/16;i++)  dmax[i]=val[4*i]|val[4*i+1]|val[4*i+2]|val[4*i+3]|gmax[i];
	    //if (dmax[i]<2) dmax[i]=0;
	//	if (gmax[i]<2) gmax[i]=0;
	 }
	 if (indexlen/256>0)
	 {  for (i=indexlen/256;i<indexlen/64;i++)	 gmax[i]=dmax[4*i]|dmax[4*i+1]|dmax[4*i+2]|dmax[4*i+3];
	    for (i=indexlen/256;i<indexlen/64;i++)	  dmax[i]=val[4*i]|val[4*i+1]|val[4*i+2]|val[4*i+3]|gmax[i];
	   // if (dmax[i]<2) dmax[i]=0;
	//	if (gmax[i]<2) gmax[i]=0;

	 }
	 if (indexlen/1024>0)
	 {  for (i=indexlen/1024;i<indexlen/256;i++)	 gmax[i]=dmax[4*i]|dmax[4*i+1]|dmax[4*i+2]|dmax[4*i+3];
	    for (i=indexlen/1024;i<indexlen/256;i++)	  dmax[i]=val[4*i]|val[4*i+1]|val[4*i+2]|val[4*i+3]|gmax[i];
	   // if (dmax[i]<2) dmax[i]=0;
	//	if (gmax[i]<2) gmax[i]=0;

	 }
	 if (indexlen/4096>0)
	 {  for (i=indexlen/4096;i<indexlen/1024;i++)	 gmax[i]=dmax[4*i]|dmax[4*i+1]|dmax[4*i+2]|dmax[4*i+3];
	    for (i=indexlen/4096;i<indexlen/1024;i++)	  dmax[i]=val[4*i]|val[4*i+1]|val[4*i+2]|val[4*i+3]|gmax[i];
	    
	 }
     if (indexlen/16384>0)
	 {  for (i=indexlen/16384;i<indexlen/4096;i++)	 gmax[i]=dmax[4*i]|dmax[4*i+1]|dmax[4*i+2]|dmax[4*i+3];
	    for (i=indexlen/16384;i<indexlen/4096;i++)	  dmax[i]=val[4*i]|val[4*i+1]|val[4*i+2]|val[4*i+3]|gmax[i];
	 }
	    if (indexlen/65536>0)
	 {  for (i=indexlen/65536;i<indexlen/16384;i++)	 gmax[i]=dmax[4*i]|dmax[4*i+1]|dmax[4*i+2]|dmax[4*i+3];
	    for (i=indexlen/65536;i<indexlen/16384;i++)	  dmax[i]=val[4*i]|val[4*i+1]|val[4*i+2]|val[4*i+3]|gmax[i];
	 }

	d=wide/int(pow(2,levels));
	c=high/int(pow(2,levels));
    Idc=d*c;
	unsigned char MIP=0,MNP=1,MSP=2,MCP=3,MD=4,MG=5;
	unsigned char MN2=8,MN3=9,MN4=10,MN5=11,MN6=12,MN7=13,MN8=14,MN9=15;
	for (i=0;i<16;i++) skip[i]=1;
	skip[MIP]=1;skip[MNP]=1;skip[MCP]=1;skip[MSP]=1;
    skip[MD]=4; skip[MG]=16; 
	skip[MN2]=16; skip[MN3]=64; skip[MN4]=256; 
	skip[MN5]=1024;skip[MN6]=4096; skip[MN7]=16384;
    for (i=0;i<16;i++) isskip[i]=0;
	isskip[MIP]=4;		isskip[MNP]=4;     isskip[MCP]=4; isskip[MSP]=4;
    isskip[MD]=4;		isskip[MG]=16; 
	isskip[MN2]=16;		isskip[MN3]=64;    isskip[MN4]=256; 
	isskip[MN5]=1024;	isskip[MN6]=4096;  isskip[MN7]=16384;
	for (i=0;i<Idc;i++) mark[i]=MIP;
	for (i=Idc;i<4*Idc;i++) 
	{mark[i]=MD;
	push(mark,i);}
    //主算法
    int outlocal=0,ql=this->Quan_levels;
	int s=int(pow(2,ql));
	// 非显著像素通道
 while(s>1)
 {  s=s/2;
	i=0;
	while (i<indexlen)
		{if (mark[i]==MIP) 
			{d=val[i] & s;
			this->BitWrite(outbit,outlocal,d);
			outlocal=outlocal+1;
			if (d>0)
				{
				BitWrite(outbit,outlocal,sign[i]);  //输出符号位
				outlocal=outlocal+1;
				mark[i]=MNP;
				}
		    i=i+1;
			}
	      else  i=i+skip[mark[i]];
		}
	  int debugpoint=0;
   i=0;
   t=0;
	while (i<indexlen)
	 {if( mark[i]==MD)
		{d=dmax[i/4] & s;
		 BitWrite(outbit,outlocal,d);  //输出符号位
		 outlocal=outlocal+1;
		if (d>0)
			{mark[i]=MCP; 
		     mark[i+1]=MCP;mark[i+2]=MCP;mark[i+3]=MCP;
			 if ((4*i)<indexlen) mark[4*i]=MG;
			}
		else i=i+4;
		}
	  else if(mark[i]==MG)
			{d=gmax[i/16]&s;
	         BitWrite(outbit,outlocal,d);
			 outlocal=outlocal+1;
	          if (d>0)
			  {mark[i]=mark[i+4]=MD;
			   mark[i+8]=mark[i+12]=MD;
			   if(i<(wide*high/4)){
			   push(mark,i);  push(mark,i+4);  push(mark,i+8);  push(mark,i+12);
			   }
			   }
			  else i=i+16;
			}
	  else 	if(mark[i]==MCP)
		/*
	  {   mark[i]=MIP;mark[i+1]=MIP; mark[i+2]=MIP; mark[i+3]=MIP;
		  int d0=0,d1=0,d2=0,d3=0,offset=0;
	      d0=val[i]&s;d1=val[i+1]&s;d2=val[i+2]&s;d3=val[i+3]&s;
		  if ((d0==0)&&(d1==0)&&(d2==0)&&(d3==0))    BitWrite(outbit,outlocal++,0);
		  else {BitWrite(outbit,outlocal++,1);
		        for (offset=0; offset<4;offset++)
				{d=val[i+offset]&s;
				 BitWrite(outbit,outlocal++,d); 
				 if (d>0)
				 {BitWrite(outbit,outlocal++,sign[i+offset]); mark[i+offset]=MNP;}
				}
			}
		  
		  i=i+4;
	  }
	  //*/
		/*
	  {   mark[i]=MIP;mark[i+1]=MIP; mark[i+2]=MIP; mark[i+3]=MIP;
		  int d0=0,d1=0,d2=0,d3=0,offset=0;
	      d0=val[i]&s;d1=val[i+1]&s;d2=val[i+2]&s;d3=val[i+3]&s;
		  if ((d0==0)&&(d1==0)&&(d2==0)&&(d3==0))    BitWrite(outbit,outlocal++,0);
		  else {BitWrite(outbit,outlocal++,1);
		      if (d0==1) offset=0;
	    	  if ((d0==0)&&(d1==1)) offset=1;
		      if ((d0==0)&&(d1==0)&&(d2==1))   offset=2;
              if ((d0==0)&&(d1==0)&&(d2==0)&&(d3==1))   offset=3;
              if (offset==0) {BitWrite(outbit,outlocal++,0); BitWrite(outbit,outlocal++,0);}
			  if(offset==1) {BitWrite(outbit,outlocal++,0); BitWrite(outbit,outlocal++,1);}
		      if(offset==2) {BitWrite(outbit,outlocal++,1); BitWrite(outbit,outlocal++,0);}
		      if(offset==3) {BitWrite(outbit,outlocal++,1); BitWrite(outbit,outlocal++,1);}
               BitWrite(outbit,outlocal++,sign[i+offset]); //写入第一个显著性系数的符号
		       mark[i+offset]=MNP;
               offset++;
			   while(offset<4)
				{ d=val[i+offset]&s;
				 BitWrite(outbit,outlocal++,d); 
				 if (d>0)
				 {BitWrite(outbit,outlocal++,sign[i+offset]); mark[i+offset]=MNP;}
				 offset++;
			   }
			}
		  
		  i=i+4;
	  }
	  //*/
			 /*
	  {   mark[i]=MIP;mark[i+1]=MIP; mark[i+2]=MIP; mark[i+3]=MIP;
		  int d0=0,d1=0,d2=0,d3=0,offset=0;
	      d0=val[i]&s;d1=val[i+1]&s;d2=val[i+2]&s;d3=val[i+3]&s;
		  if ((d0==0)&&(d1==0)&&(d2==0)&&(d3==0))  { BitWrite(outbit,outlocal++,0); offset=4;}
		  if (d0==1) offset=0;
		  if ((d0==0)&&(d1==1)) offset=1;
		  if ((d0==0)&&(d1==0)&&(d2==1))   offset=2;
          if ((d0==0)&&(d1==0)&&(d2==0)&&(d3==1))   offset=3;
		  
          if (offset<4) 
		   { BitWrite(outbit,outlocal++,1);
             //写入第一个显著性系数的位置信息
		     if (offset==0) {BitWrite(outbit,outlocal++,0); BitWrite(outbit,outlocal++,0);}
			 if(offset==1) {BitWrite(outbit,outlocal++,0); BitWrite(outbit,outlocal++,1);}
		     if(offset==2) {BitWrite(outbit,outlocal++,1); BitWrite(outbit,outlocal++,0);}
		     if(offset==3) {BitWrite(outbit,outlocal++,1); BitWrite(outbit,outlocal++,1);}
		     BitWrite(outbit,outlocal++,sign[i+offset]); //写入第一个显著性系数
		     mark[i+offset]=MNP;
	    	    offset++;
		   int sbits;
		   for( sbits=offset;sbits<4;sbits++)
			{ 
			 d=val[i+sbits]&s;
			 BitWrite(outbit,outlocal++,d); 
			 if (d>0)
				{BitWrite(outbit,outlocal++,sign[i+offset]);
				mark[i+sbits]=MNP;
				}
			 else mark[i+sbits]=MIP;
           
			}
		  }
		  i=i+4;
	  }
	  //*/
	
         //  /*
			  {
		      d=val[i]&s;
	          BitWrite(outbit,outlocal,d);  
			  outlocal=outlocal+1;
			  if (d>0)
			  {BitWrite(outbit,outlocal,sign[i]);
			   outlocal=outlocal+1;
			   mark[i]=MNP;}
			  else mark[i]=MIP;
			  i=i+1;
			  
			}
			//*/
		
	     else 
	  {   t=isskip[mark[i]];
		  i=i+t;
	  }
	 

	}  //while (i<indexlen)
    //精细化通道
	int ii=0;
     while (ii<indexlen)
	 { if (mark[ii]==MSP)
		{d=val[ii]&s;
	     BitWrite(outbit,outlocal,d);
		 d=0;
		outlocal=outlocal+1;
		ii=ii+1;}
	    
	   else if (mark[ii]==MNP)
	   {mark[ii]=MSP;
	   ii=ii+1;}
	   else 
	   {   t=skip[mark[ii]];
		   ii=ii+t;
	   }
	 }
  //  int x=0;
 
 }
   
   delete[] dmax;
   delete[] gmax;
   delete[] mark;
  return outlocal;
}

⌨️ 快捷键说明

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