赞
踩
目录
基于小波变换的水印嵌入与提取算法是一种利用小波分析的强大特性来增强数字媒体版权保护的技术。小波变换因其在多尺度分析、去噪、特征提取等方面的优势,被广泛应用于图像和视频的水印嵌入中,尤其擅长抵抗滤波、旋转、压缩等常见的信号处理攻击。
小波变换是时间(空间)和频率的局部化分析工具,其基本思想是将信号分解为不同尺度下的细节系数和近似系数。设原始图像为I(x,y),其二维离散小波变换(DWT)可表示为:
其中,a和b是尺度因子和位置参数,ψ是小波基函数。
水印嵌入过程通常涉及选择合适的载体系数(如小波系数的中高频部分)和采用适当的嵌入策略(如调整系数的幅度)。假设水印信息为Wm(n),嵌入强度因子为α,则嵌入过程可简化为:
其中,C(i,j)为小波变换后的图像系数,C′(i,j)为嵌入水印后的系数。
水印嵌入强度调整:对于抗压缩攻击,嵌入强度可基于小波系数的能量E动态调整为:
其中,β为全局嵌入强度系数,E是所有系数的平均能量,以保证在高能量区水印更加坚固。
旋转不变性嵌入:若在水平、垂直和对角方向分别嵌入水印分量ℎ,Wh,Wv,Wd,则有:
其中,dir=h,v,d分别对应水平、垂直、对角方向,αdir为相应方向的嵌入强度。
滤波攻击会改变图像的高频成分,影响水印的检测。为了抵抗滤波,可以选择在小波变换的高频系数中嵌入水印,因为这些系数对平滑滤波相对不敏感。此外,可以采用扩散技术,即将水印信息分散到多个系数中,减少单个系数修改对水印完整性的影响。
旋转攻击会改变图像像素的位置关系,但不会显著改变图像的频域特性。一种策略是利用小波变换的方向性,在不同方向的小波系数中嵌入水印信息的各部分,通过在多个方向上的冗余嵌入,实现旋转不变性。具体地,可以考虑在水平、垂直和对角方向的小波系数中嵌入水印的分量。
压缩攻击通过去除图像的冗余信息来减小文件大小,可能会损害嵌入的水印。为提高抗压缩能力,可以在图像的小波域中选择具有较高能量的系数进行水印嵌入,因为这些系数在压缩过程中更可能被保留。此外,采用自适应嵌入强度,依据系数的能量大小调整α,在能量高的区域增强水印强度,有助于在高压缩率下仍能提取出水印。
- % 定义 MATLAB 函数 setdwtwatermark,用于在载体图像中嵌入经过 Arnold 置乱和 Haar 小波变换处理的数字水印,并计算 PSNR 值
- function [Iw, psnr] = setdwtwatermark(I, W, nums, seeds, flag)
-
- % 获取载体图像 I 的数据类型
- type = class(I);
-
- % 将载体图像 I 和水印 W 转换为 double 类型(I)和逻辑类型(W)
- I = double(I);
- W = logical(W);
-
- % 获取载体图像和水印的尺寸
- [mI, nI] = size(I);
- [mW, nW] = size(W);
-
-
-
- % 对载体图像 I 进行两次 Haar 小波分解
- [ca1, ch1, cv1, cd1] = dwt2(I, 'haar');
- [ca2, ch2, cv2, cd2] = dwt2(ca1, 'haar');
-
- % 如果 flag 为真,则展示载体图像的小波分解结果
- if flag
- figure('Name', '载体小波分解');
- subplot(121);
- imagesc([wcodemat(ca1), wcodemat(ch1); wcodemat(cv1), wcodemat(cd2)]);
- title('一级小波分解');
- subplot(122);
- imagesc([wcodemat(ca2), wcodemat(ch2); wcodemat(cv2), wcodemat(cd2)]);
- title('二级小波分解');
- end
-
- % 复制原始水印并应用 Arnold 置乱
- Wa = W;
- H = [1, 1; 1, 2]^nums;
- for i = 1:nW
- for j = 1:nW
- % 计算新的坐标
- idx = mod(H * [i-1; j-1], nW) + 1;
-
- % 在新的位置上设置水印位
- Wa(idx(1), idx(2)) = W(i, j);
- end
- end
-
- % 如果 flag 为真,则展示水印置乱的效果
- if flag
- figure('Name', '水印置乱效果');
- subplot(121);
- imshow(W);
- title('原始水印');
- subplot(122);
- imshow(Wa);
- title(['置乱水印,变换次数=', num2str(nums)]);
- end
-
- % 初始化用于存储修改过的小波系数变量
- ca2w = ca2;
-
- % 设置随机数生成器种子
- rng(seeds);
-
- % 生成随机排列索引并对小波系数进行置乱
- idx = randperm(numel(ca2), numel(Wa));
- for i = 1:numel(Wa)
- % 获取随机排列的小波系数
- c = ca2(idx(i));
-
- % 计算对应的水印位置及扰动后的值
- z = mod(c, nW);
- if Wa(i)
- if z < nW/4
- f = c - nW/4 - z;
- else
- f = c + nW*3/4 - z;
- end
- else
- if z < nW*3/4
- f = c + nW/4 - z;
- else
- f = c + nW*5/4 - z;
- end
- end
-
- % 更新小波系数
- ca2w(idx(i)) = f;
- end
-
- % 对扰动后的小波系数进行逆变换得到嵌入水印后的高频部分
- ca1w = idwt2(ca2w, ch2, cv2, cd2, 'haar');
-
- % 对高频部分再进行逆变换得到完整的嵌入水印后的图像
- Iw = idwt2(ca1w, ch1, cv1, cd1, 'haar');
-
- % 截取原始尺寸范围内的图像
- Iw = Iw(1:mI, 1:nI);
-
- % 计算像素总数和最大像素值
- mn = numel(I);
- Imax = max(I(:));
-
- % 计算 PSNR 值
- psnr = 10 * log10(mn * Imax^2 / sum((I(:) - Iw(:)).^2));
-
- % 将处理后的图像转换回原数据类型
- I = cast(I, type);
- Iw = cast(Iw, type);
-
- % 如果 flag 为真,则展示原始图像和嵌入水印后的图像
- if flag
- figure('Name', '嵌入水印的图像');
- subplot(121);
- imshow(I);
- title('原始图像');
- subplot(122);
- imshow(Iw);
- title(['添加水印,PSNR=', num2str(psnr)]);
- end
- up4079
基于小波变换的水印嵌入与提取算法,通过巧妙地利用小波系数的特性,能够在多种攻击下有效保护数字媒体的版权信息。通过上述分析可见,选择合适的小波基、嵌入位置、嵌入策略以及采用动态调整的嵌入强度,是提高水印鲁棒性和透明性的关键。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。