embed_alg.cpp

来自「本程序将独立分量分析技术和数字水印技术有机地结合在一起」· C++ 代码 · 共 306 行

CPP
306
字号
#include <stdio.h>
#include "bmpstruct.h"
#include <malloc.h>
#include <stdlib.h>
#include <math.h>

void mat_mult (float *, int , int , float *, int , int , float *);
void FastICA(float *, float *, int , int , int ,int ,float , float *, float *, float *);
void eng_max (float *, int , int , int *);
int mat_inv(float *, int );

typedef struct
    {
        bitmapfile file;
        bitmapinfo info;
		RGB_BMP palette[256];
		unsigned char buffer[256][256];
    }bmp;

typedef struct
    {
        bitmapfile file;
        bitmapinfo info;
		RGB_BMP palette[2];
        //unsigned char  *buffer;
		unsigned char buffer[512];
    }bmp1;

//建立一个bmp格式的结构体
bmp orig_img;
bmp1 watermark;

void main()

{
 FILE *fp,*fp1,*fp2,*fp3;
 unsigned char wm_img[256][256];
 int i, j, k, m, n, *t, *w;//循环变量定义
 int r1[4],r2[4],c1[4],c2[4];//子图像块的标号
 float *x, *W_orig2, *X_pre1, *xmean1, *W, *temp1, *temp2, *sig, *S, *A_orig, *MI, *key;
 float *X_pre2, *xmean2, *temp3, *temp4;
 float A[4]={1, 0.1, 0.3, 1},  *I, *inv_W;



 x=(float *)malloc(16*4096*sizeof(float));
 W_orig2=(float *)malloc(16*16*sizeof(float));
 X_pre1=(float *)malloc(16*4096*sizeof(float));
 W= (float *)malloc(16*16*sizeof(float));	
 xmean1 = (float *)malloc(16 * 1 * sizeof(float));
 temp1= (float *)malloc(16*4096*sizeof(float));
 temp2= (float *)malloc(16 * 1 * sizeof(float));
 sig= (float *)malloc(16*4096*sizeof(float));
 t= (int *)malloc(1*1*sizeof(int));
 w= (int *)malloc(64*64*sizeof(int));
 S= (float *)malloc(2*4096*sizeof(float));
 A_orig= (float *)malloc(2*2*sizeof(float));
 MI= (float *)malloc(2*4096*sizeof(float));
 key=(float *)malloc(1*4096*sizeof(float));
 inv_W=(float *)malloc(16*16*sizeof(float));
 I=(float *)malloc(16*4096*sizeof(float));

 //原始图象数据的读取
 if((fp=fopen( "lenna.bmp", "r" ))!=NULL)
 {
  printf( "The file 'lenna2' was opened\n" );
  
  //读取BMP文件的表头数据
  fread(&orig_img.file.bfType1,sizeof(char),1,fp);
  fread(&orig_img.file.bfType2,sizeof(char),1,fp);
  fread(&orig_img.file.bfSize,sizeof(char),4,fp);
  fread(&orig_img.file.Reserved1,sizeof(char),2,fp);
  fread(&orig_img.file.Reserved2,sizeof(char),2,fp);
  fread(&orig_img.file.bfOffset,sizeof(char),4,fp);
  fread(&orig_img.info,sizeof(char),40,fp);
  //读取调色板数据
  for(i=0;i<256;i++){     
	    fseek(fp,54+long(i*4),SEEK_SET);
        fread(&orig_img.palette[i],sizeof(char),4,fp);
  }
 //读取图象数据: 由于图象数据存放是从左下角开始,自左向右,自下而上的方式。
  for(i=255;i>=0;i--){
      fseek(fp,1078+(long)(i*256),SEEK_SET);
      fread(&orig_img.buffer[255-i][0],sizeof(char),256,fp);
  }
  fclose(fp);
 }
   else
      printf( "The file 'lenna' was not opened\n" );
 
  //图象分块
  k=0;
  for(i=0;i<4;i++){
	   for(j=0;j<4;j++){
	       r1[i]=64*i+1;
		   r2[i]=64*i+64;
		   c1[j]=64*j+1;
		   c2[j]=64*j+64;
		   for(m=r1[i]-1;m<r2[i];m++){
		       for(n=c1[j]-1;n<c2[j];n++){
			       x[(4*i+j)*4096+k]=orig_img.buffer[m][n];
				   k++;
			   }
		   }
		   k=0;
	   }
  }	 
  

  //调用ICA函数
  for(i=0;i<16;i++){
	   for(j=0;j<16;j++){
		   W_orig2[i*16+j]=(float)rand()/100000;
	   }
  }

 
  FastICA(x, W_orig2, 16, 4096, 16, 1000, 1e-2, X_pre1, xmean1, W);
  
  
 

  mat_mult (W, 16, 16, X_pre1, 16, 4096, temp1);
  mat_mult (W, 16, 16, xmean1, 16, 1, temp2);
  for(i=0;i<16;i++){
	  for(j=0;j<4096;j++){
		  sig[4096*i+j]=temp1[4096*i+j]+temp2[i];
		  //printf("%f\n",sig[4096*i+j]);
	  }
  }
 
  eng_max (sig, 16 , 4096 , t);

   //水印数据的读取
 if((fp1=fopen( "hqu.bmp", "r" ))!=NULL)
 {
  printf( "The file 'hqu' was opened\n" );
  
  fread(&watermark.file.bfType1,sizeof(char),1,fp1);
  fread(&watermark.file.bfType2,sizeof(char),1,fp1);
  fread(&watermark.file.bfSize,sizeof(char),4,fp1);
  fread(&watermark.file.Reserved1,sizeof(char),2,fp1);
  fread(&watermark.file.Reserved2,sizeof(char),2,fp1);
  fread(&watermark.file.bfOffset,sizeof(char),4,fp1);
  fread(&watermark.info,sizeof(char),40,fp1);
 

  for(i=0;i<2;i++){     
	    fseek(fp1,54+long(i*4),SEEK_SET);
        fread(&watermark.palette[i],sizeof(char),4,fp1);
  }
 
  for(i=63;i>=0;i--){
      fseek(fp1,62+(long)(i*8),SEEK_SET);
      fread(&watermark.buffer[(63-i)*8],sizeof(char),8,fp1);
  }
  
 
  fclose(fp1);
 }
   else
      printf( "The file 'data' was not opened\n" );
   
   for(i=0;i<64;i++){
	   for(j=0;j<8;j++){
		   for(k=0;k<8;k++){
			   w[i*64+j*8+k]=watermark.buffer[i*8+j]/(int)pow(2,7-k);
			   watermark.buffer[i*8+j]=watermark.buffer[i*8+j]% (int)pow(2,7-k);
		   }

	   }
   }
	   
   for(i=0;i<4096;i++){
	   S[i]=sig[t[0]*4096+i];
	   S[i+4096]=w[i];
   }
	   
   A_orig=A;
   mat_mult(A_orig, 2, 2, S, 2, 4096, MI);
   
   for(i=0;i<4096;i++){
	   sig[t[0]*4096+i]=MI[i];
	   key[i]=MI[i+4096];
   }
   
   for (i=0; i<16; i++)
       for (j=0; j<16; j++)
            inv_W[i*16+j]=W[i*16+j];

   mat_inv(inv_W,16);

   
   mat_mult(inv_W, 16, 16, sig, 16, 4096, I);

   
/*
//以下是保存嵌入水印后的图象
   k=0;
   for(i=0;i<4;i++){
	   for(j=0;j<4;j++){
	       r1[i]=64*i+1;
		   r2[i]=64*i+64;
		   c1[j]=64*j+1;
		   c2[j]=64*j+64;
		   for(m=r1[i]-1;m<r2[i];m++){
		       for(n=c1[j]-1;n<c2[j];n++){
				   wm_img[m][n]=(int) I[(4*i+j)*4096+k];
				   k++;
			   }
		   }
		   k=0;
	   }
  }	 

 // Open a new empty bmp file and write the data into it 
 if( (fp2 = fopen( "watermarked_img.bmp", "w+" )) != NULL )
   {   
	    fwrite(&orig_img.file.bfType1,sizeof(char),1,fp2);
        fwrite(&orig_img.file.bfType2,sizeof(char),1,fp2);
        fwrite(&orig_img.file.bfSize,sizeof(char),4,fp2);
        fwrite(&orig_img.file.Reserved1,sizeof(char),2,fp2);
        fwrite(&orig_img.file.Reserved2,sizeof(char),2,fp2);
        fwrite(&orig_img.file.bfOffset,sizeof(char),4,fp2);
        fwrite(&orig_img.info,sizeof(char),40,fp2);
   
   for(i=0;i<256;i++)
   {   fseek(fp2,54+long(4*i),SEEK_SET);
	   fwrite(&orig_img.palette[i],sizeof(char),4,fp2);
   }
   
   for(i=255;i>=0;i--){
      fseek(fp2,1078+(long)(i*256),SEEK_SET);
      fwrite(&wm_img[255-i][0],sizeof(char),256,fp2);
  }
 
      fclose( fp2 );

  }
   else
      printf( "Problem opening the file\n" );

*/


//水印提取程序
   mat_mult(W, 16, 16, I, 16, 4096, sig);
   eng_max (sig, 16 , 4096 , t);
   for(i=0;i<4096;i++){
	   S[i]=sig[t[0]*4096+i];
	   S[i+4096]=key[i];
   }
   X_pre2=(float *)malloc(2*4096*sizeof(float));
   xmean2 = (float *)malloc(2 * 1 * sizeof(float));
   FastICA(S, W_orig2, 2, 4096, 2, 1000, 1e-2, X_pre2, xmean2, A_orig);
   temp3=(float *)malloc(2*4096*sizeof(float));
   temp4=(float *)malloc(2*1*sizeof(float));
   mat_mult(A_orig, 2, 2, S, 2, 4096, temp3);
   mat_mult(A_orig, 2, 2, xmean2, 2, 1, temp4);
   for(i=0;i<4096;i++)
   {
    temp3[i]=fabs(temp3[i]+temp4[0]);
	temp3[i]=temp3[i]/4;
	temp3[i]=floor(temp3[i]);
	temp3[i+4096]=fabs(temp3[i+4096]+temp4[1]);
   }
   for(i=0;i<64;i++){
	   for(j=0;j<8;j++){
		   for(k=0;k<8;k++){
			   watermark.buffer[i*8+j]=temp3[i*64+j*8+k]*(int)pow(2,7-k)+watermark.buffer[i*8+j];
			   
		   }

	   }
   }
   // Open a new empty bmp file and write the data into it 
 if( (fp3 = fopen( "extract_watermark.bmp", "w+" )) != NULL )
   {   
  fwrite(&watermark.file.bfType1,sizeof(char),1,fp1);
  fwrite(&watermark.file.bfType2,sizeof(char),1,fp1);
  fwrite(&watermark.file.bfSize,sizeof(char),4,fp1);
  fwrite(&watermark.file.Reserved1,sizeof(char),2,fp1);
  fwrite(&watermark.file.Reserved2,sizeof(char),2,fp1);
  fwrite(&watermark.file.bfOffset,sizeof(char),4,fp1);
  fwrite(&watermark.info,sizeof(char),40,fp1);
 

  for(i=0;i<2;i++){     
	    fseek(fp1,54+long(i*4),SEEK_SET);
        fwrite(&watermark.palette[i],sizeof(char),4,fp1);
  }
 
  for(i=63;i>=0;i--){
      fseek(fp1,62+(long)(i*8),SEEK_SET);
      fwrite(&watermark.buffer[(63-i)*8],sizeof(char),8,fp1);
  }
 
      fclose( fp3 );

  }
   else
      printf( "Problem opening the file\n" );


}

⌨️ 快捷键说明

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