matlab加入水印提取水印函数


matlab加入水印提取水印函数matlab加入水印提取水印函数

clc

clear
% M=256;  %原图像长度
% N=60;   %水印图像长度
%  K=8; 
% I=zeros(M,M);
% II=zeros(K,K);
% B=zeros(M,M);
% Idct=zeros(K,K);
% D=zeros(M,M);
%读取原图像
I=imread('C:\Users\Administrator\Desktop\LENA.jpg');
Ir=imread('C:\Users\Administrator\Desktop\shuiyin.bmp');
subplot(2,2,1);
%显示原图像
imshow(I);
title('原图像');
subplot(2,2,2);
%显示原图像
imshow(Ir);
title('水印图像');
M=size(I,1);
N=size(Ir,1);
K=M/N;
% M=1;
% N=1;
%嵌入水印
for m=1:N
    for n=1:N
        x=(m-1)*K+1;
        y=(n-1)*K+1;
        II=I(x:x+K-1,y:y+K-1);%将原图分成8*8的子块
        Idct=dct2(II);%对子块进行DCT变换
        xIdct=Idct;
%       if x==1&y==1
%           alfa=0.02;
%       else
          alfa=0.2;
%       end 
        B=Idct+alfa*double(Ir(m,n));
%         B=Idct;
        Bidct=idct2(B);%进行DCT反变换
        xx=dct2(Bidct);
        J(x:x+K-1,y:y+K-1)=Bidct;
    end
end
subplot(2,2,3);
j=uint8(J);
imshow(j);%显示嵌入水印后的图像
title('加水印图像');
% imwrite(j,'C:\Users\Administrator\Desktop\addshuiyin.bmp');




%提取水印
J=imread('C:\Users\Administrator\Desktop\addshuiyin.bmp');
Ir=imread('C:\Users\Administrator\Desktop\shuiyin.bmp');
M=size(J,1);
N=size(Ir,1);
K=M/N;
K1=8;
for m=1:N
    for n=1:N
        x=(m-1)*K1+1;
        y=(n-1)*K1+1;
        II=I(x:x+K1-1,y:y+K1-1);%将原图分成8*8的子块
        Idct=dct2(II);%对子块进行DCT变换
        JJ=J(x:x+K-1,y:y+K-1);%将加水印图分成8*8的子块
        Jdct=dct2(JJ);%对子块进行DCT变换
        Jrr=Jdct(1,1)-Idct(1,1);
        Bidct=idct2(Jrr);%进行DCT反变换
        if Bidct>0.01
            Jr(m,n)=1;
        else
            Jr(m,n)=0;
        end
    end
end
subplot(2,2,4);
jr=logical(Jr);
imshow(jr);%显示嵌入水印后的图像
title('提取的水印');
imwrite(jr,'C:\Users\Administrator\Desktop\tiqushuiyin.bmp');