?? 數字水印技術doc.cpp
字號:
fp.Open((LPCTSTR)dlg.GetPathName(),CFile::modeWrite|CFile::modeCreate);
fp.Read(str,m_size22.cx*m_size22.cy);
fp.Close();
}
delete[]str;
}
void CDCTDoc::jiance()
{
int i,j,l=0,k=0;
static double temp_data[256][256],*temp;
temp=(double*)malloc(256*256*sizeof(double));
for(i=0;i<m_size.cy;i++)
for(j=0;j<m_size.cx;j++)
temp_data[i][j]=(water_marking[i][j]-picture[i][j])/(23.75*fabs(picture[i][j]));
for(i=0;i<m_size.cy;i++)
for(j=0;j<m_size.cx;j++)
{ if( fabs(temp_data[i][j])>=0.1)
temp[l++]=temp_data[i][j];
else;
}
l=0;
for(i=0;i<m_size22.cy;i++)
for(j=0;j<m_size22.cx;j++)
Datas22[i][j]=(float)temp[l++];
}
void CDCTDoc::OnHuiduPic()
{
// TODO: Add your command handler code here
CFile fp;
LPCTSTR lpfilename;
CPIC_256_DLG pic;
if(pic.DoModal()==IDOK)
{
lpfilename=pic.m_spathname;
}
fp.Open(lpfilename,CFile::modeRead);
fp.Read((LPSTR)&bmh22,sizeof(BITMAPFILEHEADER));
if(bmh22.bfType!=0x4d42)
{
MessageBox(NULL,"不是合法的位圖文件","錯誤!",MB_OK);
fp.Close();
exit(-2);
}
DWORD dwBitsSize=bmh22.bfSize;
lpbmi22=(BITMAPINFO*)GlobalAllocPtr(GHND,dwBitsSize-
sizeof(BITMAPFILEHEADER));//分配內存單元
fp.Read(lpbmi22,dwBitsSize-sizeof(BITMAPFILEHEADER));
if((lpbmi22->bmiHeader.biBitCount!=8)
||(lpbmi22->bmiHeader.biCompression!=BI_RGB))
{
MessageBox(NULL,"not 256 or compresed","error",MB_OK);
GlobalFreePtr(lpbmi22);//釋放內存單元
lpbmi22=NULL;
fp.Close();//關閉文件
exit(-2);
}
lpbits22=(LPBYTE)lpbmi+sizeof(BITMAPINFOHEADER)+
256*sizeof(RGBQUAD);
m_size22.cx=lpbmi22->bmiHeader.biWidth;
m_size22.cy=lpbmi22->bmiHeader.biHeight;
m_TrueWidth22=(m_size22.cx+3)/4*4;
fp.Close();
int i,j;
for(i=0;i<m_size22.cy;i++)
for(j=0;j<m_size22.cx;j++)
{
Datas22[i][j]=lpbits22[i * m_size22.cx+j];
pic22[i][j]=lpbits22[i * m_size22.cx+j];
}
CString str;
str.Format("該灰度圖的大小為: %d ",m_size22.cx*m_size22.cy);
AfxMessageBox(str);
UpdateAllViews(NULL);
// SetModifiedFlag();
}
void CDCTDoc::OnDraw22(CDC *pDC)
{
::StretchDIBits(pDC->m_hDC,0,m_size.cy,
m_size22.cx,m_size22.cy,
0,0,m_size22.cx,
m_size22.cy,lpbits22,lpbmi22,DIB_RGB_COLORS,SRCCOPY);
}
void CDCTDoc::OnNew256Pic()
{
// TODO: Add your command handler code here
////////////////
//功能:對新加入的 256 級灰度圖像進行數據保存
int i,j;
for(i=0;i<m_size22.cy;i++)
for(j=0;j<m_size22.cx;j++)
Datas22[i][j]=lpbits22[i*m_size22.cx + j];
}
void CDCTDoc::OnDataW()
{
// TODO: Add your command handler code here
int i;
for(i=0;i<16*16-1;i++)
{
Water_SuiJi[i]=0;
}
CSUIJIDLG suiji;
if(suiji.DoModal()==IDOK)
{
int p[16];
int i,j,n=0;
p[0]=suiji.m_d1;
p[1]=suiji.m_d2;
p[2]=suiji.m_d3;
p[3]=suiji.m_d4;
p[4]=suiji.m_d5;
p[5]=suiji.m_d6;
p[6]=suiji.m_d7;
p[7]=suiji.m_d8;
p[8]=suiji.m_d9;
p[9]=suiji.m_d10;
p[10]=suiji.m_d11;
p[11]=suiji.m_d12;
p[12]=suiji.m_d13;
p[13]=suiji.m_d14;
p[14]=suiji.m_d15;
p[15]=suiji.m_d16;
for(i=0;i<16;i++)
for(j=0;j<16;j++)
{
Water_SuiJi[i*16+j]=p[n];
n++;
}
}
}
void CDCTDoc::OnS1()
{
// TODO: Add your command handler code here
int i,j;
w_mixture(Datas,Datas22);
for(i=0;i<m_size.cy;i++)
for(j=0;j<m_size.cx;j++)
SetXY(i,j,(BYTE)Datas[i][j]);
UpdateAllViews(NULL);
SetModifiedFlag();
}
void CDCTDoc::w_mixture(float m_image[][800],float water[][256])
{
int n,m,i,j;
double c_data=0.001;//m_size22.cx*m_size22.cy;
CString str;
for(i=0,m=0;(i<m_size22.cy)&&(m<m_size.cy);i++,m++)
for(j=0,n=0;(j<m_size22.cx)&&(n<m_size.cx);j++,n++)
if(fabs(m_image[m][n])>10.0)//can.g_data)
m_image[m][n]=m_image[m][n]+
(float)(c_data*fabs(m_image[m][n]*water[i][j]));
str.Format("水印大小為:%d ;\n嵌入的大小為:%d;\n 原圖大小:%d。\n",m_size22.cx*m_size22.cy,(i-1)*m_size22.cx+(j-1),m_size.cx*m_size.cy);
AfxMessageBox(str);
}
void CDCTDoc::OnDataPic()
{
// TODO: Add your command handler code here
int i,j;
AfxMessageBox("我們將要保存此時的水印信息 . . . .");
for(i=0;i<m_size.cy;i++)
for(j=0;j<m_size.cx;j++)
{
water_marking[i][j]=FDATA[i][j];
water_data[i][j]=Datas[i][j];
}
AfxMessageBox("我們已經將此時的水印信息保存完畢!!");
}
void CDCTDoc::hvs2(float input[][800],float y_image[][800])
{
int k,l,i,j,flag,ii,jj,x,y;
float y_max;
float output[9][9],w_ydata[8][8],out_image[8][8];
float bcontrol[8][8];
float *out_data=new float[64];
float *point1=new float[64];
float *point2=new float[64];
k=0;
l=0;
flag=(int)sqrt((m_size.cx*m_size.cy/64));
for(x=0;x<flag;x++)
for(y=0;y<flag;y++)
{
point1=tiqu8_8(input,x*8,y*8);
point2=tiqu8_8(y_image,x*8,y*8);
for(ii=0;ii<8;ii++)
for(jj=0;jj<8;jj++)
{
output[ii][jj]=point1[ii*8+jj];
out_image[ii][jj]=point2[ii*8+jj];
}
//生成亮度方差矩陣//
for(i=0;i<8;i++)
for(j=0;j<8;j++)
{
if(i==7)
output[i+1][j]=output[i][j];
else
if(j==7)
output[i][j+1]=output[i][j];
w_ydata[i][j]=(output[i][j]*output[i][j]+output[i][j+1]*output[i][j+1]+output[i+1][j]*output[i+1][j]+output[i+1][j+1]*output[i+1][j+1])/4;
}
for(i=0;i<8;i++)
for(j=0;j<8;j++)
{
if(i==7)
output[i+1][j]=output[i][j];
else
if(j==7)
output[i][j+1]=output[i][j];
w_ydata[i][j]=w_ydata[i][j]-(output[i][j]+output[i][j+1]+output[i+1][j]+output[i+1][j+1])*(output[i][j]+output[i][j+1]+output[i+1][j]+output[i+1][j+1])/16;
}
//求出亮度方差矩陣中的最大值//
y_max=w_ydata[0][0];
for(i=0;i<8;i++)
for(j=0;j<8;j++)
if(w_ydata[i][j]>=y_max)
y_max=w_ydata[i][j];
//生成控制強度系數,并計算調整后的亮度值//
k=0;
for(i=0;i<8;i++)
for(j=0;j<8;j++)
{
bcontrol[i][j]=(float)sqrt(w_ydata[i][j]/y_max);
output[i][j]=out_image[i][j]+
(bcontrol[i][j]*(output[i][j]-out_image[i][j]));
out_data[k++]=output[i][j];
}
input8_8(Datas, out_data, x, y);
}
delete[]out_data;
}
void CDCTDoc::OnBeginH()
{
// TODO: Add your command handler code here
hvs2(picture,Datas);
UpdateAllViews(NULL);
SetModifiedFlag();
}
void CDCTDoc::OnYuanPic()
{
// TODO: Add your command handler code here
int i,j;
for(i=0;i<m_size.cy;i++)
for(j=0;j<m_size.cx;j++)
{
picture[i][j]=FDATA[i][j];
}
AfxMessageBox("信息已經保存");
}
float * CDCTDoc::tiqu8_8(float input[][800], int x, int y)
{
int i,j;
float *data_8_8=new float[8*8];
for(i=0;i<8;i++)
for(j=0;j<8;j++)
data_8_8[i*8+j]=input[x+i][y+j];
return data_8_8;
}
void CDCTDoc::input8_8(float yuan[][800], float *data_to, int x, int y)
{
int i,j;
for(i=0;i<8;i++)
for(j=0;j<8;j++)
yuan[i+x][j+y]=data_to[i*8+j];
}
void CDCTDoc::OnChushiPic()
{
// TODO: Add your command handler code here
int i,j;
for(i=0;i<m_size.cy;i++)
for(j=0;j<m_size.cx;j++)
{
chushi[i][j]=Datas[i][j];
}
AfxMessageBox("圖像的初始化值。");
}
void CDCTDoc::OnSubPW()
{
// TODO: Add your command handler code here
int i,j;
for(i=0;(i<m_size.cy);i++)
for(j=0;(j<m_size.cx);j++)
{
Datas[i][j]=chushi[i][j]-Datas[i][j];
}
UpdateAllViews(NULL);
SetModifiedFlag();
}
void CDCTDoc::OnTxtToBits()
{
// TODO: Add your command handler code here
}
void CDCTDoc::OnBitTxt()
{
// TODO: Add your command handler code here
CFileDialog dlg(1,"txt","*.txt");
CFile fp;
int i,j;
if(dlg.DoModal()==IDOK)
{
fp.Open((LPCTSTR)dlg.GetPathName(),CFile::modeRead);
}
char *str=new char[16*16];
fp.Read(str,16*16);
for(i=0;i<16;i++)
for(j=0;j<16;j++)
txt[i][j]=(int)(str[i*16+j]-48);
AfxMessageBox("文本信息已經獲得為一個 16*16 的0~1矩陣");
fp.Close();
delete[]str;
}
void CDCTDoc::OnS4()
{
// TODO: Add your command handler code here
CDLG_CONTROL can;
int i,j,N=8,k1,k2;
if(can.DoModal()==IDOK)
{
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++)
{
DataR[k1+i*N][k2+j*N] += can.m_fsuiji*txt[k1][k2];
Datas[k1+i*N][k2+j*N]=(float)fabs((pow(2,DataR[k1+i*N][k2+j*N])-1));
// DataR[k1+i*N][k2+j*N]=(float)(log10(1+fabs(Datas[k1+i*N][k2+j*N])));///log10(2));
}
}
}
}
}
for(i=0;i<m_size.cy;i++)
for(j=0;j<m_size.cx;j++)
SetXY(i,j,(BYTE)Datas[i][j]);
UpdateAllViews(NULL);
SetModifiedFlag();
}
void CDCTDoc::On2Pic()
{
// TODO: Add your command handler code here
CFileDialog dlg(1,"BMP","*.bmp");
CFile fp;
if(dlg.DoModal()==IDOK)
{
fp.Open((LPCTSTR)dlg.GetPathName(),CFile::modeRead);
fp.Read((LPSTR)&bmh33,sizeof(BITMAPFILEHEADER));
if(bmh33.bfType!=0x4d42)
{
MessageBox(NULL,"不是合法的位圖文件","錯誤!",MB_OK);
fp.Close();
exit(-2);
}
DWORD dwBitsSize=bmh33.bfSize;
lpbmi33=(BITMAPINFO*)GlobalAllocPtr(GHND,dwBitsSize-
sizeof(BITMAPFILEHEADER));//分配內存單元
fp.Read(lpbmi33,dwBitsSize-sizeof(BITMAPFILEHEADER));
if((lpbmi33->bmiHeader.biBitCount!=1)
||(lpbmi33->bmiHeader.biCompression!=BI_RGB))
{
MessageBox(NULL,"是被壓縮過的或 不是二值圖像 . . . .","error",MB_OK);
GlobalFreePtr(lpbmi33);//釋放內存單元
lpbmi33=NULL;
fp.Close();//關閉文件
exit(-2);
}
lpbits33=(LPBYTE)lpbmi33+sizeof(BITMAPINFOHEADER)+2*sizeof(RGBQUAD);
m_size33.cx=lpbmi33->bmiHeader.biWidth;
m_size33.cy=lpbmi33->bmiHeader.biHeight;
CString str;
str.Format("%d",m_size33.cx*m_size33.cy);
AfxMessageBox(str);
widthx=m_size33.cx/8;
widthy=m_size33.cy/8;
int temp;
int i,j;
for(i=0;i<widthy;i++)
for(j=0;j<widthx;j++)
{
if(lpbits33[i*widthx+j]>0)
temp=1;
else
temp=0;
bits2[i][j]=temp;
}
fp.Close();
return;
}
}
void CDCTDoc::OnS5()
{
// TODO: Add your command handler code here
int i,j;
for(i=0;i<widthy;i++)
for(j=0;j<widthx;j++)
{
Datas[i][j]+=bits2[i][j];
}
for(i=0;i<m_size.cy;i++)
for(j=0;j<m_size.cx;j++)
{
SetXY(i,j,(BYTE)Datas[i][j]);
}
UpdateAllViews(NULL);
SetModifiedFlag();
}
void CDCTDoc::OnWT()
{
// TODO: Add your command handler code here
float *pick=new float[64];
float *pick2=new float[64];
int water[8][8];
int i,j,t;
CString str;
pick=take_m(picture,m_size.cx,8);
pick2=take_m(water_marking,m_size.cx,8);
int ok[64];
float q;
for(i=0;i<8;i++)
for(j=0;j<8;j++)
str.Format("masksize[i][j]= %f ",masksize[i][j]);
AfxMessageBox(str);
for(i=0;i<8;i++)
for(j=0;j<8;j++)
{
str.Format("pick2[i*8+j]= %f ",pick2[i*8+j]);
AfxMessageBox(str);
str.Format("pick[i*8+j]= %f ",pick[i*8+j]);
AfxMessageBox(str);
str.Format("middle[i][j]= %f ",middle[i][j]);
AfxMessageBox(str);
q=(pick2[i*8+j]-pick[i*8+j]-masksize[i][j])/(2*middle[i][j]);
if(q>50)
water[i][j]=1;
else
water[i][j]=0;
}
CString string;
for(i=0;i<8;i++)
{
t=0;
for(j=0;j<=7;j++)
{
t = t + (int)pow(2,7-j)*water[i][j];
}
ok[i]=t;
string.Format("我們獲得的水印信息為\n第 %d 個為 %d",i+1,t);
AfxMessageBox(string);
}
CFileDialog dlg(1,"txt","*.txt");
CFile fp;
if(dlg.DoModal()==IDOK)
{
fp.Open((LPCTSTR)dlg.GetPathName(),CFile::modeWrite|CFile::modeCreate);
CString str("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
for(i=0;i<8;i++)
str.SetAt(i,(int)ok[i]);
fp.Write(str,str.GetLength());
fp.Close();
}
delete[]pick;
delete[]pick2;
}
void CDCTDoc::OnWT2()
{
// TODO: Add your command handler code here
int water[16][16];
int i,j;
float q;
int arr[32],p,k=0;
for(i=0;i<16;i++)
for(j=0;j<16;j++)
{
//q=Datas[i][j]-picture[i][j];
q=water_marking[i][j]-picture[i][j];
if(q>0)water[i][j]=1;
else
water[i][j]=0;
}
int t;
for(i=0;i<16;i++)
{
t=0;
p=7;
for(j=0;j<16;j++)
{
t = t + (int)pow(2,p)*water[i][j];
p--;
if(p<0)
{
arr[k++]=t;
p=7;
}
}
}
CFileDialog dlg(1,"txt","*.txt");
CFile fp;
if(dlg.DoModal()==IDOK)
{
fp.Open((LPCTSTR)dlg.GetPathName(),CFile::modeWrite|CFile::modeCreate);
CString str;
char *string=new char[32];
for(i=0;i<k-1;i++)
string[i]=arr[i];
string[32]='\0';
str=string;
fp.Write(str,str.GetLength());
fp.Close();
delete[]string;
}
}
void CDCTDoc::ji(float sum[][800], float yuan[][800], float jia[][800])
{
int i,j,k;
for(i=0;i<m_size.cx;i++)
{
for(j=0;j<m_size.cy;j++)
{
for(k=0;k<m_size.cx;k++)
sum[i][j]+=yuan[j][k]*jia[k][j];
}
}
}
float CDCTDoc::sim(float a[][800], float b[][800],int n)
{
float t1,t2;
static float temp[800][800];
static float temp2[800][800];
ji(temp,a,b);
ji(temp2,a,a);
t1=hang(temp,n);
t2=hang(temp2,n);
return (float)(t1*1.0/t2);
}
float CDCTDoc::hang(float matrix[][800],int length)
{
float *p=new float[length*length];
int i,j;
float temp;
for(i=0;i<length;i++)
for(j=0;j<length;j++)
{
p[i*length+j]=matrix[j][i];
}
temp=0.0;
for(i=0;i<length;i++)
for(j=0;j<length;j++)
{
temp +=p[i*length+j]*p[j*length+i];
}
delete[]p;
return temp;
}
void CDCTDoc::OnSimYanzheng()
{
// TODO: Add your command handler code here
float t,f;
//t=sim(chushi,water_marking,m_size.cx);
t=sim(chushi,water_data,m_size.cx);
f=(float)fabs(t-1)*100;
CString str;
str.Format("經檢驗,水印的相似度為:\n%.5f。\n誤差為:%.2f%%",t,f);
AfxMessageBox(str);
}
void CDCTDoc::OnYanzheng()
{
// TODO: Add your command handler code here
float t,f;
t=sim(chushi,pic22,m_size.cx);
f=(float)fabs(t-1)*100;
CString str;
str.Format("經檢驗,水印的相似度為:\n%.5f。\n誤差為:%.2f%%",t,f);
AfxMessageBox(str);
}
void CDCTDoc::OnHelpdlg()
{
// TODO: Add your command handler code here
CHELPDLG help;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -