📄 watermethod.cpp
字号:
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 + -