www.gusucode.com > 一个基于奇异值分解的数字水印源代码matlab程序 > svd/zuoye2.m

    clc
close all
clear all
% 保存开始时间
start_time=cputime;
iTimes=4;     %置乱次数
 alpha=0.2;      
blocksize=8;    % 设置块的大小

% 读入原图像
file_name='_lena_std_bw.bmp';
cover_object=double(imread(file_name));

% 原图像的行数与列数
Mc=size(cover_object,1);	        %原图像行数
Nc=size(cover_object,2);	        %原图像列数
%k=Mc*Nc/64;
% 最大嵌入信息量
max_message=Mc*Nc/(blocksize^2);

% 读入水印图像
file_name='xj.bmp';
I=imread(file_name);

message=double(I);

%%水印图像的行数与列数
Mm=size(message,1);	                %水印行数
Nm=size(message,2);	                %水印列数

message_vector=reshape(message,1,Mm*Nm);

% 检查水印信息是否过大
if (Mm*Nm> max_message)
    error('水印太大')
end



%对水印图像进行arnold置乱
% if Mm~=Nm
%   error('水印矩阵必须为方阵');
% end
% if Mm~=48
%   error('必须为40*40大小,或者修改置乱次数');
% end
% 
% tempImg=message;
% for n=1:iTimes % 次数
%   for u=1:Mm
%     for v=1:Nm
%       temp=tempImg(u,v);
%       ax=mod((u-1)+(v-1),Mm)+1;
%       ay=mod((u-1)+2*(v-1),Nm)+1;
%       outImg(ax,ay)=temp;
%     end
%   end
% tempImg=outImg;
% end
% message_vector=reshape(outImg,1,Mm*Nm);
message_vector=reshape(message,1,Mm*Nm);
%    sequence1=round(rand(1,7));
%   sequence2=round(rand(1,7));
 sequence1=[1 0 1 1 0 0 0];
 sequence2=[0 0 1 0 0 1 1];
% sequence1=rand(1,7);
% sequence2=rand(1,7);
% for i=1:7
%      if sequence1(i)<0.333
%     sequence1(i)=-1;
%计算总个数及编码后长度f 0.333<sequence2(i)&&sequence2(i)<0.666
%     sequence2(i)=0;
% else 0.666<sequence2(i)
%     sequence2(i)=1;
% end
% end
% 
k=1;
x=1;
y=1;

for (kk = 1:length(message_vector))

    % 对块进行SVD变换
    [u,s,v] = svd(cover_object(x:x+blocksize-1,y:y+blocksize-1));
    s_orig(x:x+blocksize-1,y:y+blocksize-1)=s;

    s1(1,1)=s(1,1);
    if (message_vector(kk) == 1)
        for i=2:8
           s1(i,i)=s(i,i)+alpha*sequence1(i-1);   
       end
       elseif (message_vector(kk) == 0)
           for i=2:8
           s1(i,i)=s(i,i)+alpha*sequence2(i-1);
       end
    end
    %重新排序,并记录位置
%    s1=diag(s1)';a=s1(2:8);
%        s1=sort(s1);
%        s1=fliplr(s1);
%         for i=2:8
%             index(i-1)=find(s1(i)==a);
%         end
%        order(:,k)=index';
%     s1=diag(s1);
       [u1,s11,v1]=svd(s1);
     watermarked_image(x:x+blocksize-1,y:y+blocksize-1)=u*s11*v';
     u_orig(x:x+blocksize-1,y:y+blocksize-1)=u;
    v_orig(x:x+blocksize-1,y:y+blocksize-1)=v;
    u1_orig(x:x+blocksize-1,y:y+blocksize-1)=u1;
    v1_orig(x:x+blocksize-1,y:y+blocksize-1)=v1;
   
    k=k+1;
    % 移动到下一块
    if (x+blocksize) >= Nc
        x=1;
        y=y+blocksize;
    else
        x=x+blocksize;
    end   
end
watermarked_image_uint=uint8(watermarked_image);
imwrite(watermarked_image_uint,'svd_watermarked.bmp','bmp');

figure
subplot(1,2,1);
imshow(watermarked_image,[]);
title('原始图像');
subplot(1,2,2);
imshow(cover_object,[])
title('嵌入水印图像');
figure
imshow(I);


iTimes=8;         %置乱次数


% 保存开始时间
start_time=cputime;

blocksize=8;    % 设置块的大小

% 读入嵌入水印图像
file_name='svd_watermarked.bmp';
watermarked_image=double(imread(file_name));

% 嵌入水印图像的行数与列数
Mw=size(watermarked_image,1);	        %嵌入水印图像的行数
Nw=size(watermarked_image,2);	        %嵌入水印图像的列数

% 将图像分块提取水印
x=1;
y=1;
k=1;
for (kk = 1:max_message)

    % 对块进行svd变换
    [u11,s111,v11] = svd(watermarked_image(x:x+blocksize-1,y:y+blocksize-1));
    d=u1_orig(x:x+blocksize-1,y:y+blocksize-1)*s111*v1_orig(x:x+blocksize-1,y:y+blocksize-1)';
    sequence3=diag((d-s_orig(x:x+blocksize-1,y:y+blocksize-1)))';
    sequence3=fix(sequence3(2:8));
%    ss=u(x:x+blocksize-1,y:y+blocksize-1)'*watermarked_image(x:x+blocksize-1,y:y+blocksize-1)*v(x:x+blocksize-1,y:y+blocksize-1);
%        ss=diag(s);
%        sequence3=ss(2:8)';
%       
% %              sequence1=sequence1(order(:,k)');
% %              sequence2=sequence2(order(:,k)');
% %      
       relation1=corr2(sequence3,sequence1);
       relation2=corr2(sequence3,sequence2);
         if relation1>relation2
       message_vector(kk)=1;
   else 
        message_vector(kk)=0;
    end
    % 移动到下一块
    k=k+1;
    if (x+blocksize) >= Mw
        x=1;
        y=y+blocksize;
    else
        x=x+blocksize;
    end

end



% arnold置乱
% tempImg=reshape(message_vector(1:Mm*Nm),Mm,Nm);
%  %tempImg=message_vector;
% message_arnold=tempImg;
% for n=1:iTimes % 次数
%   for u=1:Mm
%     for v=1:Nm
%       temp=tempImg(u,v);
%       ax=mod((u-1)+(v-1),Mm)+1;
%       ay=mod((u-1)+2*(v-1),Nm)+1;
%       outImg(ax,ay)=temp;
%     end
%   end
% tempImg=outImg;
% end
% message=outImg;

% 将message重新排列
message_vector=message_vector(1,1:Mm*Nm);  
message=reshape(message_vector,Mm,Nm);

% 显示运行时间
elapsed_time=cputime-start_time,

% 显示提取水印与原始水印 
figure
subplot(1,2,1);
imshow(message,[]);
title('提取水印');

subplot(1,2,2);
imshow(I);
title('原始水印');
p=corr2(I,message)
p1=corr2(cover_object,watermarked_image)
psnr=psnr(cover_object,watermarked_image)

for i=1:50
    zaosheng=round(rand(48,48));
    
    p(i)=corr2(I,zaosheng);
    p(10)=corr2(I,message);
end
figure
plot(p);