前一篇博客中介绍了利用LSB算法隐藏文字信息的MATLAB实现:
http://blog.csdn.net/csdn_moming/article/details/50936687
在此基础上,下面介绍利用LSB算法隐藏图片信息的MATLAB实现。


补充说明

  1. 图片数据量较大,一个1920×10801920×1080
    的图片就有 2073600 个RGB值需要储存
  2. 依旧利用之前改进的算法,对 8-bitRGB 值增加一位以便于储存和作为结束标记(实验表明,对多个字符串进行 strcat 会影响速度,这是一个缺陷,也许有更高效的实现方法)
  3. 提取出来的图片矩阵为double型,一定要转化为 uint8 型保存才能正常显示出来
  4. 为了把图片的分辨率隐藏进去以便于恢复,先计算出该图片分辨率值转为二进制后的长度,把长度信息隐藏在图片的最后一个像素点内(只要图片分辨率最大值不超过 29992999
    就能存下),然后将分辨率值储存在最后几个像素点中,最后按照以前的方法从第一个像素点开始储存图片RGB信息

代码

GitHub:https://github.com/kemingy/Cryptography/tree/master/LSB%20steganography/LSBforPicture

嵌入算法

function [] = LSB_embed(host, data)
% [] = LSB_embed(host, data)
% host: the host picture's path and name
% data: the data picture's path and name
% LSB in steganography (embed)
%
% Author: Moming
% 2016-03-21lsb = 3;
host_image = imread(host);
data_image = imread(data);len = length(dec2bin(max(size(data_image))));
len = dec2bin(len, 9);  % the length of max(height, width) < 2^999
image_info = dec2bin(size(data_image));
info = strjoin(cellstr(image_info)', '');info_len = length(info) / lsb;% is host picture big enough?
if numel(data_image) * 3 + info_len + 1 > numel(host_image)warning('The host picture is too small to hide the data picture!');return;
endmsg_bin = dec2bin(data_image, 8);  % convert to binary
msg = blanks(9);
for i = 1 : size(msg_bin, 1)msg(i, :) = strcat(msg_bin(i, :), char(mod(i, 2) + '0'));
end
msg = strjoin(cellstr(msg)', '');
% change the last bit as the data end tag
msg(end) = char(mod(size(msg_bin, 1) + 1, 2) + '0');  tmp_len = blanks(3);
for i = 1 : 3% convert to decimal (len)tmp_len(i) = char(bin2dec(len((i - 1) * lsb + 1 : i * lsb)) + '0');
endtmp_info = blanks(info_len);
for i = 1 : info_len% convert to decimal (info)tmp_info(i) = char(bin2dec(info((i - 1) * lsb + 1 : i * lsb)) + '0');
enddata_len = length(msg) / lsb;
tmp_data = blanks(data_len);
for i = 1 : data_len% convert to decimal (data)tmp_data(i) = char(bin2dec(msg((i - 1) * lsb + 1 : i * lsb)) + '0');
endresult = host_image;
rgb = 1;
[len_R, len_G, len_B] = size(result);% hide len
for i = 1 : 3result(len_R, len_G, i) = result(len_R, len_G, i) - ...mod(result(len_R, len_G, i), 2^lsb) + double(tmp_len(i) - '0');
end% hide info
for R = len_R : -1 : 1for G = len_G : -1 : 1if R == len_R && G == len_Gcontinue;endfor B = len_B : -1 : 1if rgb <= info_lenresult(R, G, B) = result(R, G, B) - mod(result(R, G, B),...2^lsb) + double(tmp_info(rgb) - '0');rgb = rgb + 1;endendend
end% hide data
rgb = 1;
for R = 1 : len_Rfor G = 1 : len_Gfor B = 1 : len_Bif rgb <= data_len% only to be consistent with front: '0'result(R, G, B) = result(R, G, B) - mod(result(R, G, B),...2^lsb) + double(tmp_data(rgb) - '0');rgb = rgb + 1;endendend
endimshow(result);
imwrite(result, 'result.png');  % do not use jpgend

提取算法

function [] = LSB_extract(name)
% LSB_extract(name)
% name: the picture's path and name
% LSB in steganography (extract)
%
% Author: Moming
% 2016-03-21image = imread(name);lsb = 3;
[len_R, len_G, len_B] = size(image);
flag = char('0');tmp_len = blanks(3);
for i = 1 : 3tmp_len = strcat(tmp_len, mod(image(len_R, len_G, i), 2^lsb) + '0');
end
len = sum(bin2dec(strjoin(cellstr(dec2bin(tmp_len - '0', 3))', '')));% get the size of hide picture
index = 1;
tmp_info = blanks(len);
for R = len_R : -1 : 1if index > lenbreak;endfor G = len_G : -1 : 1if index > lenbreak;endif R == len_R && G == len_Gcontinue;endfor B = len_B : -1 : 1if index > lenbreak;endtmp_info(index) = mod(image(R, G, B), 2^lsb) + '0';index = index + 1;endend
end
cmd = strjoin(cellstr(dec2bin(tmp_info - '0'))', '');
image_size = zeros(1, 3);
for i = 1 : 3image_size(i) = bin2dec(cmd((i - 1) * len + 1 : i * len));
end% get the hide picture
index = 1;
picture = zeros(image_size);
for R = 1 : len_Rfor G = 1 : len_Gtmp = blanks(0);for B = 1 : len_B% '0' is useful!!! Placeholder...tmp = strcat(tmp, mod(image(R, G, B), 2^lsb) + '0'); endtmp_bin = dec2bin(tmp - '0', 3)';picture(index) = bin2dec(tmp_bin(1 : 8));if flag + tmp_bin(9) ~= 97  % '0'/'1' is the end tag% recover the picturepicture = uint8(picture);  % !!! very important !!!imwrite(picture, 'recover.png');imshow(picture);return;endindex = index + 1;flag = tmp_bin(9);end
endend

利用LSB算法隐藏图片信息的MATLAB实现相关推荐

  1. 利用MATLAB实现WAV音频的LSB信息隐藏

    0. 背景 音频信息隐藏技术就是将秘密数据直接嵌入音频载体中,但不影响原载体的使用价值,也不容易被人的知觉系统觉察或注意到. 音频信息隐藏技术作为信息隐藏技术的一个重要分支,受到越来越多的关注. 近年 ...

  2. LSB图像信息隐藏算法matlab,实验二LSB信息隐藏实验.doc

    实验二LSB信息隐藏实验.doc 实验二LSB信息隐藏实验 综合评分: [实验目的]: 掌握MATLAB基木操作 实现LSB信息隐藏和提取 [实验内容]:(请将你实验完成的项11涂"■&qu ...

  3. ML之RF:基于Matlab利用RF算法实现根据乳腺肿瘤特征向量高精度(better)预测肿瘤的是恶性还是良性

    ML之RF:基于Matlab利用RF算法实现根据乳腺肿瘤特征向量高精度(better)预测肿瘤的是恶性还是良性 目录 输出结果 实现代码 输出结果 更新-- 实现代码 %RF:RF实现根据乳腺肿瘤特征 ...

  4. matlab切割肿瘤算法,ML之RF:基于Matlab利用RF算法实现根据乳腺肿瘤特征向量高精度(better)预测肿瘤的是恶性还是良性...

    ML之RF:基于Matlab利用RF算法实现根据乳腺肿瘤特征向量高精度(better)预测肿瘤的是恶性还是良性 目录 输出结果 实现代码 输出结果 更新-- 实现代码 %RF:RF实现根据乳腺肿瘤特征 ...

  5. MATLAB LSB图像信息隐藏 最低位平面验证 以及PSNR SSIM评价

    ​ 一.算法原理 1.位平面定义 定义:对于一幅用多个比特表示其灰度值的图像来说,其中的每个比特可看作表示了一个二值的平面,也称为图像的位平面. 2. LSB算法介绍 LSB是Least Singif ...

  6. DL之CNN可视化:利用SimpleConvNet算法【3层,im2col优化】基于mnist数据集训练并对卷积层输出进行可视化

    DL之CNN可视化:利用SimpleConvNet算法[3层,im2col优化]基于mnist数据集训练并对卷积层输出进行可视化 导读 利用SimpleConvNet算法基于mnist数据集训练并对卷 ...

  7. Algorithm之PrA:PrA之nLP非线性规划算法经典案例剖析+Matlab编程实现

    Algorithm之PrA:PrA之nLP整数规划算法经典案例剖析+Matlab编程实现 目录 有约束非线性规划案例分析 1.投资决策问题 2.利用Matlab实现求解下列非线性规划​ 无约束极值问题 ...

  8. 神经进化算法——利用NEAT算法解决迷宫导航问题(基于NEAT-Python)

    神经进化算法--利用NEAT算法解决迷宫导航问题(基于NEAT-Python) 迷宫导航问题 迷宫环境模拟 迷宫导航智能体 迷宫环境实现 传感器数据生成 导航智能体 智能体位置更新 智能体记录存储 智 ...

  9. LSB图像信息隐藏(实现及分析)

    一.LSB图像信息隐藏(python实现) 1.实验目的 将信息图片存入载体图片,并从载体图片中提取出信息图片.具体操作为将信息图片的信息写入载体图片的最低位层(载体图片至少应为信息图片8倍). 2. ...

  10. Algorithm之PrA:PrA之IP整数规划(包括0-1整数规划)算法经典案例剖析+Matlab编程实现

    Algorithm之PrA:PrA之IP整数规划算法经典案例剖析+Matlab编程实现 目录 分枝定界法 整数规划例题 0-1整数规划实例 分枝定界法 对有约束条件的最优化问题(其可行解为有限数)的所 ...

最新文章

  1. java基础知识总结1
  2. 安卓4.4.4安装哪个微信版本_微信一个开关,速度立马提升一倍
  3. VS2010实现opencv基于DCT的图像压缩
  4. Geoffrey Hinton那篇备受关注的Capsule论文
  5. android activity 被notification启动,Android通知Notification全面剖析
  6. php 百度收录api_帝国cms百度普通收录资源提交API推送php实例方法
  7. LOJ 2339 「WC2018」通道——边分治+虚树
  8. java keytool用法,java中Keytool的使用总结
  9. Latex 的基本语法
  10. mapper扫描问题(Invalid bound statement (not found))
  11. 档案管理学川大972 | 档案信息资源开发与利用
  12. 《编译原理》求短语,直接短语,句柄,素短语,最左素短语 - 例题解析
  13. Python新手引导 第三篇-Python基础和字符编码
  14. js获取系统当前时间,实现钟表功能
  15. 网络创业者莱恩-福克斯:最后一分钟的奇迹
  16. python参考书推荐--父与子的编程之旅
  17. error: need 'typename' before '.......'的解决方法
  18. html图片中绝对定位,CSS中绝对定位
  19. Android 调用系统中的相机应用及静默拍照
  20. Appium+python+夜神模拟器微信公众号 记录第一次写用例所踩的坑

热门文章

  1. python实现excel单元格合并_Python_pandas实现excel工作表合并功能
  2. java间接调用_无法解析类型 java.util.Map$Entry。从必需的 .class 文件间接引用了它...
  3. python和前端哪个好_web前端和python学哪个出来工资高?
  4. html页面布局主要有哪些形式,HTML页面布局形式与原则
  5. 我过去1个月的上课总结
  6. 奥数题-求空间4点构成的四面体体积
  7. 如何看懂财务报表:(一)如何下载财报
  8. 荐书 | 9本心理治疗书籍推荐
  9. 用计算机求平方根立方根,利用计算器求平方根、立方根
  10. C语言经典问题11-牛顿法求一个数的平方根函数