gusucode.com > 小波变换的数字水印matlab源码程序 > new_wavelet/Start_Embed.m

    Image = imread('barbara_512.bmp');
% Image = imread('lena_512.bmp');
[m,n] = size(Image);
Block_Size = 16;
Block_Image = Block(Image,Block_Size,Block_Size);                                          %将原图分成16*16的分块
Block_Num = (m*n)/(Block_Size*Block_Size);                                                 %Block_num 为分块数 
Water_Num = 8*Block_Num;                                                                   %8*1024=8192                                                     
% %%%%%%%%%%%%%%%%%%%%%%%%%
%产生水印序列
%%%%%%%%%%%%%%%%%%%%%%%%

Key = rand(1,1000);
X(1) = Key(500);                                                                          %取第500个随机数作为混沌序列发生器的处置
% X(1) = 0.37;
W = zeros(1,Water_Num);

if X(1) > 0.5                                                                             %对初值进行判断,若大于0.5则取1,若小于0.5则取-1
    W(1) = 1;  
else
    W(1) = -1;
end
    
N = Water_Num;                               
Num_N = 0;                                                                               %Num_N,Num_p 分别为1和+1的个数这里对他们进行初始化                                             
Num_P = 0;
for i = 1:(N-1)
    X(i+1) = 3.93*X(i)*(1-X(i));
    if  X(i+1) <= 0.5
        W(i+1) = -1;
        Num_N = Num_N+1;
   else
        W(i+1) = 1;
        Num_P = Num_P+1;
    end
end

WaterMark = W;
for i = 1:Block_Num;
    Water{1,i} = [WaterMark((i-1)*8+1:i*8)];
end

for i = 1:Block_Num                                                                      %对分块进行嵌入处理
    New_Block_Image{1,i} = Embed(Block_Image{1,i},Water{1,i});
end

Block_Row_Num = m/Block_Size;
for i = 1:Block_Row_Num
    Temp1 = [New_Block_Image{1,(Block_Row_Num*(i-1)+1):(Block_Row_Num*(i-1)+Block_Row_Num)}];
    Temp2{1,i} = Temp1';
end
Temp3 = [Temp2{1,1:Block_Row_Num}];
Add_Water_Image = Temp3';

imwrite(uint8(Add_Water_Image),'Add_Water_Image.bmp');
Res_PSNR = psnr(Image,Add_Water_Image);