Advertisement

数字水印技术概述

阅读量:

****

__

ABSTRACT

__1.__数字水印技术概述

1.1 数字水印技术提出的背景

1.2 数字水印的基本特点

1.3 数字水印的应用

1.MATLAB 软件的介绍

2.1 MATLAB 研究数字水印的优点

2.2 MATLAB 函数介绍

__3.__傅立叶域水印理论基础

3.1 傅立叶变换简述

3.1.1 一维离散傅立叶变换 DFT

3.1.2 快速傅立叶变换 __FFT

3.1.3 二维离散傅立叶变换

3.2 傅立叶变换性质

3.2.1 空间域平移性

3.2.2 旋转不变性

3.2.3 比例缩放性

__4.__基于傅立叶域相关性检测的半盲水印

4.1 引言

4.2 基于 Arnold 变换的图像置乱算法

4.3 水印算法

4.3.1 算法原理

4.3.2 算法的 matlab 实现步骤

4.4 算法的 matlab 实现及结果分析

__5.__总结与心得体会

__6.__参考文献

附录

摘 要

随着计算机技术和网络技术的快速发展,在线教育平台中课程资源的传播与复制日益便捷,并促使数字作品的信息安全保护与版权保护问题愈发迫切地需要得到解决。作为一种新兴的方法,在信息安全领域逐渐兴起以保护知识产权——数字水印技术。它通过在原始数据中嵌入重要信息来保障受版权保护的媒体数据完整性及其所有权归属,并以此实现对数字产品的盗版和篡改行为的有效防范。本文提出了一种基于傅立叶域的有意义水印算法,并主要开展了一系列工作:

通过Arnold变换对水印信息进行置乱处理后,在进行水印嵌入操作以确保提高系统的安全性

(2) 旨在通过使用两个不相关的伪随机序列来提升传统相关性检测方法的准确性,并且这种方法能够明显增强检测效果。

(3)低频分量主要承载了图像大部分的能量,在这种情况下处理可能会导致图像失真性增加的问题。因此,在本研究中我们提出了一种针对高频分量的方法以实现嵌入效果的同时保证图像质量不受影响

本文采用的水印检测方法为半盲型,仅需原始水mark信息中的一部分参与运算即可实现目标,并因此在实际应用中具有重要的价值

关键字:数字水印;傅立叶变换;图像处理;信息安全

ABSTRACT

伴随计算机和网络技术的快速发展以及数字作品传播变得愈发容易被复制的同时数字作品不仅有助于保护信息的安全性以及版权的合法性而且已成为解决现实问题的迫切需求

Before applying Arnold transform scrambling to embed a watermark, it's crucial to improve its security.

为了提升传统检测方法在准确度方面的表现,采用嵌入水印编码的两种技术与伪随机序列无关,并显著地提高了检测精度。

the low-frequency portion where most energy is concentrated in an image undergoes alterations that are prone to causing distortions; consequently, this study revises a portion of the high-frequency approach for embedding information.

The proposed watermark detection technique, when applied to semi-blind testing scenarios, demonstrates significant practical importance as it only contains a portion of the original image information.

Key Words :Digital watermarking;Fourier transform;Image processing;

Information security

1.数字水印技术概述

1.1 数字水印技术提出的背景

二十一世纪已进入数字时代。随着通信技术和网络技术的发展速度越来越快以及应用日益广泛,人们能够借助互联网实现信息接收与发送,随时能够提交或分享自己的数字图像、音乐、视频等内容,并参与多方面的学术交流活动。

然而正是由于网络的这种便利性快速传播的优势使其很容易被非法拷贝而导致数字产品的版权保护有效性和完整性得不到保证严重损害了创作者的利益而一些具有重要价值的数字信息如涉及司法诉讼政府机要等信息更是遭到了不法分子地恶意攻击和随意篡改这一系列问题给当今科学家带来了严峻挑战

基于类似问题背景而言,
可以说数字水印技术是信息时代的重要产物之一。
它不仅可以在开放网络环境下实现对版权的保护以及身份认证功能,
还能够有效保证信息完整性。
在音频、图像、视频制品领域得到了迅速而广泛的深入研究与应用。

1.2 数字水印的基本特点

数字水印被巧妙地嵌入到数字图像、音频或视频中作为一个细微的信号源。
这一特殊的存在不仅帮助人们确认产品的所有权,
还能方便地识别出购买者以及提供相应的数字产品。
具体来说,
它们都具备以下共性:

1. 不可感知性

对于数字水印的嵌入而言,在不影响观察者的视觉体验的情况下,在最佳情况下(或说在理想状态下),水印图像与原始图像之间几乎看不出区别

2. 鲁棒性

鲁棒性表征着一种数字水印技术对抗干扰的能力;通常情况下,数字水印方案会被设计成专门应对某一类特定的攻击手段。

3. 安全性

水印技术的核心特性是其安全性。基于其商业性质,该算法不得保密。算法的安全性直接由密钥决定,并因此无需对算法进行保密。

4. 计算复杂度

在多个应用场景下,针对水印嵌入和提取的不同算法(如基于深度学习的方法),其计算开销(即处理难度)呈现出显著差异,并且这些计算开销直接成为影响水印系统实时性的核心因素。

5. 水印容量

水印容量指的是载体数据字中可嵌入水印信息位的数量级,其范围通常在几兆至几个比特之间。

1.3 数字水印的应用

数字水印是通过一种不易察觉的方式嵌入到数字信息中的;从整体上说它具有以下应用:

数字产品产权保护

在最广泛的领域中得到了应用的数字水印技术,在法律和经济上具有重要价值的数据载体上嵌入隐秘的信息编码作为作品权归属的核心标识。其中所使用的电子水印编码可视为作品权归属的核心标识,在不破坏原始数据完整性的情况下即使对原始数据进行深度分析也无法轻易提取出有效的水印信息从而有效维护了作品的所有权权益。

1. 数据库标识

在某些情况下,文件中的提示标识信息往往比整个文件更为关键。某些音像资料通常会将说明性注释(例如字幕)与影像内容整合在一起。这种问题可以通过数字水印技术来有效解决。

2. 文件内容鉴定

水印技术在这两项任务——鉴定数据建立者和鉴别数据内容——中具有独特的作用。其主要目标是检测数据是否被修改过或是否存在特殊处理。

3. 系统升级

在现代生活中,旧有系统的升级已成为常见需求。通过整合到数据流中的增强层优化策略的应用,可以实现对传统信号发射系统的有效提升。

4. 商务交易中的票据防伪

由于高质量图像输入输出设备的进步, 奉行货币、支票以及其他票据的伪造变得容易。
目前, 美国、日本以及荷兰都已开始研究用于票据防伪的数字水印技术.

5. 媒体侦破

该技术的目标是获取经过处理后的原始信号信息。
例如,在某些情况下,
检测技术能够识别出图片是否经过篡改。
然而却无法确定具体的篡改细节。
而媒体修复技术则能够定位出哪些区域
被修改或添加了额外的内容。
并能识别出那些附加在原有图像中的
新元素等。

2.MATLAB软件的介绍

MATLAB语言是一种功能全面的工程工具,在多个领域中得到广泛应用,涵盖信号与图像处理、控制系统设计、通信技术以及系统仿真等多个方面。

2.1 MATLAB研究数字水印的优点

MATLAB语言有不同于其他高级语言特点,它在研究数字水印有如下特点:

1. 编程效率高

该语言采用数学表达式来编写程序,在实际应用中类似于在草稿纸上按照步骤排列公式并解决问题。因为其语法简洁明了的缘故,在执行时能够实现高效的运算,并且降低了学习难度。

2.用户使用方便

相较于其他编程语言而言,在同一个画布上实现灵活的操作能够显著提升效率。 MATLAB不仅能迅速发现代码中的语法或书写的错误,并且还能识别语义上的问题。这使得用户能够在较短时间内完成代码编写、修改以及问题排查工作。使用起来更加方便

3. 扩充能力强,交互性好

MATLAB语言的库函数种类多样化,在用户可以根据个人需求便捷地创建和扩展新的库函数, 从而提升其使用效率和功能扩展能力。高效的交互特性使程序员能够利用以往开发的程序, 因此减少重复性工作量.

4. 移植性好,开放性好

基于C语言开发的MATLAB具有良好的跨平台特性。因此,在支持运行C语言的操作系统上实现对MATLAB的移植较为方便。

5. 语言简单,内涵丰富

在MATLAB语言中构成核心功能的基本元素是函数,在同一个函数名称下接收的不同数量输入参数以及返回的不同数量输出参数分别对应着特定的功能作用。不仅极大地丰富了MATLAB库函数的功能储备体系,并且显著降低了所需存储空间的需求量。从而使得用MATLAB编写的M文件更加简洁紧凑且运行效率更高。

6. 方便的绘图功能

在MATLAB软件中提供了多种绘图函数集合,在使用这些函数进行图形绘制时,通过调用相应的功能模块,能够实现图表标题和坐标轴标签的绘制。

7. 功能强大的工具箱是MATLAB的另一特色。

MATLAB软件平台提供了丰富的工具箱以支持信号处理、自动化控制系统、智能算法与神经网络模型、图像信息处理技术以及复杂动态系统的非线性控制设计方法等研究方向。这些专业领域的开发与应用均依赖于诸如鲁棒控制理论及其在工程系统中的应用、优化理论与算法研究以及动态系统建模与辨识技术等基础理论的支持。此外,在数据建模与分析方面还包括模糊逻辑系统设计、小波分析技术以及通信工程领域的相关工具箱开发工作。

8. MATLAB的缺点

其运行速度不如其他高级程序。因为MATLAB的代码无需进行编译等预处理也不会生成可执行文件而是以解释性方式运行因此运行速度较慢。

2.2 MATLAB函数介绍

当我们研究水印技术时,在这一阶段我们处理的图像数据属于二维信号(而声音被视为一维信号),因此,在这一阶段我们只需简要介绍与之相关的函数。

1. 数据输入输出函数

这两个函数:支持读取并写入包括bmp、jpg/jpeg、tif/tiff、png、hdf、pcx以及wxd等多种图像文件格式。当处理索引文件时,能够获取相应的色调板数据

2. 图象显示

imshow()用于呈现一幅图像;imfinfo()则能够提供关于所读入图像的信息。具体而言,它包括文件尺寸(如宽度和高度)、文件格式(如真彩色或灰度图)、版本信息以及色彩模式(真彩色/灰度/索引图)等详细信息。

3. 变换域函数

在处理过程中采用不同的数学转换是完成数字水印技术在频域中的关键步骤。对于一维信号与二维信号各自拥有丰富的正交基函数集合以及对应的逆转换算法,在MATLAB软件平台中能够方便地调用和应用。

  1. 离散余弦变换(DCT)

(1) dct(),dct2():分别实现一维信号和二维信号的DCT(离散余弦变换);

(2) idct(),idct2():分别实现一维信号和二维信号的IDCT(逆离散余弦变换);

  1. 离散傅立叶变换(DFT)

(1) fft(),fft2():分别实现一维信号和二维信号的DFT(离散傅立叶变换);

(2) ifft(),ifft2():分别实现一维信号和二维信号的IDFT(逆离散傅立叶变换);

4. 攻击函数

通过攻击测试可以作为水印鲁棒性检测的重要手段。一个有效的水印算法需要通过各种攻击测试才能对其作出客观评价。

MATLAB中的许多函数可以直接用来做攻击测试:

1)剪裁:imcrop()可以按精确定位的各点坐标进行剪裁;

2)加各种噪声:imnoise()可以对图像加入各种噪声,如白噪声、椒盐噪声等。

3.傅立叶域水印理论基础

3.1 傅立叶变换简述

傅立叶变换(Fourier Transform)是一种分析信号频谱的技术。它充当了时域与频域之间的纽带,并在多个领域发挥着关键作用。举个例子来说,在某些情况下人们会发现函数可以用不同的语言来描述其本质特征;而傅立叶变换作为一种多语言工具,则提供了多样化的表达方式。同样地,在图像处理领域内解决问题的人通常会根据具体情况选择在空间域还是频率域内进行操作;这种选择往往会影响到最终的结果质量以及算法的时间效率等关键指标因素。傅立叶变换通过将一个时域信号分解为多个频率成分,并能够精确重构原始的时域信号;这一特性使其成为一种非常重要的工具并被广泛应用在工程实践中。需要注意的是这种变换具有可逆性并且能够保持能量守恒

在分析信号时,我们通常关注其在时域和频域的表现.通过Fourier变换的方法,在时域与频域之间建立联系;而其逆过程则被称为逆Fourier变换.对于一个给定的信号函数 f(t)及其傅里叶变换后的形式 F(ω)来说,在研究它们之间的关系时会发现许多有用的性质.

Fourier变换 F(ϖ )是同一能量信号的两种不同表现形式。

Fourier 分析理论在功能上具有高度的完整性,在理论上已经形成了较为完善的体系框架。该理论不仅能够实现对连续信号的有效分析而且也能实现对离散信号的具体分析。计算机则仅能进行数字信息的具体运算

对离散信号进行分析后发现, 离散Fourier变换(DFT)被视为在历史上第一个由计算机实现的形式

们仅讨论一维离散傅立叶变换和二维离散傅立叶变换。

3.1.1 一维离散傅立叶变换DFT

通过等间隔的方式对一个连续函数 f(t) 进行采样能够生成一个离散序列。假设总共进行 N 次采样,则由此产生的这个离散序列为

可以用集合的形式上表示\{\underline{f}(0), \underline{f}(1), \dots, \underline{f}(\underline{N} - 1)\};同时定义\underline{n}为离散时间变量,并定义\underline{k}为离散频率变量,则能够对信号进行频域分析

换对定义如下:

一般地, f(n)是实函数, F(k)是复函数,可以写成:

其中, R(k)、 I(k)分别为复数的实部和虚部。下式为幅度函数,称为 f(n)的傅立叶谱:

ϕ(k)称为相位函数:

在幅度函数 F(k) 和相位函数ϕ (k)中均可以嵌入水印信息。在离散傅里叶变换(DFT)算法中,在处理实数序列时需要进行大量复数运算:每进行一次实数与复数的乘法运算就需要进行两次实数乘法操作;每一次复数加法运算则对应两次实数加法操作。具体而言,在DFT计算中总共需要执行2N²次实数乘法和2N(N−1)次实数加法运算。由此可知,在这种情况下总运算量为O(N²),当输入数据规模N极大时会导致计算时间过长而无法满足实时处理需求。基于此背景人们开发出了快速傅里叶变换算法。

3.1.2 快速傅立叶变换 FFT

1965年,美国的两位科学家Cooley和Tukey发明了著名算法快速傅立叶变换(FFT)。快速傅立叶变换(FFT)的基本思想是基于对离散傅立叶变换的快速计算方法。

定义序列 f(n) 的长度为 N = 2^M。若不满足条件,则在尾部补零以确保数据长度符合要求,并不会对后续操作产生任何影响。根据 n 的奇偶性将 f(n) 分解为两组子序列。

那么,

将(3.7)和(3.8)代入上式整理得:

上式右边的两部分恰好是长度(周期)为 N / 2的g1(m),h1(m)的傅立叶变换G1(k),H1(k)所以:

(3.12)和(3.13)可简记为图3.1 的蝶式运算:

图 3.1 蝶式算法

将长度为 N 的离散傅里叶变换(DFT)被分解成两个长度同为 N/2 的子序列的DFT,并经过 N/2 次复数乘法运算完成。随后采用分治-递归方法共经历 \log N 步骤,在每一步中都涉及 N/2 次复数加法操作。其中每次蝶形运算包括一次复数乘法和两次复数加法操作。因此该算法的时间复杂度即为其计算复杂度即 O(N \log N)

3.1.3 二维离散傅立叶变换

在数字图像处理领域中,图像信号通常表现为二维空间分布的数据,并在此基础上展开分析与处理工作。基于此,在深入理解了一维离散傅里叶变换(DFT)的基础上进行多维扩展具有显著的技术价值与应用潜力。对于任意有限尺寸的二维数据序列{x(m,n)}(其中m∈[0,M-1]且n∈[0,N-1])而言,则其对应的多维DFT定义式可表示为:X(k,l)=∑_{m=0}{M-1}∑_{n=0}{N-1}x(m,n)e^{-j2π(km/M+ln/N)}

二维离散傅立叶变换的傅立叶谱、相位、功率谱与一维的类似,分别如下:

傅立叶谱:

相位:

功率谱:

式(3.14)可分离为:

式(3.15)可分离为:

显然,任何一个二维的离散余弦转换或者逆转换都可以被分解为两个步骤的操作.其中每个步骤都对应于一个一维的离散余弦转换或者逆转换.具体而言,我们首先要对图像执行行方向的一位离散余弦转换(或者列方向的一位离散余弦转换),然后再执行列方向的一位离散余弦逆转换(或者行方向的一位离散余弦逆转换).

3.2 傅立叶变换性质

傅立叶变换的典型性质有下列三种:

3.2.1 空间域平移性

空间域内的图像 f(x , y)的原点平移到点(a ,b)时,其对应的频谱变换关系为:

即频谱乘上一个负的指数项,造成相位平移,而幅度不改变。因为

这一现象表明,在空间位置的变化下,图像的傅立叶变换幅度谱不会发生改变;然而,在傅立叶域中,这种变化会直接影响相位信息。

3.2.2 旋转不变性

在空间域中以极坐标 r ,θ 取代 x,y ;在变换域以w ,Φ代替 __u,__v ,使得:

显然,在DFT 变换前图像为 f(r ,θ ),DFT变换后为 F(ϖ ,Φ) .可以证明存在以下变换对:

可以看出,在空间域中对图像阵列 f(r, \theta) 进行了 \theta 角度的旋转变换后,在频率域中对应的变换系数矩阵也进行了相同的旋转变换。类似地,在频率域中对变换域系数阵列执行 \theta 角度的旋转变换后,在空间域中反变换得到的图像 f(r, \theta) 必然也进行了 \theta 角度的旋转变换。

3.2.3 比例缩放性

函数 f(x , y)的尺寸缩放到 f(ax ,by)时,其对应的频谱关系为:

这表明图像在空域按比例缩放,其傅立叶频域反方向缩放相同比例。

其中傅立叶变换所具有的这三种典型性质对于抗几何攻击水印算法的设计具有重要意义。
或者:
傅立叶变换的这三种基本特性在其应用于抗几何攻击水印算法设计中的应用中展现出特别重要的作用。
或者:
这些傅里叶变换的关键特征在其用于抗几何攻击水印算法设计中的应用中发挥着关键作用。
或者:
傅里叶变换的关键属性在其应用于抗几何攻击水印算法设计的过程中展现出显著的重要性。

4.基于傅立叶域相关性检测的半盲水印

4.1 引言

在当前研究中,图像水印技术针对水印鲁棒性的要求已经提出了较高的需求。大量算法采用了伪随机噪声作为水印编码的基础,并对应地使用相关性检验作为检测手段。当被检测图像中所提取的待测序列与原始水印具有较高的相关性时,则表明该被检测图像中含有相应的信息码;反之,则判定为无码存在。值得注意的是,在某些特定场景下(如需嵌入的信息应具有可读性和视觉性),对嵌入的比特位信息提出了更高的要求。这种有意义的比特位信息相比无意义的二进制信息方案具有更为显著的优势。因此,在本章中我们结合伪随机序列和有意义的信息编码方案,在傅立叶频域提出了一种新的相关性检测方法,并且为了提高系统的安全性,在进行数据嵌入前对原始信息载体进行了混乱处理

4.2 基于Arnold 变换的图像置乱算法

Arnold transform is a type of mapping introduced by Arnold in his studies on ergodic theory. It is also referred to as the "cat face" transformation due to its distinctive visual characteristics. Let the image be denoted as S = [0,1] × [0,1], where (x,y) ∈ S. Define the mapping such that...

这属于单位正方形上的Arnold映射。具体来说,通过将离散图像的像素坐标扩展到一个平面上进行处理。因此对于一张大小为N×N张的数字图像而言,其中包含 Arnold变换的具体定义如下。

由此做迭代变换,记

考虑其反馈,有

将离散点进行置换,并将其图像信息移植过来,在对原始图像的所有点完成遍历后,从而生成了新的图像。

对于数字图像而言,在Arnold变换中所指的位置变化实际上是各点其灰度或RGB分量的空间转移现象。具体而言,在原始坐标系中位于(x,y)位置处的像素所携带的灰度或RGB分量会被转移至变换后的坐标系中的(x', y')位置。如果我们将一个数字图像反复施加离散化的Arnold变换操作,并将每次变换的结果作为后续步骤的新输入进行处理,则可以在不断迭代的过程中生成一系列变化多端的结果图象。一旦在某次迭代操作后所得到的结果图象满足我们设定的标准(即达到某种程度上的混乱状态),那么我们就称该结果图象为基于Arnold变换产生的混乱图象。

观察到(4.2)式所定义的Arnold transform本质上是一种点的位置转移过程, 并且这种操作具有单射性质, 即每个输入对应唯一的输出结果, 这种操作还可以持续不断地进行下去, 直至达到收敛状态。类似的操作还包括所谓的" baker's transform"等映射操作, 它们都具备一定的几何意义和物理背景。值得注意的是, Arnold transform具有周期性特征, 即经过若干次迭代后会恢复初始状态; 这一点已经被Dyson 和Falk 等人深入研究过, 其结论表明: 对于任意整数N>2, Arnold transform 的周期 T 满足 T ≤ N² / 2

该算法所使用的水印图像大小设定为40×40像素,并具有30次转换周期。即经过30次Arnold置乱运算后,水印图像将恢复其原始状态。如表所示,在不同阶数N的情况下,二维数字图像经Arnold变换后的转换周期

表 4.1 Arnold 变换周期

4.3 水印算法

4.3.1 算法原理

4.3.1.1 嵌入算法原理

图 4.1 水印嵌入流程图

如图4.1所示为嵌入算法的流程图。为了提升传统相关性检测方法的准确性,本算法采用将两个不相关的伪随机序列嵌入的方式,显著地提高了提取的有效性。首先将原始图像划分为若干子块,并针对每个子块分别执行二维傅里叶变换(DFT)操作;随后对经Arnold置换处理后的二值水印矩阵进行混乱处理,并生成两个独立的一维伪随机序列用于后续操作:置乱水印矩阵值为0的位置使用了一个一维伪随机序列与原始图像幅度谱进行乘积运算;而取值为1的位置则采用了另一个独立的一维伪随机序列完成同样的运算

1.子块划分

将原始图像分成8×8的图像子块

2.对每一图像块进行DFT变换

接着执行FFT平移操作,并对二维矩阵进行处理,在将其一阶与第三阶交换的同时也交换第二和第四阶的位置,并使直流分量居于中心位置

3.将二值水印用Arnold变换置乱

4.产生两个不相关的伪随机序列

5.修改相应幅度谱值

在DFT域中存在幅度谱的镜像特性,在进行水印编码过程中采取镜像编码策略其基本原理是利用镜像编码技术确保水印信息不会破坏原始信号的频域特性同时也能保证图像像素恢复后的真实性和完整性

6.对每一图像块进行DFT 逆变换,得到含水印图像

4.3.1.2提取算法原理****

图 4.2 水印提取流程图

水印提取算法是嵌入算法的逆过程

1.子块划分

将嵌入水印图像分成8×8的图像子块:

2.对每一图像块进行DFT变换

3.产生两个不相关的伪随机序列。

4.通过计算嵌入水印幅度谱与伪随机序列的相关程度,并同时根据嵌入时的规则生成水印矩阵。

5.将水印矩阵用Arnold 变换进行置乱得到提取水印。

4.3.2算法的 matlab 实现步骤

4.3.2.1 嵌入算法步骤

Step0.设置嵌入强度系数,滤波矩阵,分块大小并保存开始时间。

Step1.读入原始图像cover_object,并读出其尺寸为 Mc × Nc

Step2.读入水印图像message,并读出其尺寸为 Mm × Nm

Step3. 通过Arnold置乱算法处理message,并将其重组为variable vector message_

Step4.核查水印大小是否超出范围,若发现水印超过标准值则导致错误反馈,并指出水印超过标准值。

Step5. 生成伪随机密钥key,并基于滤波矩阵中1的数量创建两个无关的伪随机序列pn_sequence_one和pn_sequence_zero。

将原始图像划分为8×8的小块,并对其进行二维傅里叶变换。将低频分量转移至中心位置,并计算其幅度和相位。当水印向量中的元素为零时,在嵌入pN_sequence_zero处的滤波矩阵对应位置的幅度值被设置为零;同样地,在嵌入pN_sequence_one处的滤波矩阵对应位置的幅度值也被设置为零。

Step7.对每一分块进行二维傅立叶逆变换,将图像变换回空域。

Step8.对嵌入的水印图像进行存储操作;评估运行所需的时间;计算PSNR指标的数值;展示提取的水印图、嵌入的水印图以及原始图片之间的对比

4.3.2.2 提取算法步骤

水印提取算法无需原图数据,其算法流程需细节信息(如W_0尺寸)

Step0.设置滤波矩阵,分块大小并保存开始时间。

Step1.读入嵌入水印图像watermarked_image,并读出其尺寸为 Mw × Nw

Step2.读入原始水印图像orig_watermark,并读出其尺寸为 Mo × No

Step3.设定与嵌入算法相同的伪随机密钥key,并基于滤波矩阵中1的数量制作两个无关的伪随机序列pn_sequence_one和pn_sequence_zero。

第4步中,首先将嵌入水印的图像分割为8×8的小块,并对其应用二维傅里叶变换;接着,将所有低频分量移至中间位置区域,并求取其幅度。

在步骤5中,分别计算pn_sequence_one和pn_sequence_zero与幅度的相关度。如果发现pn_sequence_zero与幅度的相关度高于pn_sequence_one,则将提取水印向量message_vector赋值为'0';否则赋值为'1'。

Step6.将提取水印向量进行Arnold 置乱,并按原始水印尺寸排列。

Step7.计算运行时间,显示提取水印与原始水印。

4.4 算法的matlab 实现及结果分析

程序见附录

原始宿主图像是3843848b 的lena 灰度测试图像,见图4.3

图 4.3 原始图像

该水印图是一个大小为40×40像素、深度为1位的二值图像(如图所示)。然而,在进行水印检测时,并不需要原始图片本身的信息。然而需要的是原始水印图片的具体尺寸数据。

图 4.4 水印图像

下图是用Matlab 软件进行试验的结果:

图 4.5

水印置乱

图4.6 嵌入水印图像与原始图像

图4.7 没有受到攻击的图像和直接提取的水印图像

图4.8 剪切后的图像及提取的水印图像

图4.9 加入白噪声后的图像、原始水印图像及提取的水印图像

图4.10 缩放后的图像及提取的水印图像

图4.11 压缩后的图像及提取的水印图像

通过以上分析可知,在未受任何威胁的图像中提取的水印与其原始版本具有最高相关性(相关系数为0.99601),接近理论上的完美匹配(1)。然而,在面对剪切操作、噪声干扰、缩放变形以及压缩编码等常见攻击后,在这些情况下提取出的水印与其原始版本的相关性均有所下降。其中,在承受压缩编码攻击时(即经过数字压缩处理),其相关度NC降至0.83534左右,并发难以辨别两者之间的差异;相应地,这些情况下的峰值信噪比也出现了明显降低的现象。综上所述,在DFT域嵌入的数字水印算法在抗剪切方面的表现最为出色,在抗噪声和抗缩放方面同样表现出较强的能力;但就抗压缩能力而言,则显得相对不足。

5.总结与心得体会

在信息技术迅速发展的背景下,在线教育服务逐渐成为主流趋势,在这一大环境下所产生的在线教育管理问题亟需得到有效应对措施。基于上述背景而产生的数字水印技术作为一种新型的有效版权保护手段将会具备广阔的适用前景以及广泛的应用价值。

本课程设计首先围绕数字水印技术提出的背景及其实质特点展开了深入探讨;随后阐述了傅立叶变换的基本理论体系,并将其作为构建数字水印算法的技术理论支撑;进而提出了基于傅立叶域相关性检测机制的新颖水印方案。该方案巧妙地融合了Arnold置乱技术、传统相关性检测手段以及傅里叶域特有的数学特征,在信息嵌入环节则采用了双层不相关的伪随机序列编码策略。该方案不仅显著提升了信息隐藏的安全可靠性以及检对外部干扰干扰的能力,并且能够在保证原有经典方法优势的同时实现性能指标的重大优化提升。

研究表明,在数字水信息保护领域中采用离散傅里叶变换算法实现了数字水印信息的嵌入与提取。针对不同类型的攻击手段进行了相应的抗干扰测试。评估了在保护信息产权方面的稳定性和可靠性。经这些破坏手段处理后仍能获取和识别出具有很好辨识度的信息特征码。但在面对压缩破坏时所获取的信息却难以达到有效的识别效果。

在本次设计项目中, 我进行了全面的文献调研与信息整理. 经过本次设计实践, 我熟悉了基于傅里叶变换的数字水印技术. 为此, 其后续深入学习奠定了基础. 同时, 进一步强化了MATLAB编程能力.

6.参考文献

[1]**** 施建平,图像数字水印算法的研究,西北工业大学学报,2006,(1):27~28

[2] 陈莉娜,数字水印算法研究,电子科技大学硕士学位论文,2005,3~5

[3] Ingemar J. Cox,数字水印,电子工业出版社,2003,1

[4] 曾满红,傅立叶明文水印及零水印算法的研究,燕山大学硕士学位论文,2005,16~17

[5] Rafael C. Gonzalez, Richard E. Woods. Digital Image Processing (Transl.: Qiaochi Ruan, Yuzhi Ruan). [M]. - Beijing: Tsinghua Electronics Press, 2003

[6] 飞思科技产品研发中心.MATLAB 6.5辅助图象处理[M] .-北京:电子工业出版社,2003

附录

水印嵌入源码

%基于傅立叶域的数字水印

%注意:水印必须为40*40的二值图像

考虑到40阶的二维arnold变换具有周期性特征,在嵌入过程中进行8次混乱操作,在提取过程中执行22次混乱操作。.可以根据不同的需求进行相应的调整。

%嵌入源码

clc

clear all;

% 保存开始时间

start_time=cputime;

iTimes=8; %置乱次数

k=1.1; % 设置嵌入强度系数

blocksize=8; % 块的大小

filter_m=[ 1,1,1,1,1,1,1,1; % 滤波矩阵

1,1,1,1,1,1,1,1;

1,1,0,0,0,0,1,1;

1,1,0,0,0,0,1,1;

0,0,0,0,0,0,0,0;

0,0,0,0,0,0,0,0;

0,0,0,0,0,0,0,0;

0,0,0,0,0,0,0,0;];

% 读入原始图像

file_name='lena.bmp';

cover_object=double(imread(file_name))/255;

% 原始图像矩阵的行数与列数

Mc=size(cover_object,1);

Nc=size(cover_object,2);

% 最大嵌入信息量

max_message=Mc*Nc/(blocksize^2);

% 读入水印图像

file_name='watermark.bmp';

message=double(imread(file_name));

%水印图像矩阵的行数与列数

Mm=size(message,1);

error('必须为40*40大小,或者修改置乱次数');

end

tempImg=message;

for n=1:iTimes % 置乱次数

for u=1:Mm

for v=1:Nm

temp=tempImg(u,v);

ax=mod(u+v,Mm)+1;

ay=mod(u+2*v,Nm)+1;

outImg(ax,ay)=temp;

end

end

tempImg=outImg;

end

message_vector=reshape(outImg,1,Mm*Nm)

% 将cover_object(原图矩阵)写入watermarked_image

watermarked_image=cover_object;

%置随机数发生器的状态为1100

key=1100;

rand('state',key);

% 产生伪随机序列

pn_sequence_zero=round(2*(rand(1,sum(sum(filter_m)))-0.5));

pn_sequence_one=round(2*(rand(1,sum(sum(filter_m)))-0.5));

% 将图像分块

x=1;

y=1;

h=waitbar(0,'嵌入水印,请等待');

for (kk = 1:length(message_vector))

% 做傅立叶变换

fft_block=fft2(cover_object(y:y+blocksize-1,x:x+blocksize-1));

%计算幅值

abs_block=fftshift(abs(fft_block));

%计算相位

angle_block=angle(fft_block);

在上述条件下采用PN序列pn_sequence_zero对abs_block进行处理

注释:当message_vector和filter_m的值均为1时,采用伪随机序列pn_sequence_one进行abs_block的处理。

ll=1;

if (message_vector(kk)==0)

abs_block(blocksize-ii+1,blocksize-jj+1)=abs_block(blocksize-ii+1,blocksize-jj+1)+…

abs_block(ii,jj)-abs_block_o;

ll=ll+1;

end

end

end

else

for ii=1:blocksize

for jj=1:blocksize

if (filter_m(ii,jj)==1)

abs_block_o=abs_block(ii,jj);

abs_block(ii,jj)=abs_block(ii,jj)(1+kpn_sequence_one(ll));

abs_block(blocksize-ii+1,blocksize-jj+1)=abs_block(blocksize-ii+1,blocksize-jj+1)+…

abs_block(ii,jj)-abs_block_o;

ll=ll+1;

end

end

end

end

% 进行傅立叶逆变换

abs_block=fftshift(abs_block);

watermarked_image(y:y+blocksize-1,x:x+blocksize-1)=…

abs(ifft2(abs_block.exp(iangle_block)));

% 移动到下一块

if (x+blocksize) >= Nc

x=1;

y=y+blocksize;

else

x=x+blocksize;

end

waitbar(kk/length(message_vector),h);

end

close(h);

% 转换为uint8,并写入

watermarked_image_int=uint8(watermarked_image*255);

imwrite(watermarked_image_int,'dft2_watermarked.bmp','bmp');

% 计算运行时间

elapsed_time=cputime-start_time,

% 计算psnr

psnr=psnr(cover_object,watermarked_image),

% 显示水印,嵌入水印图像与原始图像

figure(1)

subplot(1,2,1)

imshow(message,[]);

title('原始水印');

subplot(1,2,2);

imshow(tempImg,[]);

title('置乱水印');

figure(2)

subplot(1,2,1)

imshow(watermarked_image,[]);

name='嵌入水印图像';

title(strcat(num2str(name),' k=',num2str(k),' psnr=',num2str(psnr)));

subplot(1,2,2)

imshow(cover_object,[])

title('原始图像');

%%%%%%%%%%%%%% 进行攻击测试 %%%%%%%%%%%

disp(‘1-->加入白噪声’);

disp(‘2-->剪切图像’);

disp(‘3-->直接检测’)

begin=input(‘请选择攻击(1-3):’)

switch begin

%%%%%%% 加入白噪声 %%%%%%%%

case 1

figure(3)

Aimage1=wimage;

Wnoise=0.01*randn(size(Aimage1));

Aimage1=Aimage1+Wnoise;

subplot(1,3,1),imshow(Aimage1,[]),title(‘加入白噪声后的图象’);

att=Aimage1;

imwrite(att,'chulihouimage.bmp');

%%%%%%%% 剪切攻击 %%%%%%%%

case 2

figure(3)

Aimage3=wimage;

Aimage3(1:128,1:128)=256;

subplot(1,3,1),imshow(Aimage3,[]),title(‘剪切后的图象’);

att=Aimage3;

imwrite(att,'chulihouimage.bmp');

%%%%%%% 没有受到攻击 %%%%%%%

case 3

figure(3)

subplot(1,3,1),imshow(wimage,[]),title(‘未遭到攻击的图像’);

att=wimage;

imwrite(att,'chulihouimage.bmp');

end

水印提取源码

%提取源码

clc

clear all;

% 保存开始时间

start_time=cputime;

iTimes=22; %置乱次数

blocksize=8; % 设置块的大小

filter_m=[ 1,1,1,1,1,1,1,1; % 滤波矩阵

1,1,1,1,1,1,1,1;

1,1,0,0,0,0,1,1;

1,1,0,0,0,0,1,1;

0,0,0,0,0,0,0,0;

0,0,0,0,0,0,0,0;

0,0,0,0,0,0,0,0;

0,0,0,0,0,0,0,0;];

% 读入嵌入水印图像

file_name='chulihouimage.bmp';

watermarked_image=double(imread(file_name))/255;

% 嵌入水印图像矩阵的行数与列数

Mw=size(watermarked_image,1);

Nw=size(watermarked_image,2);

% 最大可嵌入信息量

max_message=Mw*Nw/(blocksize^2);

% 读入原始水印

file_name='watermark.bmp';

orig_watermark=double(imread(file_name));

% 原始水印矩阵的行数与列数

Mo=size(orig_watermark,1);

No=size(orig_watermark,2);

%置随机数发生器的状态为1100

key=1100;

rand('state',key);

% 产生伪随机序列

pn_sequence_zero=round(2*(rand(1,sum(sum(filter_m)))-0.5));

pn_sequence_one=round(2*(rand(1,sum(sum(filter_m)))-0.5));

% 将图像分块

x=1;

y=1;

h=waitbar(0,'提取水印,请等待');

for (kk = 1:max_message)

% 傅立叶变换

fft_block_w=fft2(watermarked_image(y:y+blocksize-1,x:x+blocksize-1));

abs_block_w=abs(fftshift(fft_block_w));

ll=1;

for ii=1:blocksize

for jj=1:blocksize

if (filter_m(ii,jj)==1)

sequence(ll)=abs_block_w(ii,jj);

ll=ll+1;

end

end

end

% 计算sequence与pn_sequence_zero和pn_sequence_one的相关系数

correlation_zero(kk)=corr2(pn_sequence_zero,sequence);

correlation_one(kk)=corr2(pn_sequence_one,sequence);

% 移动到下一块

if (x+blocksize) >= Nw

x=1;

y=y+blocksize;

else

x=x+blocksize;

end

waitbar(kk/max_message,h);

end

close(h);

% 如果correlation_zero>correlation_one,那么message_vector=0,反之为1.

for (kk=1:Mo*No)

if correlation_zero(kk)>correlation_one(kk)

message_vector(kk)=0;

else

message_vector(kk)=1;

end

end

% Arnold置乱

tempImg=reshape(message_vector(1:Mo*No),Mo,No);

message_arnold=tempImg;

for n=1:iTimes % 次数

for u=1:Mo

for v=1:No

temp=tempImg(u,v);

ax=mod(u+v,Mo)+1;

ay=mod(u+2*v,No)+1;

outImg(ax,ay)=temp;

end

end

tempImg=outImg;

end

message=outImg;

% 计算运行时间

elapsed_time=cputime-start_time,

%计算NC(归一化相关系数)

NC=nc(message,orig_watermark)

%计算 psnr

psnr=psnr(message,orig_watermark);

% 显示提取水印与原始水印

figure(3)

subplot(1,3,2);

imshow(message,[]);

name='提取水印';

title(strcat(num2str(name),' NC=',num2str(NC), ' psnr=',num2str(psnr)

));

subplot(1,3,3)

imshow(orig_watermark,[])

title('原始水印');

PSNR(峰值信噪比)函数

%计算 PSNR (峰值信噪比)

function dPSNR = psnr(ImageA,ImageB)

if size(ImageA) ~= size(ImageB)

error('错误:两个输入图像大小不一致!');

dPSNR = 0;

return ;

end

ImageA=double(ImageA);

ImageB=double(ImageB);

M = size(ImageA,1);

N = size(ImageA,2);

d = 0 ;

for i = 1:M

for j = 1:N

d = d + (ImageA(i,j) - ImageB(i,j)).^2 ;

end

end

dPSNR = 10log10((MN*max(max(ImageA.^2)))/d) ;

return

NC(归一化相关系数)

%计算nc(归一化相关系数)

function dNC = nc(ImageA,ImageB)

if size(ImageA)~=size(ImageB)

error('错误:两个输入图像大小不一致!');

dNC = 0;

return ;

end

ImageA=double(ImageA);

ImageB=double(ImageB);

M = size(ImageA,1);

N = size(ImageA,2);

d1=0 ;

d2=0;

for i = 1:M

for j = 1:N

d1=d1+ImageA(i,j)*ImageB(i,j) ;

d2=d2+ImageA(i,j)*ImageA(i,j) ;

end

end

dNC=d1/d2;

全部评论 (0)

还没有任何评论哟~