zoukankan      html  css  js  c++  java
  • DCT实现水印嵌入与提取(带攻击)

    问题:

    想要用DCT技术,在Matlib上实现水印的隐藏和提取(带GUI界面),且加上一些攻击(噪声、旋转、裁剪),以及用NC值评判!

    流程

    选择载体

    [filename,pathname]=uigetfile({'*.bmp';'*.jpg';'*.*'},'选择图片');%文件选择,这里可以选择可以打开的图片格式
    str=[pathname filename];%被选择的文件路径
    [handles.I,handles.map]=imread(str);%读取图片
    zai=imread(str);
    %zai=[handles.I,handles.map];
    psnr_cover=double(zai);
    guidata(hObject,handles);%图像串行化,保存在hObject,这样我整个页面都能取到handles的值
    axes(handles.axes1);%把显示范围限定在axes1
    imshow(zai,[]);%显示图片

    选择要嵌入的水印

    [filename,pathname]=uigetfile({'*.bmp';'*.jpg';'*.*'},'选择图片');%文件选择,这里可以选择可以打开的图片格式
    str=[pathname filename];%被选择的文件路径
    [handles.I,handles.map]=imread(str);%读取图片
    %water=[handles.I,handles.map];
    global water;
    water=imread(str);
    water=rgb2gray(water);
    water=double(water)/255; 
    water=ceil(water);
    %guidata(hObject,handles);%图像串行化,保存在hObject,这样我整个页面都能取到handles的值
    axes(handles.axes4);%把显示范围限定在axes4
    imshow(water);%显示图片
    dimI=size(water);
    global rm;
    global cm;
    rm=dimI(1);cm=dimI(2);
    

    嵌入

    start_time=cputime;
    global water;
    global rm;
    global cm;
    cda0=blkproc(handles.I,[8,8],'dct2');
    mark=water;
    alpha=10;
    global k1;
    global k2;
    k1=randn(1,8);
    k2=randn(1,8);
    [r,c]=size(handles.I);
    cda1=cda0;   % cda1 = 256_256
    for i=1:rm  % i=1:32
        for j=1:cm  % j=1:32
            x=(i-1)*8;y=(j-1)*8;
            if mark(i,j)==1
                k=k1;
            else
                k=k2;
            end
            cda1(x+1,y+8)=cda0(x+1,y+8)+alpha*k(1);
            cda1(x+2,y+7)=cda0(x+2,y+7)+alpha*k(2);
            cda1(x+3,y+6)=cda0(x+3,y+6)+alpha*k(3);
            cda1(x+4,y+5)=cda0(x+4,y+5)+alpha*k(4);
            cda1(x+5,y+4)=cda0(x+5,y+4)+alpha*k(5);
            cda1(x+6,y+3)=cda0(x+6,y+3)+alpha*k(6);
            cda1(x+7,y+2)=cda0(x+7,y+2)+alpha*k(7);
            cda1(x+8,y+1)=cda0(x+8,y+1)+alpha*k(8);
        end
    end
    global a1;
    a1=blkproc(cda1,[8,8],'idct2');
    a_1=uint8(a1);
    
    axes(handles.axes5);%把显示范围限定在axes5s
    imshow(a_1);%显示图片
    %imwrite(a_1,'嵌入水印后的图.bmp','bmp');
    %subplot(2,3,3),imshow(a1,[]),title('嵌入水印后的图像');
    %disp('嵌入水印处理时间')
    embed_time=cputime-start_time
    set(handles.text13,'string',num2str(embed_time));
    p0=a_1;

    攻击

    1、白噪声攻击

    gong=a1;
    noise0=1*randn(size(gong));
    gong=uint8(gong+noise0);

    2、椒盐噪声

    gong=imnoise(uint8(a1), 'salt & pepper', 0.01);%添加密度为0.01的椒盐噪声

    3、旋转

    gong=uint8(imrotate(uint8(a1),30,'nearest','crop'));

    4、裁剪

    %原图进行分色并剪切
    gong=a1;
    I_r= gong(:,:,1);
    I_r(1:128,1:128)=255;
    %三色通道合并
    gong(:,:,1) = I_r;
    gong=uint8(gong);

    提取

    global k1;
    global gong;
    global k2;
    global water;
    dimI=size(water);
    
    psnr_watermarked=double(gong);
    dca1=blkproc(gong,[8,8],'dct2');
    p=zeros(1,8);
    for i=1:dimI(1) %行
        for j=1:dimI(2)  % j=1:32列
            x=(i-1)*8;y=(j-1)*8;
            p(1)=dca1(x+1,y+8);
            p(2)=dca1(x+2,y+7);
            p(3)=dca1(x+3,y+6);
            p(4)=dca1(x+4,y+5);
            p(5)=dca1(x+5,y+4);
            p(6)=dca1(x+6,y+3);
            p(7)=dca1(x+7,y+2);
            p(8)=dca1(x+8,y+1);
            if corr2(p,k1)>corr2(p,k2),warning off MATLAB:divideByZero;
                mark1(i,j)=1;
            else
                mark1(i,j)=0;
            end
        end
    end
    axes(handles.axes7);%把显示范围限定在axes5s
    imshow(mark1);%显示图片
    embed_time=cputime-start_time;
    set(handles.text14,'string',num2str(embed_time));
    
    NC=nc(mark1,water)  %调用nc.m子函数
    set(handles.text15,'string',num2str(NC));
    

    结果

    源程序见github

    参考

    1、数字水印常见攻击类型汇总,噪声,缩放,旋转,剪切(附matlab代码)

     

    作者: Pam

    出处: https://www.cnblogs.com/pam-sh/>

    关于作者:网安在读

    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出, 原文链接 如有问题, 可邮件(mir_soh@163.com)咨询.

  • 相关阅读:
    9-29 函数嵌套及作用域链
    9-29 函数进阶_命名空间和作用域
    9-28 函数
    9-27 文件的”改”、删、重命名
    9-26 联合文件的登录注册
    9-26 文件操作一些功能详解
    9-26 文件操作
    9-26 复习数据类型
    9-25 集合
    python基础day7_购物车实例
  • 原文地址:https://www.cnblogs.com/pam-sh/p/14890278.html
Copyright © 2011-2022 走看看