基于DWT-JND模型与DCT变换的自适应图像水印系统
项目介绍
本项目设计并实现了一套基于Matlab的数字图像水印系统。系统核心在于融合了DWT(离散小波变换)域的JND(恰可察觉失真)感知模型,实现了水印的自适应嵌入,以平衡水印的不可见性(透明性)与鲁棒性。此外,为了评估算法性能,系统还并行实现了一套基于DCT(离散余弦变换)扩频的水印算法作为对比组,并集成了多种常见的图像攻击模拟与性能评价指标计算功能。
功能特性
- 自适应DWT-JND水印嵌入:利用人类视觉系统(HVS)特性,在小波域计算JND阈值,根据图像的亮度掩蔽和纹理掩蔽特性动态调整水印嵌入强度。
- 对比算法实现:提供基于分块DCT的扩频水印算法作为性能参照。
- 鲁棒性测试平台:内置自动化攻击模拟模块,支持高斯噪声、椒盐噪声、JPEG压缩、中值滤波及裁剪攻击。
- 多维性能评估:自动计算并输出峰值信噪比(PSNR)、结构相似性(SSIM)以及归一化相关系数(NC),量化评估图像质量与水印提取效果。
- 可视化展示:直观展示攻击后的图像、提取的水印图案、差值图以及JND阈值图。
系统要求
- MATLAB (推荐 R2016b 或更高版本)
- Image Processing Toolbox (图像处理工具箱)
使用方法
直接运行主脚本 main 即可启动系统。程序将按以下流程自动执行:
- 加载图像:尝试读取名为
cameraman.tif 的图像,若不存在则自动生成一幅合成灰度图像,并统一调整尺寸为 512x512。 - 水印生成:创建一个 64x64 大小的二值“方框”图案作为原始水印。
- 算法执行:分别执行DWT-JND嵌入和DCT扩频嵌入。
- 攻击与测试:对两种水印图像依次施加预设的攻击干扰。
- 结果输出:弹出图像窗口展示视觉效果,并在控制台打印详细的性能评估报表。
代码实现逻辑详解
主程序主要由以下几个核心步骤构成:
1. 初始化与数据准备
系统首先清理环境,加载或生成宿主图像并转为灰度图。同时构建一个中心带有镂空方框的 64x64 二值矩阵作为数字水印。
2. DWT-JND 水印嵌入
调用
dwt_jnd_embed 函数处理图像:
- 变换:对图像进行单层 Haar 小波变换,得到 LL, LH, HL, HH 子带。
- JND计算:利用子带系数计算视觉阈值,作为嵌入强度的权重。
- 序列化:将二维水印拉伸为一维向量,并映射为 {-1, 1} 的伪随机序列。
- 嵌入:在 HL(水平高频)子带中,按照随机选定的位置,结合计算出的 JND 阈值和全局强度因子(alpha=0.8)进行加性嵌入。
- 重构:执行逆小波变换得到含水印图像。
3. DCT 扩频水印嵌入 (对比组)
调用
dct_spread_embed 函数:
- 分块:将图像分为 8x8 的非重叠块。
- 变换:对每个块进行 DCT 变换。
- 嵌入:随机选择图像块,修改其中频系数(位置坐标 (5,5)),采用加性规则嵌入水印信息,强度系数设为 alpha=15。
- 重构:执行分块逆 DCT 变换。
4. 攻击模拟与提取评估
程序遍历预定义的攻击类型列表(无攻击、噪声、压缩、滤波、裁剪):
- 模拟攻击:对 DWT 和 DCT 处理后的图像施加不同程度的破坏。
- 水印提取:
*
DWT提取:采用
非盲提取策略(依赖原始图像)。计算攻击后图像与原图在 HL 子带的差值,通过判断差值的符号来还原水印比特。
*
DCT提取:采用
盲提取策略(不依赖原图)。通过检测中频系数值的正负符号来判决水印信息(假设原始系数均值接近0)。
- 指标计算:分别计算两组算法的 PSNR(图像保真度)、SSIM(结构相似度)和 NC(水印提取准确度)。
5. 结果可视化与报告
- 绘图:创建一个包含多子图的窗口,重点展示“无攻击”和“JPEG压缩”下的受攻击图像及对应的提取水印。特别地,在无攻击状态下,还会显示 DWT 嵌入造成的差值图和计算出的 JND 视觉阈值图。
- 终端输出:格式化打印表格,列出每种攻击下 DWT-JND 方案与 DCT 方案的 PSNR 和 NC 值对比。
关键算法实现细节
JND 模型计算 (compute_jnd_dwt)
该函数实现了基于小波域的视觉感知模型,通过以下两个特性合成最终的阈值:
- 亮度掩蔽 (Luminance Masking):利用 LL 子带(低频背景)估算局部亮度。使用分段线性函数模型,对于过暗或过亮的区域通过赋予较高的阈值权重(人眼对这些区域的噪声不敏感)。
- 纹理掩蔽 (Texture Masking):计算高频子带(LH, HL, HH)绝对值之和的局部标准差(3x3窗口),作为纹理复杂度的度量。纹理越复杂的区域,掩蔽效应越强,允许嵌入的强度越大。
- 阈值合成:将亮度掩蔽因子、纹理掩蔽因子和小波层级权重相乘,并进行归一化和幅度限制,防止嵌入过强导致明显失真。
水印同步与扩频
在嵌入过程中,为了增强安全性与抗干扰能力,代码中使用了
randperm 生成随机位置索引,并将二进制水印 {0, 1} 映射双极性序列 {-1, 1} 进行扩频处理。这要求提取端必须拥有相同的随机数种子或索引序列(Key)才能正确恢复水印。