基于LSB算法的数字图像隐写系统
项目简介
本项目是一个基于MATLAB环境开发的数字图像隐写工具,采用空间域最低有效位(LSB, Least Significant Bit)替换算法。该系统能够在不破坏图像视觉质量的前提下,将文本秘密信息嵌入到数字图像的像素数据中,并能准确地从含密图像中提取出原始信息。
通过修改图像每个像素点二进制表示的最后一位(权重最小位)来携带信息,由于这种变化对图像颜色值的影响极其微小(+/- 1),人眼无法察觉原始图像与隐写图像之间的差异。项目不仅实现了嵌入和提取的核心功能,还提供了完善的图像质量评估指标(MSE与PSNR)及可视化的结果对比分析。
功能特性
- 信息隐藏(嵌入): 支持将自定义文本信息转换为二进制流,写入载体图像的LSB位中。
- 信息提取(恢复): 能够从隐写图像中自动读取数据长度并完整还原秘密文本信息。
- 自适应载体加载: 默认尝试读取内置标准测试图像,若文件不存在则自动生成随机噪声图像作为载体,保证程序健壮性。
- 容量自适应检查: 在嵌入前会自动计算图像的最大嵌入容量,若信息过长会终止操作以防止溢出。
- 质量评估体系:
* 计算均方误差(MSE):衡量原图与隐写图的数值差异。
* 计算峰值信噪比(PSNR):客观评估图像的失真程度,通常大于30dB表示肉眼难以察觉差异。
- 全方位可视化展示: 提供原图、隐写图、差值放大图(x50)以及RGB通道直方图对比。
系统要求
- 开发环境: MATLAB R2016a 或更高版本
- 工具箱支持: Image Processing Toolbox(用于图像读取与直方图计算)
- 文件依赖: 代码中默认使用 standard test image (peppers.png),如缺失可自动降级运行。
核心逻辑与实现细节
本程序的入口函数 main 严格按照以下流程执行,涵盖了隐写的完整生命周期:
1. 初始化与载体加载
程序启动后首先清理工作空间。尝试读取名为
peppers.png 的图像文件;如果该文件不存在,捕获异常并生成一个 512x512x3 的随即像素矩阵(uint8类型)作为替代载体。随后计算图像的尺寸(行、列、通道数)以确定最大可嵌入比特数。
2. 秘密信息预处理
待隐藏的秘密信息在代码中定义为一段包含英文、特殊字符及中文字符的字符串。
在转换为二进制流之前,算法会计算消息的字节长度,并将该长度值转换为一个
32位(4字节)的二进制头部信息。这意味着最终的嵌入数据流结构为:
[32位长度头] + [实际消息数据位]。这一机制确保了解码端能够精确知道何时停止读取。
程序会对比特流总长度和图像容量进行校验,若容量不足则抛出错误。
3. LSB 嵌入过程
程序调用嵌入算法,记录开始与结束时间以计算耗时。算法遍历图像像素,将二进制信息流中的每一位依次替换对应像素值的最低位。处理完成后,生成含密图像(Stego-image)。
4. 质量评估
程序调用评估函数,对比原始载体与含密图像:
- MSE计算: 统计所有对应像素点差值的平方和的均值。
- PSNR计算: 基于MSE计算峰值信噪比,数值越高代表图像质量越好(失真越小)。
5. LSB 提取过程
程序调用提取算法,同样记录耗时。提取过程分为两个阶段:
- 读取头部: 首先读取前32个像素的LSB,重组为十进制整数,获取后续消息的长度。
- 读取数据: 根据解析出的长度,继续读取后续相应数量的像素LSB,将其重组为字节并还原为字符串。
最后,程序会将提取出的字符串与原始字符串进行比对,输出验证结果(成功或失败)。
6. 结果可视化
程序创建一个包含四个子图的窗口进行展示:
- 子图1: 原始载体图像。
- 子图2: LSB隐写后的图像(标题显示最终PSNR值)。
- 子图3: 差异增强图。计算两图差值的绝对值,并乘以50倍亮度,使得微小的修改痕迹在视觉上可见(否则几乎全黑)。
- 子图4: 直方图对比。选取红色通道(R Channel),在同一坐标系下绘制原图与隐写图的像素分布曲线,直观展示修改前后统计特性的细微变化。
关键算法函数分析
代码通过以下辅助函数实现了模块化的功能逻辑:
prepareMessage (消息预处理)
该函数负责将字符串转换为适合嵌入的比特流。
- 首先将字符串转换为 uint8 数组。
- 关键步骤: 手动构建32位的长度头。通过位移操作(bitshift)和按位取值(bitget),将消息长度这个整数拆解为32个二进制位。
- 随后,对消息内容的每个字节进行按位拆解,最终拼接成完整的二进制序列
[Length_Header, Body_Bits]。
embedLSB (嵌入核心)
该函数实现了核心的替换逻辑。
- 利用MATLAB的列优先存储特性,视图像为一维数组进行线性遍历。
- 对于每一个待嵌入的比特,使用
bitset 函数直接修改当前像素值的第1位(LSB)。 - 该方法避免了复杂的位运算手动实现,效率较高且代码简洁。
extractLSB (提取核心)
该函数实现了具有自适应长度感知的数据恢复。
- 阶段一: 循环32次,提取前32个像素的LSB,通过
val * 2 + bit 的迭代表达式还原出消息长度 msgLen。 - 安全检查: 若解析出的长度异常(如小于等于0或超过图像总容量),则判定提取失败并终止,防止程序崩溃。
- 阶段二: 根据
msgLen * 8 确定剩余需要读取的位数,提取比特流。 - 重组: 每8个比特一组,通过移位累加还原为字节(uint8),最后转换为字符数组(char)。
evaluateQuality (质量评价)
该函数实现了标准的图像处理评价公式。
- 将图像数据转换为 double 类型以保证计算精度。
- 计算公式严谨遵循 MSE 定义及 PSNR 的对数公式,并处理了 MSE 为 0(完全无失真)的边界情况,避免除以零错误。
使用方法
- 确保MATLAB环境已安装。
- 将包含
main 函数及辅助函数的脚本文件保存在工作目录。 - (可选)在同目录下放置一张名为
peppers.png 的图片作为载体;若不放,程序将使用随机噪声图演示。 - 在MATLAB命令行窗口输入
main 并回车运行。 - 观察命令行输出的嵌入提取耗时、MSE/PSNR指标及验证结果,并查看弹出的可视化结果窗口。