资源简介

DCT、DWT数字水印技术,内含matlab代码,可一键运行。直接生成数字水印并进行相关攻击操作。

资源截图

代码片段和文件信息

clear;
clc;

disp(‘请选择载体图像:‘);
[filename2 pathname2] = uigetfile(‘*.jpg‘ ‘读取图片文件‘);
pathfile2=fullfile(pathname2 filename2);
image=imread(pathfile2); 
disp(‘请选择水印图像:‘);
[filename pathname] = uigetfile(‘*.jpg‘ ‘读取图片文件‘);
pathfile=fullfile(pathname filename);
markbefore=imread(pathfile); 

markbefore2=rgb2gray(markbefore);
mark=im2bw(markbefore2);    %使水印图像变为二值图
figure(1);      %打开窗口
subplot(231);    %该窗口内的图像可以有两行三列
imshow(mark)title(‘水印图像‘);   %显示水印图像
marksize=size(mark);   %计算水印图像的长宽
rm=marksize(1);      %rm为水印图像的行数
cm=marksize(2);     %cm为水印图像的列数

I=mark;
alpha=30;     %尺度因子控制水印添加的强度决定了频域系数被修改的幅度
k1=randn(18);  %产生两个不同的随机序列
k2=randn(18);
subplot(232)imshow(image[])title(‘载体图像‘); %[]表示显示时灰度范围为image上的灰度最小值到最大值
yuv=rgb2ycbcr(image);   %将RGB模式的原图变成YUV模式
Y=yuv(::1);    %分别获取三层,该层为灰度层
U=yuv(::2);      %因为人对亮度的敏感度大于对色彩的敏感度,因此水印嵌在色彩层上
V=yuv(::3);
[rm2cm2]=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(ij)==1
            k=k1;
        else
            k=k2;
        end
        after(x+1y+8)=before(x+1y+8)+alpha*k(1);
        after(x+2y+7)=before(x+2y+7)+alpha*k(2);
        after(x+3y+6)=before(x+3y+6)+alpha*k(3);
        after(x+4y+5)=before(x+4y+5)+alpha*k(4);
        after(x+5y+4)=before(x+5y+4)+alpha*k(5);
        after(x+6y+3)=before(x+6y+3)+alpha*k(6);
        after(x+7y+2)=before(x+7y+2)+alpha*k(7);
        after(x+8y+1)=before(x+8y+1)+alpha*k(8);
    end
end
result=blkproc(after[8 8]‘idct2‘);    %将经处理的图像分为8×8的小块,每一块内做二维DCT逆变换
yuv_after=cat(3YresultV);      %将经处理的色彩层和两个未处理的层合成
rgb=ycbcr2rgb(yuv_after);    %使YUV图像变回RGB图像
imwrite(rgb‘markresule.jpg‘‘jpg‘);      %存储添加水印后的图像
subplot(233)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(234);
imshow(withmark[]);
title(‘加入白噪声后的图像‘);     %显示加了白噪声的图像
case 2
result_2=rgb;
A=result_2(::1);
B=result_2(::2);
C=result_2(::3);
A(1:641:400)=512;   %使图像上方被剪裁
B(1:641:400)=512;   %分别对三个图层操作
C(1:641:400)=512; 
result_2=cat(3ABC);
subplot(234);
imshow(result_2);
title(‘上方剪切后图像‘);
figure(1);
withmark=result_2;
case 3
result_3=imrotate(rgb10‘bilinear‘‘crop‘);   %最邻近线性插值算法旋转10度
subplot(234);
imshow(result_3);
title(‘旋转10度后图像‘);
withmark=result_3;
case 4
[cA1cH1cV1cD1]=dwt2(rgb‘Haar‘);    %通过小波变换对图像进行压缩
cA1=HYASUO(cA1);
cH1=HYASUO(cH1);
cV1=HYASUO(cV1);
cD1=HYASUO(cD1);

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     目录           0  2019-01-17 09:08  DCT\
     文件       75334  2018-12-02 20:37  DCT\b.jpg
     文件        5103  2018-12-04 11:21  DCT\MAIN.m
     文件        2663  2018-12-03 20:07  DCT\watermark.jpg
     目录           0  2019-01-17 09:08  DWT\
     文件       55518  2018-12-02 20:37  DWT\a.jpg
     文件        3417  2018-12-03 22:57  DWT\main1.m
     文件        2663  2018-12-03 20:07  DWT\watermark.jpg
     目录           0  2019-01-17 09:08  盲水印嵌入提取\
     文件        1172  2013-03-16 19:05  盲水印嵌入提取\blind_emb.m
     文件         626  2013-03-16 18:50  盲水印嵌入提取\blind_extraction.m
     文件         469  2013-03-16 18:46  盲水印嵌入提取\CQ.m
     文件         183  2013-03-16 18:49  盲水印嵌入提取\fil_code.m
     文件        1300  2013-03-16 18:47  盲水印嵌入提取\jpeg_extraction.m
     文件       66616  2007-07-04 16:54  盲水印嵌入提取\lena.bmp
     文件       12342  2011-07-09 17:23  盲水印嵌入提取\mark.bmp
     文件        1027  2013-03-16 19:11  盲水印嵌入提取\mul_emb.m
     文件        1294  2013-03-16 18:49  盲水印嵌入提取\mul_extration.m
     文件         453  2013-03-16 18:46  盲水印嵌入提取\PSNR.m

评论

共有 条评论