Advertisement

数字水印进阶篇——基于DWT-SVD的数字水印(附matlab代码)

阅读量:

引言

之前撰写了一篇阐述空间域LSB数字水印算法的文章,并欢迎对相关技术感兴趣的读者前来参考详细内容

基于数字水印技术的空间域方法通过直接修改图像像素值来嵌入隐秘的信息载体,在实际应用中往往难以满足复杂环境下的抗干扰需求。经过一系列典型攻击处理后难以准确恢复原始水印信息。因此,在增强抗干扰能力的同时使得频域方法成为更为常用的选择。在实际应用中常用的频域变换包括离散余弦变换、小波变换以及傅里叶变换等基本手段;此外还衍生出了快速小波变换等高效算法以及Contourlet等新型变体技术。

这里单独介绍一下基于DWT-SVD的数字水印算法。

DWT(小波变换)

对于小波变换的基本定义及其实现原理,在本段中不做深入探讨。如需进一步了解相关内容的详细说明,请参考其他相关博主的文章或资料。
作为数字水印算法中的关键工具之一,
其核心在于将原始图像与其附加的信息分离并以不同的频率层次进行处理。
具体而言,
该过程包括以下步骤:
首先,
对原始图像进行多级的小波分解,
从而生成四个不同频率特性的子带:
其中LL代表低频区域,
主要承载着图像的大致形状和轮廓特征;
LH则对应于水平方向上的细节信息;
HL则是垂直方向上的细节内容;
最后,
HH分量则反映了图像对角线方向的变化特征。
值得注意的是,
这些子带的空间尺寸均等于原始图像尺寸的一半。

利用函数dwt2()可以实现图像小波分解,具体实现如下:

复制代码
    I=imread('lena.png');
    I=rgb2gray(I); 
    [LL,LH,HL,HH]=dwt2(I,'haar');
    figure,
    subplot(221);imshow(uint8(LL));title('低频');
    subplot(222);imshow(LH);title('高频水平');
    subplot(223);imshow(HL);title('高频垂直');
    subplot(224);imshow(HH);title('高频对角线');
在这里插入图片描述

一般情况下,在载体图像中将水印嵌入到其低频分量中能够增强其安全性;后面的实例同样采用这一策略。

SVD (奇异值分解)

SVD常被用于图像特征提取过程,在此过程中实现了降维与图像压缩的目标,在数字水印领域也可提升水印鲁棒性效果《基于奇异值分解的数字图像水印方法》 。具体而言:

  1. 图像经过SVD分解后会生成三个独立的矩阵:左奇异矩阵U、奇异值矩阵Σ以及右奇异矩阵V;
  2. 奇异值矩阵Σ则是一个沿主对角线排列着从大到小排序过的对角元素所构成的方阵。

一般情况下,在嵌入过程中会施加水印奇异值分解后的奇异值矩阵S至载体图像上以实现水印的嵌入

基于DWT-SVD数字水印

复制代码
    %% 水印嵌入
    I=imread('lena.png');                       %载入载体图像
    I=im2double(I);
    I=rgb2gray(I);                              %转为灰度图
    [LL,LH,HL,HH]=dwt2(I,'haar');               %载体图像dwt变换
    [U,S,V]=svd(LL);                            %低频分量SVD分解
    W=imread('digital.png');                    %载入水印图像
    W=im2double(W); 
    W=rgb2gray(W);                              %转为灰度图
    [Uw,Sw,Vw]=svd(W);                          %水印图SVD分解
    af=0.2;                                     %嵌入量
    S2=S+af*Sw;                                 %水印图的奇异值矩阵Sw以af嵌入量加到载体图像LL子代的奇异值矩阵S上
    LL2=U*S2*V';                                %嵌入后新的低频分量
    IW=idwt2(LL2,LH,HL,HH,'haar');              %dwt逆变换得到含水印图
    imwrite(IW,'watermarked.png');
    figure,
    subplot(221);imshow(I);title('载体图像');
    subplot(222);imshow(W);title('水印图像');
    subplot(223);imshow(IW);title('含水印图');
    %% 水印提取
    J=imread('watermarked.png');                %读取含水印图             
    J=im2double(J);
    [LL3,LH3,HL3,HH3]=dwt2(J,'haar');           %含水印图dwt变换
    [U3,S3,V3]=svd(LL3);                        %低频分量SVD分解
    S4=(S3-S)/af;                               %得到提取水印图的奇异值矩阵
    W2=Uw*S4*Vw';                               %SVD逆变换得到提取水印图
    subplot(224);imshow(W2);title('提取水印图');
在这里插入图片描述

这里的例子是典型的DWT-SVD数字水印算法的经典代表。此外,在实现过程中,我们可以通过将载体图像分割为多个块,并对水印图像实施加密处理或扰乱处理的方式来增强该算法的安全性。

评估水印算法的鲁棒性可作为研究依据,并提供Matlab实现代码示例

以上就是基于DWT-SVD数字水印算法的简单介绍和代码实现。

假如觉得这篇短文对您有所帮助,请期待您的点赞与支持。本人正在学习中,请多包涵如有错误或问题,请随时告知以便改进。欢迎随时给我留言交流!

全部评论 (0)

还没有任何评论哟~