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

📄 watermethod.cpp

📁 站长!这是DCT域的图像数字水印嵌入及提取程序!请查收!暂归入加密解密类别!
💻 CPP
📖 第 1 页 / 共 5 页
字号:
		output[1][3]=1;
		else
		output[1][3]=0;
	}
	
	mean=(input1[6][0]+input2[6][0])/2;
	if ((input1[6][0]-input2[6][0])/mean>6*alpha||(input1[6][0]-input2[6][0])/mean<-6*alpha)
		output[2][3]=0;
	else
	{
		ttt=(input1[6][0]-input2[6][0])/(input1[6][0]+input2[6][0])/alpha;
		if(ttt>=0.5)
		output[2][3]=1;
		else
		output[2][3]=0;
	}
	
	mean=(input1[5][1]+input2[5][1])/2;
	if ((input1[5][1]-input2[5][1])/mean>6*alpha||(input1[5][1]-input2[5][1])/mean<-6*alpha)
		output[3][2]=0;
	else
	{
		ttt=(input1[5][1]-input2[5][1])/(input1[5][1]+input2[5][1])/alpha;
		if(ttt>=0.5)
		output[3][2]=1;
		else
		output[3][2]=0;
	}
	
	mean=(input1[4][2]+input2[4][2])/2;
	if ((input1[4][2]-input2[4][2])/mean>6*alpha||(input1[4][2]-input2[4][2])/mean<-6*alpha)
		output[3][3]=0;
	else
	{
    	ttt=(input1[4][2]-input2[4][2])/(input1[4][2]+input2[4][2])/alpha;
		if(ttt>=0.5)
		output[3][3]=1;
		else
		output[3][3]=0;
	}
}
/*
int DMBsamplingembed(double *input1[],double *input2[],double *input3[],double *input4[],unsigned char *input[],unsigned char *inputin[],double *output1[],
			  double *output2[],double *output3[],double *output4[],int w,int h)
{
	char temp[256];
   HGLOBAL hMem;
	int m,j,i,l,k;               //The interger quotient
	double r,mean;            //The residual
	int par,halfpar;
	par=24;
    halfpar=par/2;
    i=0;
    j=9;
    mean=0;
	double *zigzaginput1;
	double *zigzaginput2;
	double *zigzaginput3;
	double *zigzaginput4;
	double *zigzagoutput1;
	double *zigzagoutput2;
	double *zigzagoutput3;
	double *zigzagoutput4;
	double *input11[8];
	double *input12[8];
	double *input13[8];
	double *input14[8];
	double *output11[8];
	double *output12[8];
	double *output13[8];
	double *output14[8];
	unsigned char *inputinput[4];
    unsigned char *zigzaginput;
    
	for(k=0;k<8;k++)
	{
		input11[k]=input1[k];
		input12[k]=input2[k];
		input13[k]=input3[k];
		input14[k]=input4[k];
		output11[k]=output1[k];
		output12[k]=output2[k];
		output13[k]=output3[k];
		output14[k]=output4[k];
	   }
	for(k=0;k<4;k++)     
    	inputinput[k]=input[k];

	hMem=NULL;
   hMem=GlobalAlloc(GMEM_FIXED,8*64*sizeof(double)+16*sizeof(unsigned char));
   if(hMem==NULL)
   {
	  sprintf(temp,"对不起,内存不够%fMBytes,无法进行编码!",(double)(MAXIMAGESIZE)/1024.0/1024.0);
	  MessageBox(NULL,temp,"编码",MB_ICONSTOP|MB_OK);
	  return -1;
	}
   //Alloc the memory
   zigzaginput1=(double *)hMem;
   zigzaginput2=(double *)hMem+64;
   zigzaginput3=(double *)hMem+64+64;
   zigzaginput4=(double *)hMem+64+64+64;
   zigzagoutput1=(double *)hMem+64+64+64+64;
   zigzagoutput2=(double *)hMem+64+64+64+64+64;
   zigzagoutput3=(double *)hMem+64+64+64+64+64+64;
   zigzagoutput4=(double *)hMem+64+64+64+64+64+64+64;
   zigzaginput=(unsigned char *)zigzagoutput4+64;

     ZigZagD(input11,zigzaginput1,8,64);
     ZigZagD(input12,zigzaginput2,8,64);
     ZigZagD(input13,zigzaginput3,8,64);
     ZigZagD(input14,zigzaginput4,8,64);
     ZigZagC(inputinput,zigzaginput,4,16);
for(k=0;k<64;k++)
{
	zigzagoutput1[k]=zigzaginput1[k];
	zigzagoutput2[k]=zigzaginput2[k];
	zigzagoutput3[k]=zigzaginput3[k];
	zigzagoutput4[k]=zigzaginput4[k];
}

	//Embedding bits
  while(i<16)
	{
        mean=(zigzaginput1[j]+zigzaginput2[j])/2;
		m=(int)(mean/par);
	    r=mean-m*par;
	    if(zigzaginput[i]==1)
		{ 
  	        if(m%2==0)
			{
			   zigzagoutput1[j]=(double)(m*par);
			   zigzagoutput4[j]=(double)(m*par);
			}
			else
			{ 
		      if(mean>=0)
			  {
				zigzagoutput1[j]=(double)(m*par+2*halfpar);
    		    zigzagoutput4[j]=(double)(m*par+2*halfpar);
			  }
			  else
			  {
				zigzagoutput1[j]=(double)(m*par-2*halfpar);
    		    zigzagoutput4[j]=(double)(m*par-2*halfpar);
			  }
			}
		} 
	    else
		{
		  	if(m%2==0)
			{
			  if(mean>=0)
			  {
				 zigzagoutput1[j]=(double)(m*par+2*halfpar);
			     zigzagoutput4[j]=(double)(m*par+2*halfpar);
			  }
			  else
			  {
			     zigzagoutput1[j]=(double)(m*par-2*halfpar);
			     zigzagoutput4[j]=(double)(m*par-2*halfpar);
			  }
			}
			else
			{
			  zigzagoutput1[j]=(double)(m*par);
			  zigzagoutput4[j]=(double)(m*par);
			}
	   }
	  i++;
	  j++;
	 }
     ReZigZagD(output11,zigzagoutput1,8,64);
     ReZigZagD(output12,zigzagoutput2,8,64);
     ReZigZagD(output13,zigzagoutput3,8,64);
     ReZigZagD(output14,zigzagoutput4,8,64);
	GlobalFree(hMem);
	return 0;
}
*/


void DMBsamplingembed(double *input1[],double *input2[],double *input3[],double *input4[],unsigned char *input[],unsigned char *inputinput[],double *output1[],
			  double *output2[],double *output3[],double *output4[],int w,int h)
{
	double r,mean,diff;            //The residual
	int row,column;      //The repeating variable
	int m;               //The interger quotient
	int p[16][2],posi;  //The embedding frequency position
	double par,halfpar;
	//Initalize the embedded position
    p[0][0]=4;
	p[0][1]=0;
	
	p[1][0]=3;
	p[1][1]=1;
	
	p[2][0]=2;
	p[2][1]=2;
	
	p[3][0]=1; 
	p[3][1]=3;

	p[4][0]=0; 
	p[4][1]=4;

	p[5][0]=0; 
	p[5][1]=5;

	p[6][0]=1; 
	p[6][1]=4;

	p[7][0]=2; 
	p[7][1]=3;

	p[8][0]=3; 
	p[8][1]=2;

	p[9][0]=4; 
	p[9][1]=1;

	p[10][0]=5; 
	p[10][1]=0;

	p[11][0]=6; 
	p[11][1]=0;

	p[12][0]=5; 
	p[12][1]=1;

	p[13][0]=4;
	p[13][1]=2;

	p[14][0]=3; 
	p[14][1]=3;

	p[15][0]=2; 
	p[15][1]=4;

	//Initialize the outputs
	for(row=0;row<w;row++)
	  for(column=0;column<h;column++)
	  {
		  output1[row][column]=input1[row][column];
		  output2[row][column]=input2[row][column];
		  output3[row][column]=input3[row][column];
		  output4[row][column]=input4[row][column];
	  }
	par=6.8;  
	halfpar=par/2.0;
	for(row=0;row<4;row++)
	{
	  for(column=0;column<4;column++)
	  {
	    posi=column+row*4;
		mean=(output2[p[posi][0]][p[posi][1]]+output3[p[posi][0]][p[posi][1]])/2;
		m=(int)(mean/par);
	    r=mean-m*par;
	    if(input[row][column]==1)
		{ 
  	        if(m%2==0)
			{
			   output2[p[posi][0]][p[posi][1]]=(double)(m*par);
			   output3[p[posi][0]][p[posi][1]]=(double)(m*par);
			}
			else
			{ 
		      if(mean>=0)
			  {
				output2[p[posi][0]][p[posi][1]]=(double)(m*par+2*halfpar);
    		    output3[p[posi][0]][p[posi][1]]=(double)(m*par+2*halfpar);
			  }
			  else
			  {
				output2[p[posi][0]][p[posi][1]]=(double)(m*par-2*halfpar);
    		    output3[p[posi][0]][p[posi][1]]=(double)(m*par-2*halfpar);
			  }
			}
		} 
	    else
		{
		  	if(m%2==0)
			{
			  if(mean>=0)
			  {
				 output2[p[posi][0]][p[posi][1]]=(double)(m*par+2*halfpar);
			     output3[p[posi][0]][p[posi][1]]=(double)(m*par+2*halfpar);
			  }
			  else
			  {
			     output2[p[posi][0]][p[posi][1]]=(double)(m*par-2*halfpar);
			     output3[p[posi][0]][p[posi][1]]=(double)(m*par-2*halfpar);
			  }
			}
			else
			{
			  output2[p[posi][0]][p[posi][1]]=(double)(m*par);
			  output3[p[posi][0]][p[posi][1]]=(double)(m*par);
			}
	   }
	  }
	}

	par=12;
    halfpar=par/2.0;
	for(row=0;row<4;row++)
	{
	  for(column=0;column<4;column++)
	  {
	    posi=column+row*4;
		diff=output1[p[posi][0]][p[posi][1]]-output4[p[posi][0]][p[posi][1]];
		m=(int)(diff/par);
	    r=diff-m*par;
	    if(inputinput[row][column]==1)
  		   output1[p[posi][0]][p[posi][1]]=output4[p[posi][0]][p[posi][1]];
	    else
		   output1[p[posi][0]][p[posi][1]]=(double)(output4[p[posi][0]][p[posi][1]]+par);
	  }
	} 
}
void DMBsamplingextract(double *input1[],double *input2[],double *input3[],double *input4[],unsigned char *output1[],unsigned char *output2[],short int blockwidth,short int blockheight)
{
	double r,mean,diff;            //The residual
	int row,column;      //The repeating variable
	int m;               //The interger quotient
	int p[16][2],posi;  //The embedding frequency position
	double par;
	//Initalize the embedded position
    p[0][0]=4;
	p[0][1]=0;
	
	p[1][0]=3;
	p[1][1]=1;
	
	p[2][0]=2;
	p[2][1]=2;
	
	p[3][0]=1; 
	p[3][1]=3;

	p[4][0]=0; 
	p[4][1]=4;

	p[5][0]=0; 
	p[5][1]=5;

	p[6][0]=1; 
	p[6][1]=4;

	p[7][0]=2; 
	p[7][1]=3;

	p[8][0]=3; 
	p[8][1]=2;

	p[9][0]=4; 
	p[9][1]=1;

	p[10][0]=5; 
	p[10][1]=0;

	p[11][0]=6; 
	p[11][1]=0;

	p[12][0]=5; 
	p[12][1]=1;

	p[13][0]=4;
	p[13][1]=2;

	p[14][0]=3; 
	p[14][1]=3;

	p[15][0]=2; 
	p[15][1]=4;

	//Extraction four bits
	
    par=6.8;
	for(row=0;row<4;row++)
	{
	  for(column=0;column<4;column++)
	  {
	    posi=column+row*4;
		mean=(input2[p[posi][0]][p[posi][1]]+input3[p[posi][0]][p[posi][1]])/2;
        m=(int)(mean/par);
		r=mean-m*par;
	    if(m%2!=0)
		{
		  if(fabs(r)<par/2)
		    output1[row][column]=0;
		  else
			output1[row][column]=1;
		}
		else
		{
		  if(fabs(r)<par/2)
		    output1[row][column]=1;
		  else
		 	output1[row][column]=0;
		}
	  }
	}
	
	double par2=12;
	//Extraction four bits
	for(row=0;row<4;row++)
	{
	  for(column=0;column<4;column++)
	  {
	    posi=column+row*4;
		diff=input1[p[posi][0]][p[posi][1]]-input4[p[posi][0]][p[posi][1]];
        m=(int)(diff/par2);
		r=diff-m*par2;
	    if(m%2!=0)
		{
		  if(fabs(r)<(par2/2.0))
		    output2[row][column]=0;
		  else
			output2[row][column]=1;
		}
		else
		{
			if(fabs(r)<(par2/2.0))
		    output2[row][column]=1;
		  else
		 	output2[row][column]=0;
		}
	  }
	}
}
void CWatermethod::whiten(unsigned char *input1,unsigned char *input2,char *output1,char *output2,char *totalmean)
{
	unsigned char mean[256*256];
	unsigned long total;
    long int i;
	total=0;
	for(i=0;i<256*256;i++)
	{
		mean[i]=(input1[i]+input2[i])/2;
	}
	for(i=0;i<256*256;i++)
	{
		total=mean[i]+total;
	}
	*totalmean=(char)((double)total/256.0/256.0);
	for(i=0;i<256*256;i++)
	{
		output1[i]=input1[i]-(*totalmean);
		output2[i]=input2[i]-(*totalmean);
	}
}
void CWatermethod::reversewhiten(char *input1,char *input2,unsigned char *output1,unsigned char *output2,char *totalmean)
{
    long int i;
	for(i=0;i<256*256;i++)
	{

⌨️ 快捷键说明

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