【图像隐写】基于matlab DWT数字水印多种攻击效果对比【含Matlab源码 1134期】

举报
海神之光 发表于 2022/05/29 03:15:57 2022/05/29
【摘要】 一、DWT+SVD数字水印简介 理论知识参考文献:基于DWT和SVD的彩色图像数字水印算法研究 一种基于DWT-SVD的图像数字水印算法\ 二、部分源代码 clc clear all; k=20...

一、DWT+SVD数字水印简介

理论知识参考文献:基于DWT和SVD的彩色图像数字水印算法研究
一种基于DWT-SVD的图像数字水印算法\

二、部分源代码

clc
clear all;


k=20;          
blocksize=8;   % 设置块的大小

% 读入原图像
file_name='_lena_std_bw.bmp';
cover_object=double(imread(file_name));
 
% 原图像的行数与列数
Mc=size(cover_object,1);         %原图像行数
Nc=size(cover_object,2);         %原图像列数

% 最大嵌入信息量
max_message=Mc*Nc/(blocksize^2);

% 读入水印图像
file_name='c.bmp';
message=double(imread(file_name));

%%水印图像的行数与列数
Mm=size(message,1);               %水印行数
Nm=size(message,2);               %水印列数

message_vector=reshape(message,1,Mm*Nm);

% 检查水印信息是否过大
if (Mm*Nm> max_message)
  error('水印太大')
end

% 产生watermarked_image,并写入原图信息
watermarked_image=cover_object;


% 将图像分块嵌入
%(2,2) > (2,3)message_pad(kk)=0
%(2,2) < (2,3)message_pad(kk)=1

%%在提取水印时,如果cD1(2,2)>cD1(2,3)便是嵌入了水印的黑色像素,
%%反之则是嵌入了白色像素
x=1;
y=1;
h=waitbar(0,'嵌入水印,请等待');
for (kk = 1:length(message_vector))

  % 对块进行DWT变换
  [cA1,cH1,cV1,cD1] = dwt2(cover_object(x:x+blocksize-1,y:y+blocksize-1),'haar');
  % 如果 message_pad(kk)== 0
  if (message_vector(kk) == 0)

    %(2,2) < (2,3) ,交换它们
    if (cD1(2,2) < cD1(2,3))
          temp=cD1(2,3);
          cD1(2,3)=cD1(2,2);
          cD1(2,2)=temp;
    end
  
  % 如果message_pad(kk) == 1, 
  elseif (message_vector(kk) == 1)
    
    %(2,2) > (2,3) ,交换它们
    if (cD1(2,2) >= cD1(2,3))
          temp=cD1(2,3);
          cD1(2,3)=cD1(2,2);
          cD1(2,2)=temp;
    end
  end
  
  % 检查(2,2)(2,3)的差是否>= k
  if cD1(2,2) > cD1(2,3)
    if cD1(2,2) - cD1(2,3) < k
        cD1(2,2)=cD1(2,2)+(k/2);
        cD1(2,3)=cD1(2,3)-(k/2);         
    end
  else 
      if cD1(2,3) - cD1(2,2) < k
        cD1(2,3)=cD1(2,3)+(k/2); 
        cD1(2,2)=cD1(2,2)-(k/2);
    end
  end
    
  %IDWT
  watermarked_image(x:x+blocksize-1,y:y+blocksize-1)= idwt2(cA1,cH1,cV1,cD1,'haar',[Mc,Nc]);


  % 移动到下一块
  if (x+blocksize) >= Nc
    x=1;
    y=y+blocksize;
  else
    x=x+blocksize;
  end
  waitbar(kk/length(message_vector),h);
end
close(h);

% 转换为uint8并写入dwt_watermarked.bmp
watermarked_image_uint=uint8(watermarked_image);
imwrite(watermarked_image_uint,'dwt_watermarked.bmp','bmp');

% 计算psnr值
psnr=psnr(cover_object,watermarked_image), 

% 显示图像
%figure(1)
%imshow(message,[]);
%title('水印');
figure(2)
subplot(1,2,1);
imshow(watermarked_image,[])
title('嵌入水印图像')
subplot(1,2,2);
imshow(cover_object,[]);
title('原图');




%提取源码
clear all;

blocksize=8;   % 设置块的大小

% 读入嵌入水印图像
file_name='dwt_watermarked.bmp';
watermarked_image=double(imread(file_name));

% 嵌入水印图像的行数与列数
Mw=size(watermarked_image,1);         %嵌入水印图像的行数
Nw=size(watermarked_image,2);         %嵌入水印图像的列数

% 最大嵌入信息量
max_message=Mw*Nw/(blocksize^2);

% 读入原始水印
file_name='c.bmp';
orig_watermark=double(imread(file_name));

% 原始水印的行数与列数
Mo=size(orig_watermark,1);    %原始水印的行数
No=size(orig_watermark,2);    %原始水印的列数

% 将图像分块提取水印
x=1;
y=1;
h=waitbar(0,'水印提取中,请等待');
for (kk = 1:max_message) 

  % 对块进行dwt变换
  [cA1,cH1,cV1,cD1] = dwt2(watermarked_image(x:x+blocksize-1,y:y+blocksize-1),'haar');
  
  % 如果cD1(2,2) > cD1(3,3) 那么 message_vector(kk)=0
  % 否则 message_vector(kk)=1
  if cD1(2,2)>cD1(2,3)
    message_vector(kk)=0;
  else
    message_vector(kk)=1;
  end


  % 移动到下一块
  if (x+blocksize) >= Mw
    x=1;
    y=y+blocksize;
  else
    x=x+blocksize;
  end
  waitbar(kk/max_message,h);
end

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172

三、运行结果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

四、matlab版本及参考文献

1 matlab版本
2014a

2 参考文献
[1] 蔡利梅.MATLAB图像处理——理论、算法与实例分析[M].清华大学出版社,2020.
[2]杨丹,赵海滨,龙哲.MATLAB图像处理实例详解[M].清华大学出版社,2013.
[3]周品.MATLAB图像处理与图形用户界面设计[M].清华大学出版社,2013.
[4]刘成龙.精通MATLAB图像处理[M].清华大学出版社,2015.
[5]梁欣.基于DWT和SVD的彩色图像数字水印算法研究[J].计算机与数字工程. 2019,47(08)
[6]张秀娟,朱春伟.一种基于DWT-SVD的图像数字水印算法[J].数字技术与应用. 2017,(10)

文章来源: qq912100926.blog.csdn.net,作者:海神之光,版权归原作者所有,如需转载,请联系作者。

原文链接:qq912100926.blog.csdn.net/article/details/118883901

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。