📄 数字水印技术doc.cpp
字号:
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 + -