基于傅立叶变换的数字水印嵌入技术 第6页
第四章 基于傅立叶域相关性检测的半盲水印
4.1 引言
目前,图像水印技术的研究对于水印鲁棒性的要求比较高,有相当一部分算法采用伪随机噪声来构造水印,与之相应,采用相关性检验来检测被检测图像中是否含有水印。当被检测图像中所提取的待测序列与原始水印具有较强的相关性时,表示该被检测图像中含有水印,否则,不含有水印。然而在另外一些情况下,对嵌入图像中的水印信息要求比较高。比如要求所嵌入的信息是可读的或可视的,如有意义的信息(文字,图像等)。这种有意义的水印具有无意义水印无可比拟的优点。因此,本章结合伪随机序列与有意义水印,提出了基于傅立叶域相关性检测的水印算法。为了提高水印的安全性,在嵌入水印前用Aronld变换对水印图像进行了置乱,下面先介绍Aronld变换。
4.2 基于Arnold变换的图像置乱算法
Arnold变换,又称“猫脸”变换,是Arnold在研究遍历理论过程中提出的一种变换。假设图像为
这就是单位正方形上的Arnold变换。实际上,可以令离散图像的像素坐标扩展到一幅图像上,对于一幅大小为N×N的图像,有下述的Arnold变换
由此做迭代变换,记A=
考虑其反馈,有
通过离散点的置换,同时把图像信息移植过来,当遍历了原图象的所有点之后,便产生了一副新的图像。
对于数字图像而言,我们所说的位置移动其实是对应点的灰度值或RGB颜色值的移动,即原来点
注意到(4.2)式定义的Arnold变换实际上是一种点的位置移动,且这种变换是一一对应的。此外,这种变换可以迭代地做下去。类似的变换还有面包师变换。需要注意的是,Arnold变换具有周期性,即当迭代到某一步时,将重新得到原始图像。Dyson和Falk分析了离散Arnold变换的周期性,给出了对于任意N>2,Arnold变换的周期
本算法采用的水印图像尺寸为
表4.1 Arnold变换周期
Chart 4.1 Arnold transform cycle
N |
2 |
3 |
5 |
6 |
7 |
10 |
12 |
16 |
18 |
19 |
24 |
32 |
周期 |
3 |
4 |
10 |
12 |
8 |
30 |
12 |
12 |
12 |
9 |
12 |
24 |
N |
35 |
36 |
40 |
45 |
48 |
54 |
60 |
64 |
72 |
80 |
96 |
100 |
周期 |
40 |
12 |
30 |
60 |
12 |
36 |
60 |
48 |
12 |
60 |
24 |
150 |
N |
125 |
128 |
200 |
250 |
256 |
280 |
300 |
384 |
400 |
480 |
512 |
513 |
周期 |
250 |
96 |
150 |
750 |
192 |
120 |
300 |
96 |
300 |
120 |
384 |
36 |
4.3 水印算法
图 4.1 水印嵌入流程图若图片无法显示请联系QQ752018766
Fig. 4.1 watermark embed flow chart
图4.1是嵌入算法流程图。为了提高传统相关性检测方法的准确率,本算法采取嵌入两个不相关伪随机序列的方法,有效的提高了提取的准确率。
首先将原始图像划分子块,对每一图像块进行DFT变换,将二值水印图像用Arnold变换置乱。产生两个伪随机序列。置乱水印矩阵值为0时用一个伪随机序列与原始图像的幅度谱进行乘性叠加,矩阵值为1时,用另一个伪随机序列与原始图像幅度谱进行乘性叠加。
1.子块划分
将原始图像分成8×8的图像子块
2.对每一图像块进行DFT变换
然后做FFT平移,对于二文矩阵将一、三象限与二、四象限互换,使得直流分量位于中间。
3.将二值水印用Arnold变换置乱
4.产生两个不相关的伪随机序列
5.修改相应幅度谱值
由于DFT域的幅度谱具有对称性,为了水印嵌入后保持这种对称性不变,也为了确保恢复
图像像素值为实数,嵌入水印时采用对称嵌入,即:
式中
嵌入规则为当水印矩阵元素为‘0’时,将一个伪随机序列与幅度谱对应元素进行乘性叠加。当水印元素为‘1’时,用另一个伪随机序列与幅度谱对应元素进行乘性叠加。嵌入时以滤波矩阵选择嵌入块中的位置。
6.对每一图像块进行DFT逆变换,得到含水印图像
(4.7)若图片无法显示请联系QQ752018766
(4.8)
图 4.2 水印提取流程图
Fig. 4.2 watermark recovering flow chart
水印提取算法是嵌入算法的逆过程
1.子块划分 若图片无法显示请联系QQ752018766
将嵌入水印图像分成8×8的图像子块:
2.对每一图像块进行DCT变换
然后做FFT平移,对于二文矩阵将一、三象限与二、四象限互换,使得直流分量位于中间。
3.产生两个不相关的伪随机序列。
4.计算嵌入水印幅度谱与伪随机序列的相关性,并按照嵌入时的规则产生水印矩阵。
5.将水印矩阵用Arnold变换进行置乱得到提取水印。
Step0.设置嵌入强度系数,滤波矩阵,分块大小并保存开始时间。
Step1.读入原始图像cover_object,并读出其尺寸为
Step2.读入水印图像message,并读出其尺寸为
Step3.对message进行Arnold置乱,并将置乱后水印图像重新排列为向量message_vector。
Step4.检查水印信息是否过大,如果水印信息过大返回错误信息,“水印信息过大”。
Step5.设置伪随机密钥key,并按照滤波矩阵的1的个数,生成两个不相关的伪随机序列pn_sequence_one,pn_sequence_zero。
Steo6.对原始图像进行8×8分块,并对每一分块进行二文傅立叶变换。将低频部分移至中间,计算幅值与相位。如果水印向量元素为零,则将pn_sequence_zero嵌入滤波矩阵为1处所对应的幅值。如果水印向量元素为零,则将pn_sequence_one嵌入滤波矩阵为1处所对应的幅值。
Step7.对每一分块进行二文傅立叶逆变换,将图像变换回空域。
Step8.将嵌入水印图像保存,计算运行时间,计算psnr值,显示水印、嵌入水印图像与原始图像。
水印提取算法不需要原始图像,但需要原始水印的部分信息(原始水印的尺寸)
Step0.设置滤波矩阵,分块大小并保存开始时间。
Step1.读入嵌入水印图像watermarked_image,并读出其尺寸为
Step2.读入原始水印图像orig_watermark,并读出其尺寸为
Step3.设置与嵌入算法中相同的伪随机密钥key,并按照滤波矩阵的1的个数,生成两个不相关的伪随机序列pn_sequence_one,pn_sequence_zero。
Step4.对嵌入水印图像进行8×8分块,并对每一块进行二文傅立叶变换.将低频部分移至中间,计算幅值。
Step5.分别计算pn_sequence_one,pn_sequence_zero与幅值的相关性,如果pn_sequence_zero与幅值的相关性大于pn_sequece_one与幅值的相关性,那么将提取水印向量message_vector赋‘
Step6.将提取水印向量进行Arnold置乱,并按原始水印尺寸排列。
Step7.计算运行时间,显示提取水印与原始水印。
4.4 算法的matlab实现
上一页 [1] [2] [3] [4] [5] [6] [7] [8] 下一页