⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 watermark.m

📁 用MATLAB实现的数字水印的生成和提取
💻 M
字号:
clear all;
clc;
M1=512;
M2=512;
N1=64;
N2=64;
K=8;
LENGTH=M1*M2/64;
Alphal1=0.01;
Alphal2=0.05;
I=zeros(M1,M2);D=zeros(N1,N2);BW=zeros(M1,M2);I1=zeros(M1,M2);
mark=imread('nju.bmp');
subplot(2,3,1);
imshow(mark);
title('水印图象')
subplot(2,3,2);
I1=imread('lena','bmp');imshow(I1);title('原图象')
BW=edge(I1,'prewitt');
subplot(2,3,3);
imshow(BW);
k1=randn(1,8);
k2=randn(1,8);
title('edge of origine image');
for p=1:N1
    for q=1:N2
        x=(p-1)*K+1;
        y=(q-1)*K+1;
        block=I1(x:x+K-1,y:y+K-1);
        block=dct2(block);
        BW_4_4=BW(x:x+K-1,y:y+K-1);
        if BW_4_4==0
            Alphal=10;
        else
            Alphal=40;
        end
        if mark(p,q)==1
        k=k1;
        else
        k=k2; 
        end
        block(1,8)=block(1,8)+Alphal*k(1);
        block(2,7)=block(2,7)+Alphal*k(2);
        block(3,6)=block(3,6)+Alphal*k(3);
        block(4,5)=block(4,5)+Alphal*k(4);
        block(5,4)=block(5,4)+Alphal*k(5);
        block(6,3)=block(6,3)+Alphal*k(6);
        block(7,2)=block(7,2)+Alphal*k(7);
        block(8,1)=block(8,1)+Alphal*k(8);
        block=idct2(block);
        I(x:x+K-1,y:y+K-1)=block;
    end
end
subplot(2,3,4);
imshow(uint8(I));
title('嵌入水印后的图象')
save II,I;
save I1I1,I1;
imwrite(uint8(I),'zhh.bmp','bmp');


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
disp('对嵌入水印的图像的攻击实验,请输入选择项:');
disp('1--添加白噪声');
disp('2--高斯低通滤波');
disp('3--JPEG 压缩');
disp('4--图像剪切');
disp('5--直接检测水印');
disp('其他--不攻击');
d=input('请输入选择(1-5):');
start_time=cputime;

    figure(1);
            switch d
                case 5
            subplot(2,3,6);
            imshow(uint8(I));
            title('未受攻击的含水印图像');
            M1=I;     
            
                case 1
             WImage2=I;
             noise0=20*randn(size(WImage2));
             WImage2=WImage2+noise0;
             subplot(2,3,6);
             imshow(WImage2,[]);
             title('加入白噪声后图像');
             M1=WImage2;
             M_1=uint8(M1);
             imwrite(M_1,'whitenoise.bmp','bmp');
                
                case 2
             WImage3=I;
             H=fspecial('gaussian',[4,4],0.2);
             WImage3=imfilter(WImage3,H);
             subplot(2,3,6);
             imshow(WImage3,[]);
             title('高斯低通滤波后图像');
             M1=WImage3;
             M_1=uint8(M1);
             imwrite(M_1,'gaussian.bmp','bmp');
             
                case 4
             WImage4=I;
             WImage4(1:64,1:512)=512;
             WImage4cl=mat2gray(WImage4);
             subplot(2,3,6);
             imshow(WImage4cl);
             title('部分剪切后图像');
             figure(1);
             M1=WImage4cl;
          
                case 3
             WImage5=I;
             WImage5=im2double(WImage5);
             cnum=10;
             dctm=dctmtx(8);
             P1=dctm;
             P2=dctm.';
             imageDCT=blkproc(WImage5,[8,8],'P1*x*P2',dctm,dctm.');
             DCTvar=im2col(imageDCT,[8,8],'distinct').';
             n=size(DCTvar,1);
             DCTvar=(sum(DCTvar.*DCTvar)-(sum(DCTvar)/n).^2)/n;
             [dum,order]=sort(DCTvar);
             cnum=64-cnum;
             mask=ones(8,8);
             mask(order(1:cnum))=zeros(1,cnum);
             im88=zeros(9,9);
             im88(1:8,1:8)=mask;
             im128128=kron(im88(1:8,1:8),ones(16));
             dctm=dctmtx(8);
             P1=dctm.';
             P2=mask(1:8,1:8);
             P3=dctm;
             WImage5=blkproc(imageDCT,[8,8],'P1*(x.*P2)*P3',dctm.',mask(1:8,1:8),dctm);
             WImage5cl=mat2gray(WImage5);
             subplot(2,3,6);
             imshow(WImage5cl);
             title('经JPEG压缩后图像');
             M1=WImage5cl;
                
            end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
block=zeros(K,K);
block1=zeros(K,K);
mark1=zeros(N1,N2);
P=zeros(1,8);
for p=1:N1
    for q=1:N2
        x=(p-1)*K+1;
        y=(q-1)*K+1;
        block1=M1(x:x+K-1,y:y+K-1);
        block1=dct2(block1);
        P(1)=block1(1,8);
        P(2)=block1(2,7);
        P(3)=block1(3,6);
        P(4)=block1(4,5);
        P(5)=block1(5,4);
        P(6)=block1(6,3);
        P(7)=block1(7,2);
        P(8)=block1(8,1);
        if corr2(P,k1)>corr2(P,k2),warning off MATLAB:divideByZero;        
        mark1(p,q)=1;
     end
    end
end
subplot(2,3,5)
imshow(mark1);
title('水印提取')


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -