基于MATLAB的改进LSB图像信息隐藏与提取系统
项目简介
本项目是一个基于MATLAB开发环境的数字图像隐写系统。通过实现改进的最低有效位(Least Significant Bit, LSB)算法,能够在不引起人眼可察觉变化的前提下,将文本信息(支持中英文混合)安全地潜入到数字图像中。系统不仅实现了信息的嵌入与精确提取,还内置了完整的图像质量评估模块,通过计算峰值信噪比(PSNR)和直方图对比来验证算法的隐蔽性和鲁棒性。
功能特性
- 高隐蔽性信息嵌入:利用图像像素的最低有效位携带秘密信息,生成的含密图像在视觉上与原图几乎无异。
- 自适应载体加载机制:程序优先读取本地标准测试图像(如Lena图),若未找到文件,则自动调用MATLAB内置图像(如peppers.png)作为替代,增强了代码的运行稳定性。
- 中英文混合编码支持:采用16位二进制编码方案处理字符串,能够完美兼容中文和英文字符,解决了传统8位编码产生乱码的问题。
- 智能数据协议封装:在嵌入有效载荷前,系统会自动在头部添加32位(4字节)的数据长度标识,确保提取端能够精确识别信息结束位置,无需人工干预。
- 全方位质量评估:
* 计算均方误差(MSE)和峰值信噪比(PSNR)。
* 提供像素级的差异图像显示(经过亮度增强处理)。
* 绘制嵌入前后红色通道(R Channel)的直方图对比。
- 端到端验证:自动比对原始信息与提取信息,并在控制台输出一致性验证结果。
系统要求
- MATLAB R2016a 或更高版本。
- 安装 Image Processing Toolbox(图像处理工具箱)。
- 建议操作系统:Windows, macOS, 或 Linux。
使用方法
- 确保MATLAB当前工作路径包含项目文件。
- 直接运行主函数
main。 - 系统将自动执行以下流程:加载图像 -> 编码信息 -> 嵌入信息 -> 计算质量指标 -> 提取信息 -> 验证结果。
- 运行结束后,MATLAB控制台将输出详细的统计数据,并弹出一个综合展示窗口,包含原图、含密图、差分图及直方图对比。
详细功能实现与逻辑分析
本项目的主程序 main.m 严格按照以下逻辑流程实现了完整的信息隐藏与提取闭环:
1. 载体图像与参数配置
系统首先定义了待隐藏的秘密信息(包含中文字符、标点及英文)。在加载图像阶段,采用
try-catch 结构增强健壮性:优先寻找
lena.png,若文件缺失则自动降级使用内置的
peppers.png。随后获取图像的行、列及通道数,为后续容量计算做准备。
2. 信息预处理与协议封装
为了确保信息提取的准确性,系统未直接嵌入数据,而是设计了一个简单的通信协议:
- 头部(Header):计算二进制流的总长度,将其转换为固定的 32位二进制序列。
- 数据体(Body):将文本信息转换为二进制流。
- 组合:将头部置于数据体之前,形成最终的待嵌入比特流。
此步骤还包含容量检测,若图像像素总数小于比特流长度,系统将抛出错误并终止运行。
3. LSB 嵌入核心算法
嵌入过程采用线性索引方式提高效率:
- 系统将三维图像矩阵(行×列×通道)转换为一维向量。
- 利用MATLAB的
bitset 函数,遍历比特流,依次修改图像像素数据的 第1位(最低位)。 - 完成嵌入后,将一维向量重塑回原始的三维图像结构,生成含密图像。
4. 图像质量评估
系统采用客观评价指标量化算法性能:
- MSE计算:计算原图与含密图所有像素差值的平方均值。
- PSNR计算:基于MSE计算峰值信噪比,数值越大代表失真越小。通常PSNR大于30dB人眼即难以察觉差异。
5. 信息盲提取算法
提取过程完全是嵌入过程的逆操作,且具有“盲提取”特性(不需要原图):
- 将含密图像扁平化。
- 解析头部:优先读取前32个像素的最低位,解码得到消息长度
N。 - 读取数据:根据长度
N,从第33个像素开始,连续读取 N 个像素的最低位。 - 流重组:将提取的比特流交由解码函数还原为原始字符串。
6. 结果验证与可视化
程序最后通过图形化界面展示实验结果:
- 控制台:打印PSNR值、最大容量、实际嵌入长度及提取内容的文本对比。
- 绘图窗口:
* 子图1:原始载体图像。
* 子图2:含密图像(标题附带PSNR值)。
* 子图3:差异图像。由于LSB修改引起的灰度变化极小(仅为0或1),系统将差异值乘以255进行亮度增强,使用户能直观看到被修改的区域。
* 子图4:直方图对比。选取R通道,在同一坐标系下绘制原图与含密图的灰度直方图,直观展示像素分布的微小变化。
关键辅助函数分析
str2bin_stream (字符串转二进制流)
该函数负责将文本信息转换为可嵌入的二进制格式。为了支持中文,函数首先将字符串转换为 uint16 格式(Unicode编码),然后将每个字符转换为16位的二进制字符串,最后重塑为一维的数值数组(0和1)。这种16位编码方式比通常的8位ASCII编码兼容性更强。
bin_stream2str (二进制流转字符串)
该函数执行逆向解码。它首先检查输入比特流的长度是否为16的倍数,确保数据对齐。随后将比特流每16位分为一组,转换为十进制数值,最后通过 char 函数将其还原为对应的Unicode字符。