基于LSB算法的数字图像水印嵌入与提取系统
项目简介
本项目实现了一个基于最低有效位(Least Significant Bit, LSB)空间域算法的数字图像水印系统。该系统利用人眼对图像颜色和亮度细微变化不敏感的特性,将二值水印图像隐藏在载体图像的像素最低位中。
项目采用MATLAB编写,是一个完整的端到端演示系统。它不依赖外部图片文件,而是通过代码自动生成合成载体图像和水印图案,实现了从数据生成、水印嵌入、质量评估、模拟攻击到最终水印提取与可视化的全流程。本系统重点演示了信息隐藏的基本原理及其在不同类型的图像攻击(噪声、剪切、旋转)下的脆弱性特征。
主要功能特性
- 全自动数据生成:程序运行时自动生成高质量的伪彩色RGB载体图像和包含几何形状的二值水印图像,无需额外配置测试素材。
- LSB盲水印嵌入:采用LSB替换算法,将水印信息直接嵌入到载体图像的蓝色(B)通道中,实现了高不可见性的信息隐藏。
- 图像质量评估:集成峰值信噪比(PSNR)计算功能,用于客观量化含水印图像与原始图像之间的差异,评估嵌入的隐蔽性。
- 提取准确率分析:使用归一化相关系数(NC)作为评价指标,精确计算提取出的水印与原始水印的相似度。
- 鲁棒性测试平台:内置多种常见的图像攻击手段模拟,直观展示LSB算法在面对信号处理时的表现。
- 综合可视化展示:通过单一窗口展示嵌入前后对比、攻击效果以及各种条件下提取出的水印结果,便于直观分析。
系统要求
- 开发环境:MATLAB
- 工具箱依赖:Image Processing Toolbox(用于图像处理、噪声添加、旋转等操作)
使用方法
- 启动MATLAB环境。
- 将包含主要逻辑的脚本文件(通常命名为
main.m)设置在当前工作路径下。 - 在命令行窗口输入主函数名称运行。
- 程序执行后将清除当前环境变量,开始计算并在几秒钟内弹出一个包含12张子图的综合结果窗口。
- 控制台窗口会输出嵌入后的PSNR值以及无攻击情况下的NC提取值。
详细实现逻辑与算法分析
该系统的核心逻辑完全包含在主入口函数中,具体实现流程如下:
1. 数据准备与预处理
- 载体图像:使用MATLAB内置的
peaks(512) 函数生成512x512的矩阵,经过归一化和映射(jet 色图),转换为RGB格式的 uint8 图像。这种方式保证了每次运行都有标准的测试图像。 - 水印图像:程序通过逻辑运算创建一个与载体尺寸相同的二值矩阵(
logical),在中心绘制矩形框和十字交叉条纹,作为待隐藏的数字版权标识。
2. 水印嵌入阶段
- 通道选择:算法特意选择在RGB图像的 蓝色(Blue)通道 进行操作,因为人眼对蓝色分量的敏感度低于红色和绿色分量,在此通道修改对视觉影响最小。
- 位平面替换:利用
bitset 函数,将载体图像蓝色通道像素值的第1位(最低有效位)强制替换为水印图像对应的二进制值(0或1)。 - 质量计算:嵌入完成后,程序立即计算含水印图像与原图的均方误差(MSE),进而求得峰值信噪比(PSNR)。PSNR值越高,代表嵌入造成的失真越小,肉眼越难察觉。
3. 水印提取阶段
- 盲提取:提取过程不需要原始载体图像,只需读取含水印图像蓝色通道的第1位数据(使用
bitget 函数),即可重构出水印。 - 相关性分析:通过自定义的
cal_nc 辅助函数,计算提取出的水印与原始水印的归一化相关系数(NC)。NC值为1表示完全一致,0表示完全不相关。
4. 攻击模拟与鲁棒性分析
代码中专门设计了模块来测试LSB算法在四种典型攻击下的表现:
- 椒盐噪声攻击:添加密度为0.02的椒盐噪声。结果显示,噪点位置的像素值被改变,直接导致对应位置的LSB翻转,提取出的水印呈现散点状破损。
- 高斯噪声攻击:添加均值为0、方差为0.001的高斯噪声。由于高斯噪声会引起像素值的微小波动,每一处的微小加减都可能导致最低位发生变化(例如偶数变奇数),因此提取出的水印会有大量噪点。
- 几何剪切攻击:将图像左上角150x150区域像素值置零。测试表明,LSB算法具有空间局部性,剪切区域的水印完全丢失,但未受损区域的水印依然可以完美提取。
- 旋转攻击:将图像旋转5度并保持原尺寸裁剪(
bilinear双线性插值)。这是对LSB算法破坏性最大的攻击。由于旋转涉及像素插值计算,新的像素值是周围像素的加权平均,这彻底破坏了原有的二进制位平面结构,导致提取出的水印通常呈现为随机噪声,信息完全丢失。
5. 结果可视化
程序最后通过
subplot 构建了一个 3行 x 4列 的绘图网格:
- 第一行:展示原始载体、原始水印、嵌入后图像及无攻击提取结果,验证算法的基本有效性。
- 第二行:展示经过上述四种攻击处理后的受损图像。
- 第三行:展示从受损图像中提取出的水印,并在标题中显示对应的NC值,下方附带简短的分析文本,解释造成该结果的原因。
辅助函数说明
- cal_nc:一个内部子函数,用于输入两个矩阵(原始水印和提取水印),通过点乘和模长计算公式输出它们的归一化相关系数,作为衡量提取质量的客观标准。