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

    function New_Image = Embed(Image,Water)
% Test = imread('barbara_512.bmp');
% Block_Image = Block(Test,16,16);
% Image = Block_Image{1,1};


[c,s] = wavedec2(Image,3,'haar'); 
cx = c;
HL3 = detcoef2('h',c,s,3);         %提取中频分量
HL = HL3;
LH3 = detcoef2('v',c,s,3);          
LH = LH3;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%计算嵌入强度BeiTa值
[m1,n1] = size(HL);                %计算HL中系数的和
HL_Sum = 0;
HL_Num = m1*n1;
for i = 1:m1
    for j = 1:n1
        HL_Sum = HL_Sum+HL(i,j);
    end
end

[m2,n2] = size(LH);                %计算LH中系数的和
LH_Sum = 0;
LH_Num = m2*n2;
for i = 1:m2
    for j = 1:n2
        LH_Sum=LH_Sum+LH(i,j);
    end
end

Dmn_Sum = HL_Sum+LH_Sum;          %Dmn_Sum为中频系数的和
Dmn_Num = HL_Num+LH_Num;          %Dmn_Num为中频系数的个数
Dmn_Average = Dmn_Sum/Dmn_Num;

p = 3;                              %dmn的平均距离Smn在P幂点列空间中计算的,文中P取3
Q = Dmn_Num;
Smn_HL_Sum = 0;
for i = 1:m1
    for j = 1: n1
        Temp1 = abs(HL(i,j)-Dmn_Average);
        Temp2 = Temp1^p;
        Smn_HL_Sum = Smn_HL_Sum+Temp2;
    end
end

Smn_LH_Sum = 0;
for i = 1:m2
    for j = 1: n2
        Temp1 = abs(LH(i,j)-Dmn_Average);
        Temp2 = Temp1^p;
        Smn_LH_Sum = Smn_LH_Sum+Temp2;
    end
end

Temp_Sum = Smn_HL_Sum+Smn_LH_Sum;
Smn = (1/Q)*((Temp_Sum)^(1/p));

Bmn_HL = zeros(m1,n1);                                           %用Smn对小波系数进行2值化
Bmn_HL_Sum =0;
for i = 1:m1                                     
    for j = 1:n1
        if abs(HL(i,j))<Smn
            Bmn_HL(i,j) = 0;
        else
            Bmn_HL(i,j) = 1;
            Bmn_HL_Sum =Bmn_HL_Sum+1;
        end
    end
end

Bmn_LH = zeros(m2,n2);                                           
Bmn_LH_Sum =0;
for i = 1:m2                                     
    for j = 1:n2
        if abs(LH(i,j))<Smn
            Bmn_LH(i,j) = 0;
        else
            Bmn_LH(i,j) = 1;
            Bmn_LH_Sum = Bmn_LH_Sum+1;
        end
    end
end

Beita = 10*(1/Q)*(Bmn_HL_Sum+Bmn_LH_Sum);                          %Beita值


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%进行水印嵌入
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% O_Water = rand(1,8);
% for i = 1:8
%     if O_Water(i) > 0.5
%        Water(i) = 1;
%     else
%         Water(i) = -1;
%     end
% end
for i = 1:m1
    Cof_1((i-1)*n1+1:(i-1)*n1+n1) = HL(i,:);
end
 
for i = 1:m2
    Cof_2((i-1)*n2+1:(i-1)*n2+n2) = LH(i,:);
end

Cof = [Cof_1,Cof_2];
Cof_Num = (m1*n1)+(m2*n2);

for i = 1: Cof_Num
    Cof(i) = Cof(i)+ Beita*Water(i);
end

New_Cof_1 = [Cof(1:m1*n1)];
New_Cof_2 = [Cof(m1*n1+1:Cof_Num)];

for i = 1:m1
   New_HL(i,:) =  New_Cof_1((i-1)*n1+1:(i-1)*n1+n1);
end

for i = 1:m2
   New_LH(i,:) =  New_Cof_2((i-1)*n2+1:(i-1)*n2+n2);
end

for r = 1:n1
      cx(1,m1*n1+1+(r-1)*m1:m1*n1+r*m1) = New_HL(:,r)';
end

for r = 1:n2
      cx(1,m2*n2*2+1+(r-1)*m2:m2*n2*2+r*m2) = New_LH(:,r)';
end

New_Image = waverec2(cx,s,'haar');