dwt嵌入水印与提取水印

举报
川川菜鸟 发表于 2021/11/01 23:05:16 2021/11/01
【摘要】 % 读入载体图像文件 file_name='1.bmp'; f=imread(file_name); subplot(221); imshow(f) title('原图'); f=double(f); %...
% 读入载体图像文件
file_name='1.bmp';
f=imread(file_name);
subplot(221);
imshow(f)
title('原图');
f=double(f);
% 读入载体文件的大小
Mc=size(f,1); %高度
Nc=size(f,2); %宽度
% 读入数字水印图像文件
file_name='2.bmp';
m=imread(file_name);
subplot(222);
imshow(m)
title('原水印');

m=double(m);
Mm=size(m,1); %水印图像的高度
Nm=size(m,2); %水印图像的宽度
%将水印图像转换为二值图像
m1=double(m);
m=fix(m1./12);
m=uint8(m);
%一层haar小波变换
[A1,H1,V1,D1] = dwt2(f,'haar');
[r1,c1]=size(A1);
r2=r1/2;
c2=c1/2;
% 嵌入水印
for i= 1:r1
for j= 1:c1
   w(i,j)=m(mod(i,Mm)+1,mod(j,Nm)+1);
end
end
for i=1:r2
for j=1:c2
   if w(i,j)==1
     if H1(i,(2*j-1))<H1(i,2*j)
      temp=H1(i,(2*j-1));
      H1(i,(2*j-1))=H1(i,2*j);
      H1(i,2*j)=temp;
     end
     if H1(i,(2*j-1))==H1(i,2*j)
      H1(i,(2*j))=H1(i,(2*j))-0.0001;
     end
   end
   if w(i,j)==0
    if H1(i,(2*j-1))>H1(i,2*j)
    temp=H1(i,2*j-1);
    H1(i,(2*j-1))=H1(i,2*j);
    H1(i,2*j)=temp;
    end
    if H1(i,(2*j-1))==H1(i,2*j)
    H1(i,(2*j))=H1(i,(2*j))+0.0001;
    end
   end
end
end
% 实现小波的反变换
f=idwt2(A1,H1,V1,D1,'haar',[Mc,Nc]);
subplot(223)
imshow(uint8(f));
title('嵌入水印后的图');

% 读取该图像的高度和宽度
Mw=size(f,1); %高度
Nw=size(f,2); %宽度
%一层harr小波变换
[A1,H1,V1,D1] = dwt2(f,'haar');


[r1,c1] = size(A1);
r2=r1/2;
c2=c1/2;
%提取水印
for i=1:r2
     for j=1:c2
         if H1(i,2*j-1)>=H1(i,2*j)
             k(i,j)=1;
         else
             k(i,j)=0;
         end
     end
end
subplot(224)
imshow(k);
title('提取的水印')

  
 
  • 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

效果:
在这里插入图片描述
原理:嵌入算法
首先将256×256分辨率的256级载体灰度图像进行一层小波变换,如下:[A1,H1,V1,D1] = dwt2(f,‘haar’)得到A1,H1,V1,D1这样四个128×128大小的矩阵。其中f是256×256大小的矩阵,保存着分辨率为256×256、灰度级别为256的载体灰度图像,A1、H1、V1、D1分别是lena图像的低频逼近子图、水平方向细节子图、垂直方向细节子图、对角线方向的高频细节子图。接着,读入水印图像,将水印图像转换为二值图像,要求水印图像的大小为载体图像的八分之一。将水印图像的信息存入一个二维数组中。
最后,嵌入水印。如果将水印嵌入低频系数A1中,水印的鲁棒性好,但水印的隐蔽性差;如果将水印嵌入高频系数D1中,水印的隐蔽性好,但水印的鲁棒性差。同时考虑到水印的鲁棒性和隐蔽性,将这两种方案折中一下,本算法将水印嵌入到小波变换的水平方向细节的中频系数H1中。H1是一个二维数组,将H1的数据分为像素对,比较每对像素值的大小,前者大于后者表示1,前者小于后者表示0,若二者相等,则将其中一个的值做微小调整,使得每一像素对的大小关系和水印二值图像的每一位相对应。对不能对应的像素对,将像素对前后的位置互换。

水印提取算法
首先读入带有水印的载体图像,将该图像进行一层小波分解:
[A1,H1,V1,D1]=dwt2(f,‘haar’)
其中f是256×256大小的矩阵,保存着分辨率为256×256、灰度级别为256的嵌入了水印图像的载体灰度图像。
接着,从H1中提取水印,提取水印是嵌入水印的逆过程,将H1分为像素对,比较每对像素值的大小,如果前者大于后者,提取1,如果前者小于后者,提取0。

文章来源: chuanchuan.blog.csdn.net,作者:川川菜鸟,版权归原作者所有,如需转载,请联系作者。

原文链接:chuanchuan.blog.csdn.net/article/details/120988912

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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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