精华内容
下载资源
问答
  • 基于DCT变换数字水印研究及其MATLAB实现.pdf
  • DCT离散余弦变换实现数字水印算法;在进行水印嵌入时,先对水印用了Arnold变换;包含了几种不同的水印攻击
  • 基于DCT变换数字水印技术,源码分析 matlab实现
  • 基于DCT变换数字水印研究及其MATLAB实现
  • DCT离散余弦变换实现数字水印算法;在进行水印嵌入时,先对水印用了Arnold变换;包含了几种不同的水印攻击。
  • 基于DCT变换数字水印生成,防止图片被不法分子非法盗用。
  • 基于DCT变换数字水印算法 carry_x.bmp 为载体图片 water_x.bmp 为水印图片 test.fig 为图形界面 main.m 为程序执行入口 test.m 为程序主函数 ispsnr.m 为计算峰值信噪比函数(不会再程序中体现) nc.m ...
  • 本文是基于DCT变换数字水印技术,对水印的嵌入和提取进行了详细的说明
  • 基于DCT变换数字水印信息安全研究,张银娟,王永科,为了有效保护多媒体信息的版权,研究利用离散余弦变换(discrete cosine transform,简称DCT)的算法对整个数字水印图像进行数字变换,将��
  • 一个基于dct变换数字水印算法的源程序.rar
  • 一种基于DCT变换域的数字水印设计方案.pdf一种基于DCT变换域的数字水印设计方案.pdf一种基于DCT变换域的数字水印设计方案.pdf一种基于DCT变换域的数字水印设计方案.pdf一种基于DCT变换域的数字水印设计方案.pdf
  • 基于DCT数字水印

    2015-01-24 15:39:22
    基于DCT变换的一种数字水印技术的实现,其中还包括一些攻击测验。
  • 数字水印技术近年来得到了较大的发展 基于变换域的水印技术是目前研究的热点 该文提出! " ! 了一种基于 域的自适应水印算法 实验结果表明 这种算法具有良好的性能 实现的水印具有不可见" ! ! QEN 性 而且具有较好的...
  • 基于dct数字水印

    2010-06-07 21:37:24
    基于dct变换数字水印技术。。。。matiab源程序代码
  • 利用置乱变换和纠错编码进行水印图像预处理,将水印嵌入在DCT的中低频系数中,能够满足不可见性和鲁棒性,可供研究静态图像数字水印的同学们作为参考
  • 很好,可以作为毕业设计参考资料,是一份基于DCT变换域的数字水印的开题报告。
  • 主要就是实现数字水印的嵌入提取和在不同攻击如旋转剪切噪声等下的提取效果差异的比对1 DCT变换的原理2 DCT变换的特点 在基于DCT的变换编码中,图像是先经分块(8×8或16×16)后再经DCT,这种变换是局部的,只...

    主要就是实现了数字水印的嵌入提取和在不同攻击如旋转剪切噪声等下的提取效果差异的比对

    1 DCT变换的原理

    2  DCT变换的特点

        在基于DCT的变换编码中,图像是先经分块(8×8或16×16)后再经DCT,这种变换是局部的,只反映了图像某一部分的信息。当然也可以对整幅图像的特点,但是运算速度比分块DCT要慢。图像经DCT后,得到的DCT图像有三个特点:  

        (1). 系数值全部集中到0值附近(从直方图统计的意义上),动态范围很小,这说明用较小的量化比特数即可表示DCT系数; 

        (2). DCT变换后图像能量集中在图像的低频部分,即DCT图像中不为零的系数大部分集中在一起(左上角),因此编码效率很高。 

        (3). 没有保留原图像块的精细结构,从中反映不了原图像块的边缘、轮廓等信息,这一特点是由DCT缺乏时局域性造成的。

    3 宿主图像的DCT变换

    对于N×N大小的256灰度级的宿主图像I进行N×N二维离散余弦变换(DCT)。以ZigZag方式对于DCT变换后的图像频率系数重新排列成一维向量Y={y1, y2,…yN×N}.  并取出序列中第L+1到L+M的中频系数部分,得到YL={ YL+1, YL+2,…, YL+M}。

    4 DCT数字水印嵌入算法流程


    5.DCT数字水印提取算法流程



    matlab代码实现:

    DCT主函数

    %------------------------------------------------------------------%
    %     基于DCT变换的信息隐藏(数字水印)     %%                                                                %%                                                                %
    %-----------------------------------------------------------=------%
    clear ;
    clc;
          
    %-----------------------读入图像-------------------------------------%
    markbefore=imread('sss.bmp');
    markbefore2=rgb2gray(markbefore);
    mark=im2bw(markbefore2);    %使水印图像变为二值图
    figure(1);      %打开窗口
    subplot(2,3,1);    %该窗口内的图像可以有两行三列
    imshow(mark),title('水印图像');   %显示水印图像
    [rm,cm]=size(mark);   %计算水印图像的长宽
    
    cover_image=imread('carrier_image.bmp');
    cover_image=rgb2gray(cover_image);
    subplot(2,3,2),imshow(cover_image,[]),title('载体图像'); %[]表示显示时灰度范围为image上的灰度最小值到最大值
    
    before=blkproc(cover_image,[8 8],'dct2');   %将载体图像的灰度层分为8×8的小块,每一块内做二维DCT变换,结果记入矩阵before
    
    I=mark;
    alpha=30;     %尺度因子,控制水印添加的强度,决定了频域系数被修改的幅度
    k1=randn(1,8);  %产生两个不同的随机序列
    k2=randn(1,8);
    after=before;   %初始化载入水印的结果矩阵
    for i=1:rm          %在中频段嵌入水印
        for j=1:cm
            x=(i-1)*8;
            y=(j-1)*8;
            if mark(i,j)==1
                k=k1;
            else
                k=k2;
            end;
            after(x+1,y+8)=before(x+1,y+8)+alpha*k(1);
            after(x+2,y+7)=before(x+2,y+7)+alpha*k(2);
            after(x+3,y+6)=before(x+3,y+6)+alpha*k(3);
            after(x+4,y+5)=before(x+4,y+5)+alpha*k(4);
            after(x+5,y+4)=before(x+5,y+4)+alpha*k(5);
            after(x+6,y+3)=before(x+6,y+3)+alpha*k(6);
            after(x+7,y+2)=before(x+7,y+2)+alpha*k(7);
            after(x+8,y+1)=before(x+8,y+1)+alpha*k(8);
        end;
    end;
    result=blkproc(after,[8 8],'idct2');    %将经处理的图像分为8×8的小块,每一块内做二维DCT逆变换
    result = uint8(result);
    imwrite(result,'markresule.bmp','bmp');      %存储添加水印后的图像
    subplot(2,3,3),imshow(result,[]),title('嵌入水印的图像');    %显示添加水印后的图像
    
    %定义一个空空间来存储提取的水印
    disp('请选择对图像的攻击方式:');
    disp('1.添加白噪声');
    disp('2.高斯低通滤波处理');
    disp('3.对图像进行部分剪切');
    disp('4.将图像旋转十度');
    disp('5.将图像压缩处理');
    disp('6.添加椒盐噪声');
    disp('7.不处理图像,直接显示提取水印');
    disp('输入其它数字则直接显示提取水印');
    choice=input('请输入选择:');
    figure(1);
    switch choice        %读入输入的选择  withmark为等待提取水印的图像
        case 1
            result_1=result;
            withmark=imnoise(result_1,'gaussian',0.02); %加入椒盐躁声
            subplot(2,3,4);
            imshow(withmark,[]);
            title('加入高斯白噪声后的图像');     %显示加了椒盐噪声的图像
        case 2
             result_2=result;
             H=fspecial('gaussian',[4,4],0.2); 
             result_2=imfilter(result_2,H); 
             subplot(2,3,4); 
             imshow(result_2,[]); 
             title('高斯低通滤波后图像'); 
             withmark=result_2;
        case 3
            result_3=result;
            result_3(1:64,1:400)=512;   %使图像上方被剪裁
            subplot(2,3,4);
            imshow(result_3);
            title('上方剪切后图像');
            withmark=result_3;
        case 4
            result_4=imrotate(result,10,'bilinear','crop');   %最邻近线性插值算法旋转10度
            subplot(2,3,4);
            imshow(result_4);
            title('旋转10度后图像');
            withmark=result_4;
        case 5
            result_5 = result; 
            result_5=im2double(result_5); 
            cnum=10; 
            dctm=dctmtx(8); 
            P1=dctm; 
            P2=dctm.'; 
            imageDCT=blkproc(result_5,[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; 
            result_5=blkproc(imageDCT,[8,8],'P1*(x.*P2)*P3',dctm.',mask(1:8,1:8),dctm); 
            WImage5cl=mat2gray(result_5); 
            subplot(2,3,4); 
            imshow(WImage5cl); 
            title('经JPEG压缩后图像'); 
            withmark=WImage5cl;
        case 6
            result_6=result;
            withmark=imnoise(result_6,'salt & pepper',0.02); %加入椒盐躁声
            subplot(2,3,4);
            imshow(withmark,[]);
            title('加入椒盐噪声后的图像');     %显示加了椒盐噪声的图像
        case 7
            subplot(2,3,4);
            imshow(result,[]);
            title('未受攻击的水印图像');
            withmark=result;
        otherwise
            disp('输入数字选择无效,图像未受攻击,直接提取水印');
            subplot(2,3,4);
            imshow(result,[]);
            title('未受攻击的水印图像');
            withmark=result;
    end
    
    %------------------------水印提取-----------------------------%
    %
    after_2=blkproc(withmark,[8,8],'dct2');   %此步开始提取水印,将灰度层分块进行DCT变换
    p=zeros(1,8);        %初始化提取数值用的矩阵
    mark_2 = zeros(rm,cm);
    for i=1:rm
        for j=1:cm
            x=(i-1)*8;y=(j-1)*8;
            p(1)=after_2(x+1,y+8);         %将之前改变过数值的点的数值提取出来
            p(2)=after_2(x+2,y+7);
            p(3)=after_2(x+3,y+6);
            p(4)=after_2(x+4,y+5);
            p(5)=after_2(x+5,y+4);
            p(6)=after_2(x+6,y+3);
            p(7)=after_2(x+7,y+2);
            p(8)=after_2(x+8,y+1);
            if corr2(p,k1)>corr2(p,k2)  %corr2计算两个矩阵的相似度,越接近1相似度越大
                mark_2(i,j)=1;              %比较提取出来的数值与随机频率k1和k2的相似度,还原水印图样
            else
                mark_2(i,j)=0;
            end
        end
    end
    subplot(2,3,5);
    mark_2 = uint8(mark_2);
    imshow(mark_2,[]),title('提取出的水印');
    subplot(2,3,6);
    imshow(mark),title('原嵌入水印');
    NC=correlation(mark_2,mark);  
    disp('原水印图像与提取水印图像互相关系数:')
    disp(NC);
    correlation函数:
    function N=correlation(mark_get,mark_prime) 
    mark_get=double(mark_get); 
    mark_prime=double(mark_prime); 
    if size(mark_get)~=size(mark_prime) 
        error('Input vectors must  be the same size!') 
    else 
        [m,n]=size(mark_get); 
        fenzi=0; 
        fenmu=0; 
        for i=1:m 
            for j=1:n 
                fenzi=fenzi+mark_get(i,j)*mark_prime(i,j); 
                fenmu=fenmu+mark_prime(i,j)*mark_prime(i,j); 
            end 
        end 
    N=min(fenzi/fenmu,fenmu/fenzi); 
    end
    其中的一个效果图

    展开全文
  • 这是我写的基于DCT变换数字水印程序,MATLAB6.5实现。有一点实现的不好。希望对你有一点帮助,也希望你能帮我改善一下,告诉我!谢谢
  • 基于离散余弦变换数字水印潜入算法,可以直接运行的源代码
  • 在对数字水印的概念、特点、分类等进行了系统研究的基础上, 采用基于离散余弦变换(DCT) 的数字水印算法, 实现了水印的嵌入和检测, 并采用Jpeg 压缩、图像仿射变换等多种水印攻击算法对水印算法的性能进行了评价。
  • 【MATLAB】基于DCT变换数字水印

    万次阅读 多人点赞 2017-10-27 17:25:35
    %此步开始提取水印,将灰度层分块进行DCT变换 p=zeros(1,8); %初始化提取数值用的矩阵 for i=1:marksize(1) for j=1:marksize(2) x=(i-1)*8;y=(j-1)*8; p(1)=after_2(x+1,y+8); %将之前改变过数值的点的数值提取...

    一年前的媒体信号处理的课程的project,现在翻出来打算用python写一遍然而发现自己对这段代码毫无记忆
    可能写的时候活在梦里 (:△」∠)

    翻出来回味一下……注释里面写得很详尽了。
    其实因为被大佬们的恶竞刺激到了所以还写了个界面……傻瓜式的,就不贴了……

    由于我当时考虑的疏忽,我记得能处理的图片大小是有限制的,这一点就请大家自己调整啦。

    clear;
    clc;
    
    disp('请选择水印图像:');
    [filename, pathname] = uigetfile('*.jpg', '读取图片文件');
    pathfile=fullfile(pathname, filename);
    markbefore=imread(pathfile); 
    disp('请选择载体图像:');
    [filename2, pathname2] = uigetfile('*.jpg', '读取图片文件');
    pathfile2=fullfile(pathname2, filename2);
    image=imread(pathfile2); 
    
    markbefore2=rgb2gray(markbefore);
    mark=im2bw(markbefore2);    %使水印图像变为二值图
    figure(1);      %打开窗口
    subplot(2,3,1);    %该窗口内的图像可以有两行三列
    imshow(mark),title('水印图像');   %显示水印图像
    marksize=size(mark);   %计算水印图像的长宽
    rm=marksize(1);      %rm为水印图像的行数
    cm=marksize(2);     %cm为水印图像的列数
    
    I=mark;
    alpha=30;     %尺度因子,控制水印添加的强度,决定了频域系数被修改的幅度
    k1=randn(1,8);  %产生两个不同的随机序列
    k2=randn(1,8);
    subplot(2,3,2),imshow(image,[]),title('载体图像'); %[]表示显示时灰度范围为image上的灰度最小值到最大值
    yuv=rgb2ycbcr(image);   %将RGB模式的原图变成YUV模式
    Y=yuv(:,:,1);    %分别获取三层,该层为灰度层
    U=yuv(:,:,2);      %因为人对亮度的敏感度大于对色彩的敏感度,因此水印嵌在色彩层上
    V=yuv(:,:,3);
    [rm2,cm2]=size(U);   %新建一个和载体图像色彩层大小相同的矩阵
    before=blkproc(U,[8 8],'dct2');   %将载体图像的灰度层分为8×8的小块,每一块内做二维DCT变换,结果记入矩阵before
    
    after=before;   %初始化载入水印的结果矩阵
    for i=1:rm          %在中频段嵌入水印
    	for j=1:cm
    		x=(i-1)*8;
    	    y=(j-1)*8;
    	    if mark(i,j)==1
    	    	k=k1;
    	    else
    	    	k=k2;
    	    end;
    	    after(x+1,y+8)=before(x+1,y+8)+alpha*k(1);
            after(x+2,y+7)=before(x+2,y+7)+alpha*k(2);
            after(x+3,y+6)=before(x+3,y+6)+alpha*k(3);
            after(x+4,y+5)=before(x+4,y+5)+alpha*k(4);
            after(x+5,y+4)=before(x+5,y+4)+alpha*k(5);
            after(x+6,y+3)=before(x+6,y+3)+alpha*k(6);
            after(x+7,y+2)=before(x+7,y+2)+alpha*k(7);
            after(x+8,y+1)=before(x+8,y+1)+alpha*k(8);
        end;
    end;
    result=blkproc(after,[8 8],'idct2');    %将经处理的图像分为8×8的小块,每一块内做二维DCT逆变换
    yuv_after=cat(3,Y,result,V);      %将经处理的色彩层和两个未处理的层合成
    rgb=ycbcr2rgb(yuv_after);    %使YUV图像变回RGB图像
    imwrite(rgb,'markresule.jpg','jpg');      %存储添加水印后的图像
    subplot(2,3,3),imshow(rgb,[]),title('嵌入水印的图像');    %显示添加水印后的图像
    
    %攻击图像,测试其鲁棒性
    disp('请选择对图像的攻击方式:');
    disp('1.添加白噪声');
    disp('2.对图像进行部分剪切');
    disp('3.将图像旋转十度');
    disp('4.将图像压缩处理');
    disp('5.不处理图像,直接显示提取水印');
    disp('输入其它数字则直接显示提取水印');
    choice=input('请输入选择:');
    figure(1);
    switch choice        %读入输入的选择  withmark为等待提取水印的图像
    case 1
    result_1=rgb;
    noise=10*randn(size(result_1));    %生成随机白噪声
    result_1=double(result_1)+noise;        %添加白噪声
    withmark=uint8(result_1);
    subplot(2,3,4);
    imshow(withmark,[]);
    title('加入白噪声后的图像');     %显示加了白噪声的图像
    case 2
    result_2=rgb;
    A=result_2(:,:,1);
    B=result_2(:,:,2);
    C=result_2(:,:,3);
    A(1:64,1:400)=512;   %使图像上方被剪裁
    B(1:64,1:400)=512;   %分别对三个图层操作
    C(1:64,1:400)=512; 
    result_2=cat(3,A,B,C);
    subplot(2,3,4);
    imshow(result_2);
    title('上方剪切后图像');
    figure(1);
    withmark=result_2;
    case 3
    result_3=rgb;
    result_3=imrotate(rgb,10,'bilinear','crop');   %最邻近线性插值算法旋转10度
    subplot(2,3,4);
    imshow(result_3);
    title('旋转10度后图像');
    withmark=result_3;
    case 4
    [cA1,cH1,cV1,cD1]=dwt2(rgb,'Haar');    %通过小波变换对图像进行压缩
    cA1=HYASUO(cA1);
    cH1=HYASUO(cH1);
    cV1=HYASUO(cV1);
    cD1=HYASUO(cD1);
    result_4=idwt2(cA1,cH1,cV1,cD1,'Haar');
    result_4=uint8(result_4);
    subplot(2,3,4);
    imshow(result_4);
    title('经小波压缩后的图像');
    figure(1);
    withmark=result_4;
    case 5
    subplot(2,3,4);
    imshow(rgb,[]);
    title('未受攻击的水印图像');
    withmark=rgb;
    otherwise
    disp('选择无效,图像未受攻击,直接提取水印');
    subplot(2,3,4);
    imshow(rgb,[]);
    title('未受攻击的水印图像');
    withmark=rgb;
    end
    
    % ↓ 这里应该是要先变回YUV模式,我大意了_(:з」∠)_
    % 应该加一句  withmark=rgb2ycbcr(withmark);
    U_2=withmark(:,:,2);         %取出withmark图像的灰度层
    after_2=blkproc(U_2,[8,8],'dct2');   %此步开始提取水印,将灰度层分块进行DCT变换
    p=zeros(1,8);        %初始化提取数值用的矩阵
    for i=1:marksize(1)
    for j=1:marksize(2)
    x=(i-1)*8;y=(j-1)*8;
    p(1)=after_2(x+1,y+8);         %将之前改变过数值的点的数值提取出来
    p(2)=after_2(x+2,y+7);
    p(3)=after_2(x+3,y+6);
    p(4)=after_2(x+4,y+5);
    p(5)=after_2(x+5,y+4);
    p(6)=after_2(x+6,y+3);
    p(7)=after_2(x+7,y+2);
    p(8)=after_2(x+8,y+1);
    if corr2(p,k1)>corr2(p,k2)  %corr2计算两个矩阵的相似度,越接近1相似度越大
    mark_2(i,j)=0;              %比较提取出来的数值与随机频率k1和k2的相似度,还原水印图样
    else
    mark_2(i,j)=1;
    end
    end
    end
    subplot(2,3,5);
    imshow(mark_2,[]),title('提取出的水印');
    subplot(2,3,6);
    imshow(mark),title('原嵌入水印');
    

    上面用到的压缩函数HYASUO:

    function result=HYASUO(I)
    yuzhi=50;
    A=I(:,:,1);
    B=I(:,:,2);
    C=I(:,:,3);
    [c,k]=size(A);
    for i=1:c
        for j=1:k
            if A(i,j)<=yuzhi
                A(i,j)=0;
            end
            if B(i,j)<=yuzhi
                B(i,j)=0;
            end
            if C(i,j)<=yuzhi
                C(i,j)=0;
            end
        end
    end
    result=cat(3,A,B,C);
    

    上面的是测试里用的载体图像,下面是我所用的水印图像。

    源图像

    水印

    最后是结果展示,悲伤的那个是经过旋转攻击后提取水印的结果。看来这个鲁棒性还是太差了呀 (:△」∠)

    这里写图片描述

    参考文献如下图所示:

    这里写图片描述

    展开全文
  • 数字水印技术matlab代码,结果本人调试已经可以跑,里面还有仿真的图片
  • 分析了一维和二维DCT变换的原理,分析了DCT变换域的数字水印技术中DCT变换系数的选择依据,重点研究了DCT变换域的数字水印嵌入与...用VC++进行编程验证,实验测试表明,基于DCT变换域的数字水印技术具有较好的实用性。
  • DCT变换 图像 MATLAB 基于DCT数字水印算法的Matlab实现算法
  • 基于MATLAB的DCT数字水印技术实现 研究了基于离散余弦变换(DCT) 的数字图像水印算法, 并借助一种高效实用的编程工 具MATLAB , 编程使这种算法得以实现, 实验结果表明, 对于通常的压缩编码, 该算法具有足够 的稳健...
  • DCT变换数字水印

    2011-06-09 21:57:03
    基于DCT变换域的数字水印在matlab下实现,附带攻击和置乱
  • 提出一种基于DCT域的数字水印算法,并用FPGA硬件实现其中关键部分DCT变换。采用VHDL语言有效设计和实现DCT变换,分析与仿真结果表明:与软件实现相比,用FPGA实现水印算法具有高速实时处理的优点。因此,该设计是一...
  • 提出一种基于DCT变换数字图像盲水印算法,通过调整DCT域选定中频的大小关系嵌入水印,易于实现。仿真试验证明本算法能够抵御剪切、噪音和JPEG压缩失真,具有良好的不可见性和鲁棒性。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 493
精华内容 197
关键字:

基于dct变换的数字水印实现