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 + -
显示快捷键?