基于MATLAB的小波变换数字图像水印系统GUI设计与实现

摘 要
通过对数字水印的原理和算法的分析,了解信息隐藏的实现手段与效果。在信息加载和提取过程中,突破传统的加密技术,用更具专业性的检测手段来保护专属的信息产权。本文利用了水印良好的鲁棒性和不可感知性,致力于对图像的处理,通过实验与测试证实了数字水印可以达到理想的效果,并且运用恰当的算法可以更加简化操作的复杂性。在此之外,数字水印还可以应用于声音,视频等领域。其技术手段的实现的更加完善化会带来其更加广阔的应用前景。
关键字:数字水印;信息隐藏;MATLAB;水印检测与提取;JPEG压缩;

Abstract
Through the analysis of the principles and algorithms of digital watermarking, we can understand the means and effects of the implementation of information hiding. In the process of information loading and extraction, it breaks through the traditional encryption technology and protects the exclusive information property rights with more specialized means of detection. In this paper the watermark robustness and good imperceptibility, dedicated to image processing, through experiment and testing proved that the digital watermark can achieve the desired results, and the complexity of using appropriate method can be more simplified operation. In addition, digital watermarking can also be applied to the fields of sound, video and so on. The perfection of its technical means will bring more extensive application prospects.
Keywords: digital watermarking; information hiding; MATLAB; watermark detection and extraction; JPEG compression;

下载链接:戳这里下载哦!GUI框架
目录
摘 要 3
Abstract 3
1 数字水印技术简介 4
1.1数字水印的发展背景 4
1.2数字水印的特点 4
1.3 数字水印技术的基本原理 5
1.3.1水印的生成 5
1.3.2水印的嵌入 6
1.3.3水印的提取与检测 6
1.4数字水印技术的划分 7
按数字水印的隐藏位置,我们可以将其划分为时(空)域数字水印、频域数字水印、时/频域数字水印和时间/尺度域数字水印。 7
1.5数字水印算法的分类 8
(4)哈达马变换等。 8
1.6影响水印性能的因素 8
1.7数字水印技术的攻击问题 9
2 小波变换概述 9
2.1小波变换 9
2.2二维小波变换算法讨论 10
2.3常见的小波变换水印算法 10
2.4基于小波变换的数字水印算法的优势 11
3在MATABL中 实现图像的水印算法 11
3.1 MATABL的应用 11
3.2 MATLAB的特点 12
3.3 用Matlab研究数字水印的优点 12
4.基于小波变换域的数字水印的实现 13
4.1基于小波变换域的数字水印的简述 13
4.2基于离散小波变换和人类视觉系统(HVS)的水印的实例 14
4.2.1离散小波变换 14
4.2.2算法描述 14
4.2.3水印嵌入算法 15
4.2.4水印提取算法 15
4.3 人眼的视觉特性(HVS)及其在水印技术中的应用 16
4.3 水印实验结果: 16
总结 22
参考文献: 23

1 数字水印技术简介
1.1数字水印的发展背景
随着数字技术和Internet网络的发展,各种形式的多媒体数字作品(图像、视频、音频等)纷纷以网络形式发表,然而数字作品的便利性和不安全性是并存的,它可以低成本、高速度地被复制和传播,而这些特性也容易被盗版者所利用。因而,采用多种手段对数字作品进行保护、对侵权者进行惩罚己经成为十分迫切的工作。数字水印技术的研究就是在这种应用要求下迅速发展起来的。
数字水印(digital watermarking)技术也称为数字指纹技术,它将具有特定意义的水印标记不可感知地嵌入到被保护的数字产品中,在产生版权纠纷时,通过相应的算法提取该水印,用以证明作者对该数字产品的所有权,并可作为鉴证、起诉非法侵权的证据。数字水印技术基本上应当满足隐蔽性、安全性、鲁棒性和水印容量等几个方面的要求。
研究数字水印技术的最初目的是用于保护数字产品的版权,但随着研究的进一步深入,它在信息安全保护领域的应用越来越广泛,并在广播检测、图像认证、盗版跟踪、数字签名、交易水印、拷贝控制、标题与注释等各个领域产生了许多新的用途。数字水印从正式提出到现在虽然时间不长,但它与传统的密码学相比有明显的优越性,为解决版权保护和内容完整性认证、来源认证、篡改认证、网上发行、用户跟踪等一系列问题提供了一个崭新的研究方向,因此它在数字产品的知识产权保护、商务交易中的票据防伪、声像数据的隐藏标识和篡改提示、隐蔽通信及其对抗等方面具有十分广阔的应用前景。
1.2数字水印的特点
(1)鲁棒性:所谓鲁棒性是指在经历多种无意或有意的信号处理过程后,数字水印仍能保持完整性或仍能被准确鉴别。可能的信号处理过程包括信道噪声、滤波、数/模与模/数转换、重采样、剪切、位移、尺度变化以及有损压缩编码等
(2)隐蔽性:在数字作品中嵌入数字水印不会引起明显的降质,且不易被察觉。
(3)隐藏位置的安全性:水印信息隐藏于数据而非文件头中,文件格式的变换不应导致水印数据的丢失。
在数字水印技术中,水印的数据量和鲁棒性构成了一对基本矛盾。从主观上讲,理想的水印算法应该既能隐藏大量数据,又可以抗各种信道噪声和信号变形。然而在实际中,这两个指标往往不能同时实现,不过这并不会影响数字水印技术的应用,因为实际应用一般只偏重其中的一个方面。如果是为了隐蔽通信,数据量显然是最重要的,由于通信方式极为隐蔽,遭遇敌方篡改攻击的可能性很小,因而对鲁棒性要求不高。但对保证数据安全来说,情况恰恰相反,此时,隐藏数据量的要求居于次要地位,各种保密的数据随时面临着被盗取和被纂改的危险,所以鲁棒性是十分重要的。
1.3 数字水印技术的基本原理
数字水印的基本原理是将作为标识数据的水印信息嵌入到被保护的宿主数据中,使得水印在宿主数据中不可感知并且足够安全。通常的水印算法包括三个基本方面:水印的生成、嵌入和提取,并会涉及到水印的选择、水印的验证、基于视觉特性的水印等几项关键技术。
1.3.1水印的生成
水印信号分为无意义水印信号和有意义水印信号两种。无意义水印信号的产生通常基于伪随机数发生器或混沌系统,产生的水印信号往往需要进一步的变换以适应水印嵌入算法的需要。有意义水印信号包括二值图像、灰度图像和彩色图像等。有意义的图像可以直接作为水印嵌入到载体数据中,但是为了增强水印的安全性,一般需要先对水印进行加密预处理,处理的方法包括使用实随机序列进行扩频、对水印信号进行位分解、利用图像的置乱对水印进行预处理等。
数字水印生成过程的一般流程如图1所示。

基于MATLAB的小波变换数字图像水印系统GUI设计与实现_第1张图片

1.3.2水印的嵌入
水印的嵌入从数字通信的角度看,可以理解为在一个宽带的信道上用扩频通信技术一个窄带信号,会涉及到嵌入的方法、嵌入的位置、嵌入的信息量等问题。数字水印嵌入过程的一般流程图如图2所示。
基于MATLAB的小波变换数字图像水印系统GUI设计与实现_第2张图片

1.3.3水印的提取与检测
水印的提取与检测是一个在有噪信道中弱信号的检测问题,最终目的在于判断水印信号是否存在或把水印提取出来。在对提取的水印和原始的水印进行判断和检测的过程中,可以通过输出一个0—1决策来判断水印有无。水印提取与检测过程的一般流程图如图3所示。

基于MATLAB的小波变换数字图像水印系统GUI设计与实现_第3张图片

图3 数字水印提取检测过程一般流程图

1.4数字水印技术的划分
(1)按特性划分
数字水印的特性可以将数字水印分为鲁棒数字水印和脆弱数字水印两类。
(2)按水印所附载的媒体划分
按水印所附载的媒体,我们可以将数字水印划分为图像水印、音频水印、视频水印、文本水印以及用于三维网格模型的网格水印等。。
(3)按检测过程划分
按水印的检测过程可以将数字水印划分为明文水印和盲水印。
(4)按内容划分
按数字水印的内容可以将水印划分为有意义水印和无意义水印。
(5)按用途划分
不同的应用需求造就了不同的水印技术。按水印的用途,我们可以将数字水印划分为票据防伪水印、版权保护水印、篡改提示水印和隐蔽标识水印。
(6)按水印隐藏的位置划分
按数字水印的隐藏位置,我们可以将其划分为时(空)域数字水印、频域数字水印、时/频域数字水印和时间/尺度域数字水印。
1.5数字水印算法的分类
数字水印算法可以分为空间域数字水印算法和变换域数字水印算法两大类。
空间域数字水印算法就是通过改变某些像素的灰度将要隐藏的信息嵌入到其中,把数字水印直接加载到数据上。这种方法具有算法简单、容易实现、信息隐藏量大和计算速度快等优点,并且许多算法在提取水印和验证水印存在时都不需要原始图像,但通常因为抵抗图像的几何形变、噪声和图像压缩的能力较差而具有较差的鲁棒性。空间域数字水印的经典算法包括:
(1)LSB算法(最低有效位法),
(2)Patchwork方法;
(3)纹理映射编码方法;
(4)文档结构微调方法等。
变换域数字水印算法是当前数字水印技术领域研究的热点。它是基于图像的变换利用一个信号可以掩盖另一个较弱的信号这种频率掩盖现象在频域变换中嵌入水印,这些常见变换包括:
(1)离散余弦变换(DCT);
(2)小波变换(WT);
(3)傅氏变换(Fr或FFr);
(4)哈达马变换等。

1.6影响水印性能的因素
(1) 嵌入信息的数量:嵌入的信息量越多,水印的鲁棒性就越低
(2) 水印嵌入强度:在水印嵌入强度和水印可感知性之间有一个均衡。高鲁棒性 需要更强的嵌入,这反过来增大了水印的可感知性。
(3)数据的大小和种类:通常数据的尺寸大小对嵌入水印的鲁棒性有直接的影响。
(4)秘密信息(如密钥):尽管秘密信息的数量对水印的可感知性,鲁棒性没有直接的影响,但在系统安全性方面充当了重要的角色。密钥空间要足够大,从而使穷举搜索攻击不可行。考虑这些上述因素,评价水印方法必须在各种不同的测试图像之中进行测试。此外,为了得到在统计上有效的结果,必须使用不同的密钥和改变水印的强度来对水印系统进行评价。

1.7数字水印技术的攻击问题
(1) 简单攻击
通常是指普通的图像处理,例如对图像线性和非线性的滤波、有损压缩、图像增强、量化、加噪等。简单攻击不能识别或分离水印,只可以使水印削弱或删除。
(2) 同步攻击
这种攻击通常指几何攻击,如旋转、剪切、平移、二次抽样、缩放等操作。这种几何攻击实际上并没有去除图像中的水印,但它改变了提取水印所必须的位置信息,使得水印虽然存在,但不能被提取或检测。
(3)伪造攻击
这种攻击指试图去伪造原始数据或伪造水印后的数据。
(4)去除水印攻击
这种攻击是指通过分析水印后的数据,估计出原始数据或水印数据,从而将水印从水印后的数据中分离出来。通常采用的方法有:共谋攻击、去噪、特殊的非线性滤波等。
2 小波变换概述
2.1小波变换
“小波”就是小区域、长度有限、均值为0的波形。所谓“小”是指它具有衰减性;而称之为“波”则是指它的波动性,其振幅正负相间的震荡形式。与Fourier变换相比,小波变换是时间(空间)频率的局部化分析,它通过伸缩平移运算对信号(函数)逐步进行多尺度细化,最终达到高频处时间细分,低频处频率细分,能自动适应时频信号分析的要求,从而可聚焦到信号的任意细节
小波变换分成两大类:离散小波变换 (DWT) 和连续小波变换 (CWT)。两者的主要区别在于,连续变换在所有可能的缩放和平移上操作,而离散变换采用所有缩放和平移值的特定子集。
从图像处理的角度看,小波变换存在以下几个优点:
(1)小波分解可以覆盖整个频域(提供了一个数学上完备的描述)
(2)小波变换通过选取合适的滤波器,可以极大的减小或去除所提取得不同特征之间的相关性
(3)小波变换具有“变焦”特性,在低频段可用高频率分辨率和低时间分辨率(宽分析窗口),在高频段,可用低频率分辨率和高时间分辨率(窄分析窗口)
(4)小波变换实现上有快速算法(Mallat小波分解算法)
2.2二维小波变换算法讨论
当二维空间是可分离的情况下,很容易把一维多分辨率分析推广到二维。说得具体点就是,二维小波分解算法是:一幅数字化的图像经常可以用一个2维矩阵A表示(经过某种变换),然后行进行一维小波分解,得到新的矩阵B,B由A的水平方向低频,水平方向高频部分组成,再对列进行一位小波分解,得到新的矩阵C,C由B的垂直方向低频,垂直方向高频部分组成,即C由四部分组成:LL(原图像的水平分量低频,垂直方向低频部分),HL(原图像的水平分量高频,垂直方向低频部分),LH(原图像的水平分量低频,垂直方向高频部分),HH(原图像的水平分量高频,垂直方向高频部分)。为了形象地描绘二维小波分解后的分量,可以见下图:
基于MATLAB的小波变换数字图像水印系统GUI设计与实现_第4张图片

其中,LL代表近似部分,HL代表水平细节,LH代表垂直细节,HH代表对角细节。 对于二维小波重构,可以按照分解的逆过程来实现:利用一维小波重构算法先对列重构,再对行重构,就能得到原图像。
2.3常见的小波变换水印算法
(1) Barni算法
此算法是由 Mauro Barni, Franco Bartolini, Vito Capellini,Alessandro Lippi和Alessandro Piva提出的,算法使用了一般的线性叠加方法。水印长度由原图像的大小决定,如果原图像的大小为M×N,则Nw=3M/2N/ 2,这里Nw表示水印的长度。选用Daubechies-6作为小波基,对原图像进行4级小波分解。只有第一分解级的细节信号嵌入水印,而分析信号只用于计算视觉遮蔽效果值。
(2) Kundur算法
此算法是由Kundur Deepa和Hatzinakos Dimitrios提出的,水印嵌入使用了图像融合技术。水印大小与待嵌图像的大小相差2M比例因子,其大小为2Nw×2Mw,嵌入前将水印进行一级小波分解。原图像进行L级小波分解,L的大小被限制小于或等于M,水印图案进行一级小波分解。将各级子带分为互不重叠的大小为Nw×Mw的子块,根据事先设定的百分比随机选择某些子块,被选中子块内对应的小波系数嵌入水印。
2.4基于小波变换的数字水印算法的优势
随着新一代图像压缩标准JPEG2000的提出,小波变换越来越受到重视。作为一种全新的时间一尺度分析方法,它在数字图像处理领域取得了很好的应用效果,在数字水印研究领域出现了许多优秀的小波变换算法。
小波变换相对于DFT和DCT有诸如良好的时间频率局部性、多尺度变换、较小的计算复杂度等独特的优点。基于小波变换的数字水印具有突出的抗滤波和压缩攻击的能力,同时保留了空域特性,而且一幅图像小波分解后所得到的子带和人类的视觉系统(HVS)模型相符合,提高了算法的鲁棒性。

3在MATABL中 实现图像的水印算法
3.1 MATABL的应用
MATLAB是由美国mathworks公司发布的主要面对科学计算、可视化以及交互式程序设计的高科技计算环境。它将数值分析、矩阵计算、科学数据可视化以及非线性动态系统的建模和仿真等诸多强大功能集成在一个易于使用的视窗环境中,为科学研究、工程设计以及必须进行有效数值计算的众多科学领域提供了一种全面的解决方案,并在很大程度上摆脱了传统非交互式程序设计语言(如C、Fortran)的编辑模式,代表了当今国际科学计算软件的先进水平。 
MATLAB可以进行矩阵运算、绘制函数和数据、实现算法、创建用户界面、连接其他编程语言的程序等,主要应用于工程计算、控制设计、信号处理与通讯、图像处理、信号检测、金融建模设计与分析等领域。
基于MATLAB的小波变换数字图像水印系统GUI设计与实现_第5张图片

MATLAB初始界面
3.2 MATLAB的特点
总的来说,该软件有三大特点:
(1)功能强大。
具有数值计算和符号计算、计算结果和编程可视化、数学和文字统一处理、离线和在线计算等功能;
(2)界面友善、语言自然。
MATLAB以复数处理作为计算单元,指令表达与标准教科书的数学表达式相近; 在MATLAB中,基本的计算单元是矩阵,复数或实数则可以理解为1×1的矩阵。MATLAB的很多运算都是直接针对矩阵的,所以表示起来也就特别方便
(3.)开放性强。
该公司本身就推出了30多个应用工具箱,而世界上超过200家公司开发出与MATLAB兼容的第三方产品,这些产品向用户提供更多的工具箱、模块集、与其他商业产品的接口等。
MATLAB的这些特点使它获得了对应用学科(特别是边缘学科和交*学科)的极强适应力,并很快成为应用学科计算机辅助分析、设计、教学,乃至科技文字处理不可缺少的基础软件。
3.3 用Matlab研究数字水印的优点
1、丰富的小波函数和处理函数
MATLAB集成了DCT、DWT等函数有丰富的小波函数和处理函数, 其中有小波工具箱,里面有许多现成的小波函数,如,
单尺度小波分解 函数dwt2;
多尺度二维小波分解函数wavedec2;
单尺度小波重构函数idwt2;
多尺度二维小波重构函数waverec2;
提取二维小波分解高频系数函数deccoef2;
提取二维小波分解低频系数函数appcoef2;
二维小波消噪函数wdencmp等等。
这不仅方便究人员,而且使源程序简洁明了、易实现。
2、强大的数学运算功能。
图像数字水印技术是针对图像进行研究的,MATLAB强大的数值运算功能是其优于其他数学应用软件的重要原因,其中矩阵运算更是MATLAB语言的核心,且表达自然,直接,能够方便、高效地实现大量矩阵运算。
3、提供了图像处理工具箱、小波分析工具箱、数字信号处理工具箱。
例如可以调用 wfilters来获得指定小波的分解和综合滤波器系数;
同时可很好的应用于数字图像处理技术、数字信号处理等多学科。
4、MATLAB与VisualC++具有良好的接口。
有matcom和com(comppoent object model)等多种接口方法的实现,可以混合编程,在VC中调用MATLAB的函数,将MATLAB生成的.M的文件翻译成C++语言,方便更多用户理解和使用。

4.基于小波变换域的数字水印的实现
4.1基于小波变换域的数字水印的简述
小波分析的基本思想是:从一个具有正则性,局部性和振荡性的基本小波函数中心出发,经伸缩和平移得到一函数族:
(4.1)
由此得到的函数族离散化后可构成L2®空间的规范正交基并以之去表示或逼近
信号,理论研究表明,从逼近观点上讲,只用很少小波系数就可以得到许多不同图像的精确逼近。因此,小波作为变换基底是很好的选择。
(1)连续小波变换(CWT)
具有有限能量的函数f(t)(即,(f)∈L2®)的小波变换定义为以函数族
( 4.2)
为积分核的积分变换。
(R) (4.3)
其中,a是尺度参数,b是定位参数,%≯(f)称为小波。上式可描述为一带通滤波器输出。
(2)离散小波变换(DWT)
式4.1可通过对其伸缩标度因子a和平衡因子b取样而离散化。令

其中,
则由式可得 (4.4)
4.2基于离散小波变换和人类视觉系统(HVS)的水印的实例
4.2.1离散小波变换
小波变换一般采用二维离散小波变换,即对二维图像信号在水平和垂直方向做一维离散小波变换的结果。从信号处理角度来看,先在水平方向对图像分别进行低通和高通滤波,并作下采样,再在竖起方向做同样的操作。
离散小波变换定义为
m,nZ (4.5)
4.2.2算法描述
这里所讨论的水印嵌入策略对信号处理操作(如有所压缩、滤波)和通用的几何变换(如裁剪、放缩、平移和旋转等)是鲁棒的,同时其算法需要提供原始图像和原始水印。水印本身按照高斯分布(N(0,1)生成的随机数序列,由一系列实数组成X =(X1:X2,⋯,Xn),水印的长度为n.
定义NN大小的原始图像(宿主图像)为C,对原始图像进行变化域编码(二维离散小波变换DWT),加入水印后利用二维离散小波逆变换(IDWT)生成加入水印的图像。
4.2.3水印嵌入算法
水印嵌入的具体过程如下:
第一步:将原始图像和水印信息以 Double 类型的形式读入。
第二步:将原始彩色图像分解为 3 个基色分量Cr ,Cg ,Cb ,分别对该三个基色分量用 Haar 小波基进行二级小波分解。
第三步:将数字水印同样分解为 Cwr ,Cwg ,Cwb三个基色分量 ,分别对其进行一级小波分解。
第四步:将数字水印的三基色分解系数分别对应嵌入到原始彩色图像的三基色分解系数中 ,嵌入公式为
CR(G,B)A2(i,j) = CR(G,B)A2(i,j)+r(g,b)*WR(G,B)A1(i,j)
CR(G,B)H1(i,j) = CR(G,B)H1(i,j)+r(g,b)*WR(G,B)H1(i,j)
CR(G,B)V1(i,j) = CR(G,B)V1(i,j)+r(g,b)*WR(G,B)V1(i,j)
CR(G,B)D1(i,j) = CR(G,B)D1(i,j)+r(g,b)*WR(G,B)D1(i,j)
其中 , CRA2 ( i , j) 表示嵌入水印前原始图像的红色分量经小波两层分解后对应区域坐标( i , j) 处的小波系数 ,WRA1 ( i , j) 表示水印信息的红色分量经一级小波分解后的低频区域中坐标( i , j) 处的小波系数 , r表示红色分量加权系数, CRA2 ( i , j)表示嵌入水印信息后的红色分量的小波系数,其余类推。 且R , G ,B 三种基色分量加权系数满足 r ∶g ∶b =2∶ 1∶ 4的关系。
第五步:重构并显示嵌入水印后的图像。
4.2.4水印提取算法
本算法的水印提取过程是水印嵌入的逆过程,需要用到原始彩色图像和加入了彩色数字水印的图像。水印提取算法将原始图像和数字水印图像分别作两层小波分解,水印的低频系数从原始图像和数字水印图像的第二层分解的低频系数中得到,高频系数从原始图像和数字水印图像的第一层分解的高频系数中得到。实现过程中按嵌入时相同的过程将原始图像的小波系数相应地从水印图像的小波系数中减去。最后,将得到的数字水印的小波系数做小波反变换,即获得提取出的水印图像。
4.3 人眼的视觉特性(HVS)及其在水印技术中的应用
人是图像欣赏的主体,图像质量的好坏都是由人来进行评判的,因此,几乎所有的数字图像处理技术都紧紧围绕着人类的视觉系统(HVS)来进行的,如JPEG图像压缩技术就是根据人类视觉系统的特性来确定量化步长的。
近十年来,人们对图像处理技术有了更深刻的认识,尤其是把它与人类视觉
系统的某些特性相结合,使图像处理技术取得了突飞猛进的发展,以人类视觉特
性为核心的JPEG压缩技术就是一个很好的例子,它不但使图像压缩比得到了大大的提高,而且使压缩后的图像具有很好的视觉效果,现在已经有人将人类视觉特性应用到数字水印技术中来,使数字水印技术的研究取得了可喜的成就。
水印的嵌入过程可看成是在强背景(原始图像)上叠加一个弱信号(水印),只
要信号的强度低于HVS 的最小可察觉误差JND (Just NoticeableDifference), H
VS 就感觉不到水印信号的存在,这就为水印的嵌入和检测工作提供了一个很好的启示。HVS 特性和水印技术的很好结合使得水印对常见的各种攻击具有更好的鲁棒性。Christine 和Podilchuk 等在DCT 域和小波变换域内进行水印的嵌入和提取时,利用JND 模型控制了嵌入水印信号的最大强度,最大可能地避免了对图像视觉质量的破坏,这一方法显示出了很好的透明性和鲁棒性。
4.3 水印实验结果:
在实验中,我先是做了水印的嵌入,水印的提取,最后对水印图像做了三次破坏,以检验破坏后的水印提取结果。
首先,先任意找到两幅图片。一幅作为原始图像,另一幅作为水印。水印嵌入算法的功能就是利用离散小波变换算法(DWT)把水印图像嵌入原始图像中去,得到水印图像。注意:水印的大小是原始图像的四分之一,既长宽分别是原始图像的二分之一。
(1) 水印的嵌入
现在,通过水印嵌入程序,把水印嵌入到原始图像中去,得到水印图像。可见,水印嵌入到原始图像中后,所得到的水印图像和原始图像几乎是一样的,水印是看不出来的。由此可见,数字水印有良好的不可见性。
程序运行结果为 (图4-1、图4-2)
基于MATLAB的小波变换数字图像水印系统GUI设计与实现_第6张图片

图 4-1 原始图像和水印

图4-2水印图像
(2) 水印的提取
水印提取程序为嵌入的逆过程,运用了离散小波逆变换(IDWT)。调出水印提取程序,把水印图像读取出来。运行程序,就可把水印图像中的水印信息提取出来。程序运行结果为 (图4-3图4-4)
基于MATLAB的小波变换数字图像水印系统GUI设计与实现_第7张图片

图 4-4提取的水印
可见,水印图像中的水印信息能被很好地提取出来。
(3) 水印图像的攻击
1.对水印图像进行10度旋转的攻击
用matalb的自带函数imrotate对嵌入了水印的图像进行旋转,其调用格式为
B = imrotate(A,angle)
将图像A(图像的数据矩阵)绕图像的中心点旋转angle度, 正数表示逆时针旋转, 负数表示顺时针旋转。返回旋转后的图像矩阵。
B = imrotate(A,angle,method)
使用method参数可以改变插值算法,method参数可以为下面这三个值:
‘nearest’:最邻近线性插值(Nearest-neighbor interpolation)
‘bilinear’: 双线性插值(Bilinear interpolation)
‘bicubic’: 双三次插值(或叫做双立方插值)(Bicubic interpolation)
B = imrotate(A,angle,method,bbox)
bbox参数用于指定输出图像属性:
‘crop’: 通过对旋转后的图像B进行裁剪, 保持旋转后输出图像B的尺寸和输入图像A的尺寸一样。
‘loose’: 使输出图像足够大, 以保证源图像旋转后超出图像尺寸范围的像素值没有丢失。 一般这种格式产生的图像的尺寸都要大于源图像的尺寸。

基于MATLAB的小波变换数字图像水印系统GUI设计与实现_第8张图片

                         图 4-5 旋转10度攻击的图像

下面用水印检测程序,检测压缩后水印图像中的水印。程序运行结果为 (图4-6、图4-7)

基于MATLAB的小波变换数字图像水印系统GUI设计与实现_第9张图片

图 4-6旋转后提取的水印
提取的水印信息,经过压缩有一定程度的失真。
2.对水印图像进行局部剪切
用Z(128:256,256:384)=255对水印图像进行局部剪切,得到剪切后的图像(图4-8)

                ![在这里插入图片描述](https://img-blog.csdnimg.cn/70a77a6f0f604019a396f4a90a4beceb.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1RocmVleGl1,size_16,color_FFFFFF,t_70)

                图 4-8剪切后的水印图像

下面用水印检测程序,检测剪切后的水印图像中的水印信息,程序运行结果为 (图4-9、图4-10)

                   图 4-10剪切提取的水印

可见,剪切后的水印信息仍能被检测出来。
3.对水印图像进行加噪处理。
用matlab库函数Z=imnoise(Z,‘gaussian’)对水印图像进行加噪处理,得到加噪后的水印图像 (图4-11)

                ![在这里插入图片描述](https://img-blog.csdnimg.cn/7243a517456b4adbab0b884277f60de7.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1RocmVleGl1,size_16,color_FFFFFF,t_70)

                               图 4-11加噪后的图像

下面用水印检测程序,检测加噪后的水印图像的水印信息,程序运行结果为(图4-12图4-13)

                   ![在这里插入图片描述](https://img-blog.csdnimg.cn/03d62e4ae0ef48e68bd584c5e03ce9ce.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1RocmVleGl1,size_16,color_FFFFFF,t_70)

                   图 4-13加噪后提取的水印

可见,水印信息能被检测出来。由于水印图像被加噪了,相应地水印信息也被减淡了。

总结
   系统实验表明,通过离散小波变换可以实现数字水印的嵌入,提取与检测,同时通过不同的攻击方法对水印图像加以处理,测试了在保护信息产权的稳定性和可靠性。
     在此次的设计中,我查阅了大量的资料并进行收集,尝试用不同的方法去实现水印技术,独立的进行关于此方面的科学研究的考究,但是在学习和探索的过程中依然存在以下问题:
(1)对具体的水印算法的原理理解不够,导致在运用的过程中遇到困难。
(2)水印嵌入算法存有一定的缺陷,在嵌入后水印图像有一定的失真,而且水印的不可见性也达不到很高的水准。
(3)水印的抗攻击能力较差,在对图像进行减淡处理后,提取的水印有一定程度的失真。
(4)只用了一种方法去实现水印,未能创新出更好的方法,在此后的研究中多更多的注重。
(5) 该设计缺少人机交互界面GUI,如果具有一个GUI,那么呈现的结果会更加有调理和逻辑性。

参考文献:
[1]成礼智,王红霞, 罗永. 小波的理论与应用[M] . 科学出版社 2014.10.
[2]何风华 .小波分析在信号消噪中的应用[J] .兵工自动化 2012.6
[3] 杨义先 . 数字水印基础教程[M] . 北京人民邮电出版社,2017
[4]刘振华, 尹萍 .息隐藏技术及其应用〔M] .北京科学出版社,2012.
[5]李春茹 . 基于小波变换和HVS的数字图像水印技术[D] .西安电子科技大学, 2014.
[6]孙兆林 . Matlab6 .x图像处理〔M] . 北京清华大学出版社 , 2014.
[7]袁渊,窦文华 . 一种基于小波变换域的数字图像公开水印方案〔J] .
计算机工程与应用 , 2004.
[8]郭磊,郭宝龙 . 小波域数字图像水印算法的研究[J].计算机工程与应用 2012,1 .
[9]黄华, 齐春,李俊. 一种新的丈本数字水印标记策略和检测方法[M] . 西安交通大学 , 2002.6.
[10]E.Koch,J.Zhao,Tovards Robust and Hidden Image Copyright Labeling,Proc.Of1 995 IEEE Workshop Nonlinear Signal and Image Processing,1 995:20—22.
[11] LouD-C,LiuJ-L.Fault resilient and compression tolerant digital signature for image authentication 1EEETrans.on ConsumerElectron ics,2010,46(1).

致谢
 感谢在我这美好的大学生涯里遇见如此优秀的导师们,不仅在学业上给我莫大的先导作用,生活中也是给予了关怀,让我的大学生涯充满了温馨与快乐。在做此篇设计时,我的导师更是对我有很大的帮助作用,耐心的教导我如何去实现,如何去操作,尽力的在帮助我完善好设计,让我在毕业之际能够做到更好,对于她的宽容和理解,我非常感谢,同时感谢参加论文评审和答辩的各位老师,感谢他们在百忙之中抽出时间对论文进行指导和帮助。

附 录 A:

1.水印嵌入程序:
clear;

X=double(imread('lena.bmp'));
[XCsource,XSsource]=wavedec2(X,3,'db1');
%W=double(imread('UESTC.bmp')); %'double'将矩阵的元素变成双精度元素
W=double(imread('mark3.bmp')); %'double'将矩阵的元素变成双精度元素
figure
imshow(W)
lowarray=reshape(XCsource(1:4096),64,64); %convert matrix XCsource(1:4096) to a 64*64 matrix
low=XCsource(1:4096);

for i = 1:64    
    ref1(i)=mean(lowarray(:,i)); %对矩阵每列求均值
    ref2(i)=mean(lowarray(i,:)); %对矩阵每行求均值
    for j=1:64
        w(i,j,:)=int8(dec2bin(W(i,j),8))-48; %dec2bin将矩阵W的每个元素转换成二进制值,每个二进制长度为8
        result(i,j,1)=xor(w(i,j,1),(lowarray(i,j)>ref1(i)));
        result(i,j,2)=xor(w(i,j,2),(lowarray(i,j)>ref2(i)));        
    end

end
for i=1:4096
    ref3tmp=[XCsource(16381+4*i:16384+4*i)];%128*128=16384
    ref3(i)=mean(ref3tmp);
    ref4tmp=[XCsource(32765+4*i:32768+4*i)];%128*256=32768
    ref4(i)=mean(ref3tmp);
    ref5tmp=[XCsource(49149+4*i:49152+4*i)];%(128+64)*256=49152  or (128+256)*128=49152
    ref5(i)=mean(ref5tmp);
    ref6tmp=[XCsource(65521+16*i:65536+16*i)];%256*256=65536 or 128*512=65536
    ref6(i)=mean(ref6tmp);
    ref7tmp=[XCsource(131057+16*i:131072+16*i)];%256*512=131072
    ref7(i)=mean(ref7tmp);
    ref8tmp=[XCsource(196593+16*i:196608+16*i)];%(128+256)*512=196608
    ref8(i)=mean(ref8tmp);
end

alaph3=double(mean(low)/mean(ref3));
alaph4=double(mean(low)/mean(ref4));
alaph5=double(mean(low)/mean(ref5));
alaph6=double(mean(low)/mean(ref6));
alaph7=double(mean(low)/mean(ref7));
alaph8=double(mean(low)/mean(ref8));

reref3=reshape(ref3,64,64);
reref4=reshape(ref4,64,64);
reref5=reshape(ref5,64,64);
reref6=reshape(ref6,64,64);
reref7=reshape(ref7,64,64);
reref8=reshape(ref8,64,64);

for i =1:64
    for j=1:64
        result(i,j,3)=xor(w(i,j,3),(lowarray(i,j)>(alaph3*reref3(i,j))));
        result(i,j,4)=xor(w(i,j,4),(lowarray(i,j)>(alaph4*reref4(i,j))));
        result(i,j,5)=xor(w(i,j,5),(lowarray(i,j)>(alaph5*reref5(i,j))));
        result(i,j,6)=xor(w(i,j,6),(lowarray(i,j)>(alaph6*reref6(i,j))));
        result(i,j,7)=xor(w(i,j,7),(lowarray(i,j)>(alaph7*reref7(i,j))));
        result(i,j,8)=xor(w(i,j,8),(lowarray(i,j)>(alaph8*reref8(i,j))));
    end
end
save('key','result');

Y=waverec2(XCsource,XSsource,'db1');
Y=uint8(Y);
imwrite(Y,'qianrushuiyinhou.bmp','bmp');

W=uint8(W);%格式转换


imshow(Y,[]);
save('Y');
title('嵌入水印后的图');


2.水印攻击程序:
clear;

B=(imread('fuyonghua.bmp'));%读入原图
Z=B;


disp('对嵌入水印的图像的攻击实验,请输入选择项:');
disp('1--图像旋转10°');
disp('2--图像剪切');
disp('3--图像加噪');

disp('4--直接检测水印');
disp('其他--不攻击');
d=input('请输入选择(1-3):');
start_time=cputime

    figure(1);
            switch d
                case 1
            %subplot(2,3,4);
            Z = imrotate(Z,10,'crop');%旋转 角度可以控制
            imshow(Z);
            title('旋转10度攻击的水印图像');
            %M1=a1;                      
                case 2
             Z(128:256,256:384)=255;%剪切 区间和嵌入值可以控制

 %Z=imnoise(Z,'gaussian');%加噪声 选择参数 help imnoise
             %WImage2=a1;
             %noise0=20*randn(size(WImage2));
             %WImage2=WImage2+noise0;
             %subplot(2,3,4);
             imshow(Z);
             title('剪切后的图像');
             %M1=WImage2;
             %M_1=uint8(M1);
             %imwrite(M_1,'whitenoise.bmp','bmp');
                
                case 3
             

             Z=imnoise(Z,'gaussian');%加噪声 选择参数 help imnoise
             %WImage3=a1;
             %H=fspecial('gaussian',[4,4],0.2);
             %WImage3=imfilter(WImage3,H);
             %subplot(2,3,4);
             imshow(Z);
             title('加噪后图像');
             %M1=WImage3;
             %M_1=uint8(M1);
             %imwrite(M_1,'gaussian.bmp','bmp');
             
                
                  otherwise
            disp('你输入的是无效数字,图像未受攻击,将直接检测水印');
            
            imshow(Z);
            title('未受攻击的含水印图像');
            %M1=a1;
                end


  %Z = imrotate(Z,10,'crop');%旋转 角度可以控制

%Z(128:256,256:384)=255;%剪切 区间和嵌入值可以控制

 %Z=imnoise(Z,'gaussian');%加噪声 选择参数 help imnoise

%imwrite(Z,'lenaattack2.jpg','Q',100);%压缩输出(可选择压缩比例)


imwrite(Z,'lenaattack2.jpg','jpg');
figure;
subplot(121);imshow(B,[]);
title('Original Image');
subplot(122);imshow(Z,[]);
title('Transpositional Image');

3.水印的提取程序
clear;
load key
%X=double(imread('fuyonghua.bmp'));%'Watermaked Image'
X=double(imread('lenaattack2.jpg'));
[XCsource,XSsource]=wavedec2(X,3,'db1');
low=XCsource(1:4096);
lowarray=reshape(XCsource(1:4096),64,64);
std=result;

for i = 1:64    
    ref1(i)=mean(lowarray(:,i));
    ref2(i)=mean(lowarray(i,:));
    for j=1:64
        pick(i,j,1)=xor(std(i,j,1),(lowarray(i,j)>ref1(i)));
        pick(i,j,2)=xor(std(i,j,2),(lowarray(i,j)>ref2(i)));        
    end

end
for i=1:4096
    ref3tmp=[XCsource(16381+4*i:16384+4*i)];
    ref3(i)=mean(ref3tmp);
    ref4tmp=[XCsource(32765+4*i:32768+4*i)];
    ref4(i)=mean(ref3tmp);
    ref5tmp=[XCsource(49149+4*i:49152+4*i)];
    ref5(i)=mean(ref5tmp);
    ref6tmp=[XCsource(65521+16*i:65536+16*i)];
    ref6(i)=mean(ref6tmp);
    ref7tmp=[XCsource(131057+16*i:131072+16*i)];
    ref7(i)=mean(ref7tmp);
    ref8tmp=[XCsource(196593+16*i:196608+16*i)];
    ref8(i)=mean(ref8tmp);
end

alaph3=double(mean(low)/mean(ref3));
alaph4=double(mean(low)/mean(ref4));
alaph5=double(mean(low)/mean(ref5));
alaph6=double(mean(low)/mean(ref6));
alaph7=double(mean(low)/mean(ref7));
alaph8=double(mean(low)/mean(ref8));

reref3=reshape(ref3,64,64);
reref4=reshape(ref4,64,64);
reref5=reshape(ref5,64,64);
reref6=reshape(ref6,64,64);
reref7=reshape(ref7,64,64);
reref8=reshape(ref8,64,64);

for i =1:64
    for j=1:64
        pick(i,j,3)=xor(std(i,j,3),(lowarray(i,j)>(alaph3*reref3(i,j))));
        pick(i,j,4)=xor(std(i,j,4),(lowarray(i,j)>(alaph4*reref4(i,j))));
        pick(i,j,5)=xor(std(i,j,5),(lowarray(i,j)>(alaph5*reref5(i,j))));
        pick(i,j,6)=xor(std(i,j,6),(lowarray(i,j)>(alaph6*reref6(i,j))));
        pick(i,j,7)=xor(std(i,j,7),(lowarray(i,j)>(alaph7*reref7(i,j))));
        pick(i,j,8)=xor(std(i,j,8),(lowarray(i,j)>(alaph8*reref8(i,j))));
    end
end

for i=1:64
    for j=1:64
        od=double(reshape(pick(i,j,:),1,8));
        dec(i,j)=bin2dec(char(od+48));
    end
end

figure;
subplot(121);imshow(X,[]);
subplot(122);imshow(dec,[]);

你可能感兴趣的:(MATLAB工程案例)