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

📄 数字水印技术doc.cpp

📁 基于变换域的信息隐藏技术
💻 CPP
📖 第 1 页 / 共 5 页
字号:
				Zr[j]=Zr[i]+Zr[j];
				
			}
				
				
		
		if(iter!=0)
			{
				for(k=1;k<ip;k++)
				{
					l=k*kk-1;
					for(i=k;i<N;i+=incr)
					{
						if(l==1)
						{ 
							j=i+ip;
							
							Zr1i=Zr[i];
							Zr1j=Zr[j];
							

							Zr[i]=Zr1i;
							Zi[i]=Zr1j;
							Zr[j]=Zr1i;
							Zi[j]=-Zr1j;
						
							
						}
						if(l==0)
						{   
							j=i+ip;
						
							
							Zr[j]=Zr[j]+(int)(tan(pi/8)*Zi[j]);
							Zi[j]=Zi[j];

							Zr[j]=Zr[j];
							Zi[j]=Zi[j]+(int)(sin(-pi/4)*Zr[j]);

					        Zr[j]=-Zr[j]-(int)(tan(pi/8)*Zi[j]);
                            Zi[j]=-Zi[j];
					
							
				            Zr[i]=Zr[i];
							Zi[i]=Zi[i];
				            Zr[j]=Zr[j]+Zr[i];
							Zi[j]=Zi[j]+Zi[i];

				            Zr[i]=Zr[i]+(int)(Zr[j]*(sqrt(2)/2-1));
							Zi[i]=Zi[i]+(int)(Zi[j]*(sqrt(2)/2-1));
				            Zr[j]=Zr[j];
							Zi[j]=Zi[j];

                            Zr[i]=Zr[i];
							Zi[i]=Zi[i];
				            Zr[j]=(int)(-Zr[i]*sqrt(2))+Zr[j];
							Zi[j]=(int)(-Zi[i]*sqrt(2))+Zi[j];

				            Zr[i]=Zr[i]+(int)(Zr[j]*(sqrt(2)/2-0.5));
                            Zi[i]=Zi[i]+(int)(Zi[j]*(sqrt(2)/2-0.5));
				            Zr[j]=Zr[j];
							Zi[j]=Zi[j];

							Zr[i]=Zr[i]+(int)(-Zr[j]*0.5);
							Zi[i]=Zi[i]+(int)(-Zi[j]*0.5);
							Zr[j]=Zr[j];
							Zi[j]=Zi[j];

							Zr[j]=Zr[i]+Zr[j];
							Zi[j]=Zi[j]+Zi[i];
	                     

						}
						if(l==2)
						{   
							j=i+ip;
						    Zr[i]=Zr[i+2];
							Zi[i]=-Zi[i+2];
							Zr[j]=Zr[j-6];
							Zi[j]=-Zi[j-6];
	                   
						}
					}
				}
		}
			kk>>=1;
			ip<<=1;
			incr<<=1;
		   }
		   Z[0]=Zr[0];
		   Z[4]=Zr[4];
		   for(i=1;i<(N>>1);i++)
		   {
			   j=N-i;
			   Z[i]=Zr[i]-(int)(tan(pi*i/(4*N))*Zi[i]);
			   Z[j]=Zi[i];

			   Z[i]=Z[i];
			   Z[j]=(int)(sin(pi*i/(2*N))*Z[i])+Z[j];
               
			   Z[i]=Z[i]-(int)(tan(pi*i/(4*N))*Z[j]);
			   Z[j]=Z[j];

		   }

}

void CDCTDoc::ZIDCT(int *Z, unsigned int *L, int m, int N)
{
	double pi;
	int ip,k,kk,incr,iter,j,i,T;
    int Zr[8],Zi[8];
	pi=3.1415926;
	//IDCT预处理
	Zr[0]=Z[0];
	Zi[0]=0;
	Zr[4]=Z[4];
	Zi[4]=0;
	for(i=1;i<(N>>1);i++)
	{ 
		j=N-i;
		Z[j]=Z[j];
		Z[i]=Z[i]+(int)(tan(pi*i/(4*N))*Z[j]);
		

		Z[i]=Z[i];
		Z[j]=-(int)(sin(pi*i/(2*N))*Z[i])+Z[j];
               
		Z[i]=Z[i]+(int)(tan(pi*i/(4*N))*Z[j]);
		Z[j]=Z[j];
		
		Zr[i]=Z[i];
		Zi[i]=Z[j];

		Zr[j]=Z[i];
		Zi[j]=-Z[j];

	}
//IFFT部分
		ip=4;
		incr=N;
		for(iter=0;iter<m;iter++)
		{
			kk=0;
			for(k=0;k<ip;k++)
			{
			
			   for(i=k;i<N;i+=incr)
			   { 			  
				  
                   j=i+ip;
				   if(kk==0)
				   {
					   Zr[i]=Zr[i];
					   Zr[j]=Zr[j]-Zr[i];

					   Zr[i]=Zr[i]+(int)(0.5*Zr[j]);

                       Zr[i]=Zr[i]+(int)(0.5*(1-sqrt(2))*Zr[j]);

					   Zr[j]=(int)(sqrt(2)*Zr[i])+Zr[j];

					   Zr[i]=Zr[i]+(int)((1-sqrt(2)*0.5)*Zr[j]);

					   Zr[j]=Zr[j]-Zr[i];

					   Zr[j]=-Zr[j];
					   
				   }
				   if(iter==0&&kk==1)
				   {
					   Zr[j]=Zr[j]-Zr[i];
                       Zi[j]=Zi[j]-Zi[i];

					   Zr[i]=Zr[i]+(int)(0.5*Zr[j]);
					   Zi[i]=Zi[i]+(int)(0.5*Zi[j]);

                       Zr[i]=Zr[i]+(int)(0.5*(1-sqrt(2))*Zr[j]);
					   Zi[i]=Zi[i]+(int)(0.5*(1-sqrt(2))*Zi[j]);

					   Zr[j]=(int)(sqrt(2)*Zr[i])+Zr[j];
					   Zi[j]=(int)(sqrt(2)*Zi[i])+Zi[j];

					   Zr[i]=Zr[i]+(int)((1-sqrt(2)*0.5)*Zr[j]);
					   Zi[i]=Zi[i]+(int)((1-sqrt(2)*0.5)*Zi[j]);

					   Zr[j]=Zr[j]-Zr[i];
					   Zi[j]=Zi[j]-Zi[i];
					   
					   Zr[j]=Zr[j]-(int)(tan(pi/8)*Zi[j]);

					   Zi[j]=(int)(sin(pi/4)*Zr[j])+Zi[j];
					   
					   Zr[j]=Zr[j]-(int)(tan(pi/8)*Zi[j]);

					   Zr[j]=-Zr[j];
					   Zi[j]=-Zi[j];
					   
				   }
				   if(kk==2||(iter==1&&kk==1))
				   {
					   Zr[i]=Zr[i];
					   Zr[j]=Zi[i];
					   Zi[i]=0;
					   Zi[j]=0;
					   
					   
				   }
				   if(kk==3)
				   {							
					   Zr[i]=Zr[i-2];
					   Zi[i]=-Zi[i-2];
					   Zr[j]=Zr[j-2];
					   Zi[j]=-Zi[j-2];
	               }
			   }
			   kk++;

			}
			
			ip>>=1;
			incr>>=1;
		}
//倒位序
		for(i=0;i<(N-1);i++)
		{
		  if(i<(int)L[i])
			continue;
		  else
		  {
			T=Zr[i];
			Zr[i]=Zr[L[i]];
			Zr[L[i]]=T;
		  }
		}
		for(i=0;i<N;i++)
			Z[i]=Zr[i];
//  重排序
	kk=1;
	for(i=1;i<(N>>1);i++)
	{
		T=Z[N-1];
		k=1;
		for(j=kk;j<N;j++)
		{
			Z[N-k]=Z[N-k-1];
			k++;
		}
		Z[kk]=T;
		kk+=2;
	}

}



void CDCTDoc::BiaoZh()
{
   int temp,i,j;
	RNw=m_size.cx;
	RNh=m_size.cy;
	if(RNw>800||RNh>800)
		AfxMessageBox("图象范围超出800,不能处理!");

	temp=RNw%8;
	if(temp!=0)
	
		Nw=RNw+(8-temp);
	else
		Nw=RNw;
	temp=RNh%8;
    if(temp!=0)
	
		Nh=RNh+(8-temp);
	else
		Nh=RNh;

	for(i=0;i<RNw;i++)
		for(j=0;j<RNh;j++)
		{
			Datas[i][j]=(float)GetXY(i,j);
		}

	for(i=RNw;i<Nw;i++)
		for(j=0;j<Nh;j++)
			Datas[i][j]=0;
	for(i=0;i<Nw;i++)
		for(j=RNh;j<Nh;j++)
			Datas[i][j]=0;
	Max=255;

}

void CDCTDoc::OnFft() 
{
	// TODO: Add your command handler code here
	float *wr;
	float*wi;
	float*xr;
	float*xi;


	float value[256][256],Dr[256][256],Di[256][256];
	float min,max,scale;
	unsigned int*L;
    int m,N,k1,k2,n2,k,i,j;

	max=0.0;
	min=1000.0;
	N=256;

	m=(int)((log10(N))/(log10(2)));
	n2=(N>>1);
	wr=(float*)malloc(n2*sizeof(float));
	wi=(float*)malloc(n2*sizeof(float));
	xr=(float*)malloc(N*sizeof(float));
	xi=(float*)malloc(N*sizeof(float));
    L=(unsigned int*)malloc(N*sizeof(unsigned int));

    BiaoZh();
	bit_reversal(L,m,N);
	GLT(wr,wi,N,-1);
	   
	for(k1=0;k1<N;k1++)
	{
	  for(k2=0;k2<N;k2++)
	  {
		k=L[k2];
        xr[k]=(float)(Datas[k1][k2]*pow(-1,k1+k2));
		xi[k]=0.0;
	  }
	  FFT(xr,xi,wr,wi,m,N);
      for(k2=0;k2<N;k2++)
	  {
	     Dr[k1][k2]=xr[k2];
  	     Di[k1][k2]=xi[k2];
	  }
	}

	for(k1=0;k1<N;k1++)
	{
	   for(k2=0;k2<N;k2++)
	   {
		  k=L[k2];
		  xr[k]=Dr[k2][k1];
		  xi[k]=Di[k2][k1];
		}
	    FFT(xr,xi,wr,wi,m,N);
        for(k2=0;k2<N;k2++)
		{
		   Dr[k2][k1]=xr[k2]/N;
		   Di[k2][k1]=xi[k2]/N;
		}
	}
	for(k1=0;k1<N;k1++)
      for(k2=0;k2<N;k2++)
	  {
		 DataR[k1][k2]=Dr[k1][k2];
		 DataI[k1][k2]=Di[k1][k2];
	  }
     for(k1=0;k1<N;k1++)
	   for(k2=0;k2<N;k2++)
	   {
	//	   FDATA[k1][k2]=(float)sqrt(Dr[k1][k2]*Dr[k1][k2]+Di[k1][k2]*Di[k1][k2]);
	//	   value[k1][k2]=(float)(log10(1+FDATA[k1][k2]));
		  
		   FDATA[k1][k2]=(float)(Dr[k1][k2]*Dr[k1][k2]+Di[k1][k2]*Di[k1][k2]);
		   value[k1][k2]=(float)(log10(1+(float)sqrt(Dr[k1][k2]*Dr[k1][k2]+Di[k1][k2]*Di[k1][k2])));
		   
		   
		   if(value[k1][k2]>max)
			 max=value[k1][k2];
		 if(value[k1][k2]<min)
			 min=value[k1][k2];
		}
	 scale=(float)(255.0/(max-min));


	  for(k1=0;k1<N;k1++)
			
		  for(k2=0;k2<N;k2++)
			
		     Datas[k1][k2]=value[k1][k2];
      
    for(i=0;i<RNw;i++)
		for(j=0;j<RNh;j++)
		{
			SetXY(i,j,(BYTE)(Datas[i][j]*scale));
		}
	
	
 	UpdateAllViews(NULL);
	SetModifiedFlag();
	free(xr);
	free(xi);	
	free(wr);
	free(wi);	
}

void CDCTDoc::OnIfft() 
{
	// TODO: Add your command handler code here
	float*wr;
	float*wi;
	float*xr;
	float*xi;

	unsigned int*L;
    int N,m,k1,k2,n2,k,i,j;

    N=256;
	m=(int)((log10(N))/(log10(2)));
	n2=(N>>1);
	wr=(float*)malloc(n2*sizeof(float));
	wi=(float*)malloc(n2*sizeof(float));
	xr=(float*)malloc(N*sizeof(float));
	xi=(float*)malloc(N*sizeof(float));
    L=(unsigned int*)malloc(N*sizeof(unsigned int));

	bit_reversal(L,m,N);
	GLT(wr,wi,N,1);
 
	for(k1=0;k1<N;k1++)
	{
		for(k2=0;k2<N;k2++)
		{   
			k=L[k2];
			xr[k]=DataR[k1][k2];
	        xi[k]=DataI[k1][k2];
		}
		 FFT(xr,xi,wr,wi,m,N);
         for(k2=0;k2<N;k2++)
		{
		    DataR[k1][k2]=xr[k2]/N;
		    DataI[k1][k2]=xi[k2]/N;
		}
	}
	 for(k1=0;k1<N;k1++)
	{
		for(k2=0;k2<N;k2++)
		{
            k=L[k2];
			xr[k]=DataR[k2][k1];
			xi[k]=DataI[k2][k1];
		}
		FFT(xr,xi,wr,wi,m,N);
        for(k2=0;k2<N;k2++)
		 {
		     DataR[k2][k1]=xr[k2];
			 DataI[k2][k1]=xi[k2];
		}
	}


       for(k1=0;k1<N;k1++)
	   
		  for(k2=0;k2<N;k2++)
		{ 
	          Datas[k1][k2]=(float)sqrt(DataR[k1][k2]*DataR[k1][k2]+
				                                        DataI[k1][k2]*DataI[k1][k2]);
			  FDATA[k1][k2]=(float)sqrt(DataR[k1][k2]*DataR[k1][k2]+
				                                        DataI[k1][k2]*DataI[k1][k2]);
		}

	for(i=0;i<RNw;i++)
		for(j=0;j<RNh;j++)
		{
            SetXY(i,j,(BYTE)(Datas[i][j]));
		}
	UpdateAllViews(NULL);
	SetModifiedFlag();
	free(xr);
	free(xi);	
	free(wr);
	free(wi);	
}

void CDCTDoc::OnDct() 
{                                                                                                                               
	// TODO: Add your command handler code here   
	float*C;
	unsigned int*L;
	float*x; 
	int N,i,j,m,k1,k2;
	float max,min[100][100],scale[100][100];
	N=8;
	max=0.0;
	BiaoZh();
	for( i=0;i<8;i++)
		for( j=0;j<8;j++)
          ShowFData[i][j]=(float)GetXY(m_x+i,m_y+j);

	for(i=0;i<Nw/N;i++)
		for(j=0;j<Nh/N;j++)
			min[i][j]=10000.0;
	

    
	m=(int)((log10(N))/(log10(2)));
	C=(float*)malloc((N-1)*sizeof(float));
	x=(float*)malloc(N*sizeof(float));
	L=(unsigned int*)malloc(N*sizeof(unsigned));
	
	bit_reversal(L,m,N);
	WTS(C,m,N);
	for(i=0;i<Nw/N;i++)
	{
		for(j=0;j<Nh/N;j++)
		{
			for(k1=0;k1<N;k1++)
			{
		        for(k2=0;k2<N;k2++)
				{
			       x[k2]=Datas[k1+i*N][k2+j*N];
				}
		        FCT(x,L,C,m,N);
	
               for(k2=0;k2<N;k2++)
			   {
			       Datas[k1+i*N][k2+j*N]=x[k2];
			   }
			}

	       for(k1=0;k1<N;k1++)
		   {
		       for(k2=0;k2<N;k2++)
			   {
			
			      x[k2]=Datas[k2+i*N][k1+j*N];
			
			   }
               FCT(x,L,C,m,N);
               for(k2=0;k2<N;k2++)
			   {
			       Datas[k2+i*N][k1+j*N]=x[k2];
			
			   }	
	
		   }


	       for(k1=0;k1<N;k1++)
		   {
		       for(k2=0;k2<N;k2++)
			   {
		            DataR[k1+i*N][k2+j*N]=(float)(log10(1+fabs(Datas[k1+i*N][k2+j*N]))/log10(2));
			       float  temp=DataR[k1+i*N][k2+j*N];
					   if( temp>max)
				         max=temp;
			        if(temp<min[i][j])
				         min[i][j] =temp;
					
			   }
		   }
	       scale[i][j]=(float)(255.0/(max-min[i][j]));
		}
	}

	///////////
	for(k1=0;k1<RNw;k1++)
	{		
		for(k2=0;k2<RNh;k2++)
			
		{
				FDATA[i][j]=Datas[i][j];
		}
	}

	///////////
		   for(k1=0;k1<RNw;k1++)
		   {		
			for(k2=0;k2<RNh;k2++)
			
			{
				SetXY(k1,k2,(BYTE)((DataR[k1][k2]-min[k1/N][k2/N])*scale[k1/N][k2/N]));
			}
		}
    for(i=0;i<RNw;i++)
		for(j=0;j<RNh;j++)
		{
			if((int)Datas[i][j]>Max)
				Max=(int)Datas[i][j];
            if((int)Datas[i][j]<Min)
				Min=(int)Datas[i][j];
		}

 
    aa=2;
	UpdateAllViews(NULL);
	SetModifiedFlag();
	free(x);
	free(C);	
	free(L);
		


}

void CDCTDoc::OnIdct() 
{
	// TODO: Add your command handler code here
	float*C;
	float*x;
	unsigned int*L;
	 
	int N,m,k1,k2,i,j;
	
 	N=8;
	m=(int)((log10(N))/(log10(2)));
	C=(float*)malloc((N-1)*sizeof(float));
	x=(float*)malloc(N*sizeof(float));
	L=(unsigned int*)malloc(N*sizeof(unsigned int));
	
	bit_reversal(L,m,N);
	WTSINV(C,m,N);	
    for(i=0;i<Nw/N;i++)
	{
		for(j=0;j<Nh/N;j++)
		{

           for(k1=0;k1<N;k1++)
		   {
		      for(k2=0;k2<N;k2++)
			  {
			     x[k2]=Datas[k2+i*N][k1+j*N];
			  }
		      IFCT(x,L,C,m,N);
	
              for(k2=0;k2<N;k2++)
			  {
			      Datas[k2+i*N][k1+j*N]=x[k2];
			  }
		   }

	       for(k1=0;k1<N;k1++)
		   {
		      for(k2=0;k2<N;k2++)
			  {
			
			     x[k2]=Datas[k1+i*N][k2+j*N];
			
			  }
              IFCT(x,L,C,m,N);
              for(k2=0;k2<N;k2++)
			  {
			     Datas[k1+i*N][k2+j*N]=x[k2];
			
			  }	
	
		   }
		}
	}
/////////////////////////
	for(k1=0;k1<RNw;k1++)
		{		
			for(k2=0;k2<RNh;k2++)
			
			{
				FDATA[k1][k2] = Datas[k1][k2];
			}
		}
/////////////////////////
	for(k1=0;k1<RNw;k1++)
	{		
			for(k2=0;k2<RNh;k2++)
			
			{
				SetXY(k1,k2,(BYTE)(Datas[k1][k2]));
			}
	}
	Max=255;
	UpdateAllViews(NULL);
	SetModifiedFlag();

⌨️ 快捷键说明

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