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);