www.pudn.com > LogisticWatermark.rar > LogisticWatermark.m
%%%%%%%基于logistic映射的DCT域水印嵌入与提取算法%%%%%%%
clear all;
close all;
%读入原始宿主图像
file_name='lena.jpg';
image_original=imread(file_name);
image_original=double(image_original)/255;
%显示宿主图像
figure(1);
imshow(image_original);
%determine size of original image
[original_v,original_h]=size(image_original);
%读入水印图像
file_name='suda.jpg';
message_suda=imread(file_name);
message=double(message_suda);
%water_size=size(message);
figure(2);
%image(message);%colourmap
imshow(message_suda);
%%制作二值图象作为水印图象%%
[X,map]=imread('suda.jpg');
BB=im2bw(X,map,0.6);
imwrite(BB,'suda.bmp','bmp');%保存制作好的二值水印图象(大小为:64*64)%
figure(3);
imshow('suda.bmp');
BW=BB;
%%Arnold置乱%%
%%Arnold变换%%
w0=double(X);
w1=w0;
[Mc,Nc]=size(X);
times=100;
for k=1:times
for x=1:Mc
for y=1:Nc
x1=x+y;
y1=x+2*y;
if x1>Mc
x1=mod(x1,Mc);
end
if y1>Nc
y1=mod(y1,Nc);
end
if y1==0
y1=Mc;
end
if x1==0
x1=Nc;
end
w1(x1,y1)=w0(x,y);
end;
end;
w0=w1;
end;
BW=w1;
figure(4);
imshow(BW);
%%生成Logistic序列%%
seed=0.3256;%0.165
u=3.9;
Th=0.5;
[row1,col1]=size(BW);
%%Logistic方程为模型的混沌序列发生器%%
logi_mark(1,1)=seed;
for i=2:original_v
for j=2:original_h%*
logi_mark(i,j)=u*logi_mark(1,j-1)*(1-logi_mark(1,j-1));
end
end
logi_mark=reshape(logi_mark,original_v,original_h);
%%Logistic序列阈值变换成二值序列%%
for i=1:row1
for j=1:col1
if(logi_mark(i,j)>Th)
logi_mark(i,j)=1;
else
logi_mark(i,j)=0;
end
end
end
%%加密水印生成%%
for i=1:row1
for j=1:col1
t1=logi_mark(i,j);
t2=BW(i,j);
if (t1==1)&(t2==0) | (t1==0)&(t2==1)
wm(i,j)=1;
else
wm(i,j)=0;
end
end
end
%%在DCT域中嵌入强度因子为alpha=0.75的混沌加密水印%%
alpha=0.75;
wa=zeros(original_v,original_h);
wa=alpha * wm;
T=dctmtx(8);
B=blkproc(image_original,[8 8],'P1*x*P2',T,T');%
Bw=B;
MROW=floor(original_v/8);
MCOL=floor(original_h/8);
for i=1:MROW
for j=1:MCOL
pX=(i-1)*8+2;
pY=(j-1)*8+1;
Bw(pX,pY)=B(pX,pY)*(1+wa(i,j));
end
end
Iw=blkproc(Bw,[8 8],'P1*x*P2',T',T);%
watermarkimage=Iw;
figure(5);
imshow(watermarkimage);title('嵌入水印后图象');
%%%%基于logistic映射的DCT域水印提取%%%%
%%%%混沌加密水印的提取%%%%
for i=1:row1
for j=1:col1
pX=(i-1)*8+2;
pY=(j-1)*8+1;
ExtractMark(i,j)=(Bw(pX,pY)-B(pX,pY))/(alpha*B(pX,pY));
if(ExtractMark(i,j)>0.5)
ExtractMark(i,j)=1;
else
ExtractMark(i,j)=0;
end
end
end
%%混沌加密水印的解密%%
for i=1:row1
for j=1:col1
t1=logi_mark(i,j);
t2=ExtractMark(i,j);
if (t1==1)&(t2==0) | (t1==0)&(t2==1)
BW1(i,j)=1;
else
BW1(i,j)=0;
end
end
end
%%Amold反置乱%%
%%Amold反变换%%
w0=double(X);
w1=w0;
[Mc,Nc]=size(X);
times=10;
for k=1:times
for x=1:Mc
for y=1:Nc
x1=2*x-y;
y1=y-x;
if x1>Mc
x1=mod(x1,Mc);
end
if y1>Nc
y1=mod(y1,Nc);
end
if y1==0
y1=Nc;
end
if x1==0
x1=Mc;
end
if x1<0
x1=Mc+x1;
end
if y1<0
y1=Nc+y1;
end
w1(x1,y1)=w0(x,y);
end;
end;
w0=w1;
end;
BW1=w1;
%%%显示 ‘提取水印’%%%
figure(6);
imshow(BW1);title('提取水印');
%%%保存‘嵌入水印的图象’和‘提取的水印’
imwrite(watermarkimage,'stego_image.bmp','bmp');
imwrite(BW1,'extract_mark.bmp','bmp');
I=double(BB);
II=double(BW1);
J=II-I;
se=std2(J);
d02=J.*J;
d03=mean2(d02);
f=255.0*255.0;
e0=10*log10(f/d03);