顺序LSB算法:图像隐藏与信息嵌入实现

下载需积分: 10 | TXT格式 | 1KB | 更新于2024-09-11 | 137 浏览量 | 9 下载量 举报
收藏
顺序LSB(Least Significant Bit)算法是一种在图像隐写术中常用的信息隐藏技术,它利用了图像像素的最低有效位(LSB)来嵌入秘密数据。在提供的代码片段中,我们看到一个 MATLAB 函数 `lsbhide` 实现了这一过程。该函数接受三个参数:原始图像(cover),包含秘密信息的文本文件(如 'test.txt'),以及目标嵌入信息后的隐藏图像(result.bmp)。以下是对这段代码的知识点详细解释: 1. **图像读取与预处理**: - `cover = imread('G:\\v\\̿\\ѧϰ\\\\531452d055f46\\test.bmp')`:读取名为 'test.bmp' 的图像作为原始数据源。 - `ste_cover = cover;`:将原始图像赋值给 ste_cover,保留原始图像的格式。 - `ste_cover = double(ste_cover);`:将图像转换为双精度浮点数,便于后续处理。 2. **打开文本文件并读取数据**: - `f_id = fopen('G:\\v\\̿\\ѧϰ\\\\531452d055f46\\test.txt','r');`:打开文本文件,以二进制模式读取。 - `[msg, len_total] = fread(f_id, 'ubit1');`:读取文件中的二进制数据(ubit1 表示单个无符号二进制位),存储在 msg 变量中,并获取总位数 len_total。 3. **信息嵌入**: - `m, n = size(ste_cover);`:获取图像的行数和列数。 - 使用两个嵌套循环,遍历图像的每个像素: - `ste_cover(f1,f2) = ste_cover(f1,f2) - mod(ste_cover(f1,f2), 2) + msg(p,1);`:将当前像素的最低有效位替换为隐藏信息(msg(p,1)),同时保持整数范围。 - `p = p + 1;`:每次循环后,移动到下一个隐藏位。 - 当 `p == len_total` 时,表示所有隐藏信息已嵌入,跳出循环。 4. **处理溢出**: - 判断嵌入的长度是否超过图像像素总数,若超过则抛出错误,防止数据丢失或破坏图像完整性。 5. **转换回图像格式并保存**: - `ste_cover = uint8(ste_cover);`:将处理后的数据转换回原图像的整数范围(uint8),确保图像不失真。 - `imwrite(ste_cover, 'G:\\v\\̿\\ѧϰ\\\\531452d055f46\\result.bmp');`:将嵌入信息后的图像写入 'result.bmp' 文件。 - 最后,使用 `subplot` 函数展示原始图像(未隐藏信息)和隐藏信息后的图像,便于对比查看。 总结来说,这个顺序LSB算法通过逐个替换图像的最低有效位来实现信息隐藏,具有良好的隐藏效果和图像质量保持。这是一种简单的但实用的隐写方法,适用于对图像数据进行轻度保护和秘密通信。
身份认证 购VIP最低享 7 折!
30元优惠券

相关推荐

filetype
没有积分的私聊我 看到消息百分百发给你 1、算法核心: 1、读取图片A,获得其RGB三个通道数据并转换成三个矩阵a1,a2,a3。 2、读取文件B,将其转换成比特流b。 3、遍历b,得到比特b1,b2,b3,b4,b5,b6等等,将b1代替a1第一个元素的最低位,将b2代替a2第一个元素的最低位,将b3代替a3第一个元素的最低位,将b4代替a1第二个元素的最低位,以此类推。 2、具体实现: 1、隐写: 1、使用java ImageIO读取图片,获取其RGB通道信息。 2、使用java NIO读取被嵌入的文件,将其转换为byte数组,需要特别指出的是原生方法得到是byte类型的数组,但是算法实现需要更加精细的操作,所以还需要对得到的byte数组进行进一步的转换封装,将其转换成形如10101的数组。例如,读取文件得到byte数组的第一个元素为63,需将63转换为00111111数组。并且保存好文件的长度。 3、按照算法,遍历形如10101的数组 1、如果遍历到的值为0,将矩阵对应的矩阵元素与0xfe进行与运算,将最低位置为0 2、如果遍历到的值为1,将矩阵对应的矩阵元素与0x01进行或运算,将最低位置为1 4、将步骤3得到的经过经过隐写的矩阵写为一张新的图片。 3、读取 1、使用java ImageIO读取图片,获取其RGB通道信息。 2、使用隐写步骤3得到的文件长度,遍历图片的像素矩阵,需要特别指出的是因为后续步骤还需要进行进一步的转化,所以这一步是将得到的“100100......”序列每八位封装为一个数组,最终得到一些数组集合,每个数组包含八位二进制序列。 3、将步骤2得到的数组进行转换,例如00111111应该转换为byte类型数值为63的数字,10111111转换为-63。这一步会得到一个byte类型的数组。 4、将步骤3得到的byte类型数组写入文件,需要指出的是写入的文件形式应该和隐写模块步骤二中读入的文件形式一致。 3、程序使用方法 1、安装Java8 2、使用命令行进入jar文件所在目录下,使用命令 java -jar 2016115130.jar 3、安装提示输入嵌入和被嵌入的文件名字,注意路径问题
1100 浏览量