今天分享一下最近看到的一个图片嵌入隐藏的算法。

这是一种基于空间域的自适应多平面位的信息隐藏算法。该算法计算复杂度低、信息隐藏量大。且有实验表明在不影响图像视觉效果的前提下,其信息隐藏量比LSB算法大,并具有更高的安全性。该算法的主要思想是对每个像素点进行判断,根据HVS的特性,在最高非0有效位后的指定位(y)开始嵌入隐藏信息,嵌入到另一个指定位(z)为止。

下面直接贴上MATLAB代码和实验结果:

%下面是主函数main_ImgEmbed.m
clc;
clear all;
close all;
warning off all;yr=4;
yg=5;
yb=3;Img=imread('介质图片.jpg');
figure;imshow(Img,[]);title('介质图片');Img=double(Img);
ImgR=Img(:,:,1);
ImgG=Img(:,:,2);
ImgB=Img(:,:,3);Imgmark=imread('待嵌入图片_gray.jpg');
Imgmark=double(Imgmark);
figure;imshow(Imgmark,[]);title('待嵌入图片_gray');
[markm,markn]=size(Imgmark);
Imgmarkline = Imgmark(:); %二维数组转成一列Imgmarklinebin=zeros(markm*markn*8,1); %转化为二进制
for ii=1:markm*markn[Imgmarklinebin(8*ii-7),Imgmarklinebin(8*ii-6),Imgmarklinebin(8*ii-5),Imgmarklinebin(8*ii-4),Imgmarklinebin(8*ii-3),...Imgmarklinebin(8*ii-2),Imgmarklinebin(8*ii-1),Imgmarklinebin(8*ii)]=Find8bits(Imgmarkline(ii));
end%%
%嵌入
%对于红色通道
embedNumsed=0;%已嵌入个数
[M,N,Z]=size(Img);
y=zeros(8,1);
flag=0; %辅助跳出的标志ImgRline=ImgR(:); %转换为一列
ImgRlineNew=ImgRline; %嵌入后
for ii=1:M*Nif flag==1; %跳出外层循环break;end[y(8),y(7),y(6),y(5),y(4),y(3),y(2),y(1)]=Find8bits(ImgRline(ii));   posNzreo=FindNotZero(y(8),y(7),y(6),y(5),y(4),y(3),y(2),y(1));embedNums=posNzreo-yr; %能嵌入的个数if  embedNums>0 %符合嵌入条件for jj=1:embedNumsembedNumsed=embedNumsed+1; %已嵌入个数if embedNumsed>markm*markn*8 %嵌入完成flag=1; %设置标识,使外层循环也跳出break;end y(jj)=Imgmarklinebin(embedNumsed);%嵌入end  end  ImgRlineNew(ii)=bin2dec_trans(y(8),y(7),y(6),y(5),y(4),y(3),y(2),y(1));%嵌入后的
end
ImgR2=reshape(ImgRlineNew,[M,N]);%对于G通道
ImgGline=ImgG(:); %转换为一列
ImgGlineNew=ImgGline; %嵌入后
for ii=1:M*Nif flag==1; %跳出外层循环break;end[y(8),y(7),y(6),y(5),y(4),y(3),y(2),y(1)]=Find8bits(ImgGline(ii));   posNzreo=FindNotZero(y(8),y(7),y(6),y(5),y(4),y(3),y(2),y(1));embedNums=posNzreo-yg; %能嵌入的个数if  embedNums>0 %符合嵌入条件for jj=1:embedNumsembedNumsed=embedNumsed+1; %已嵌入个数if embedNumsed>markm*markn*8 %嵌入完成flag=1; %设置标识,使外层循环也跳出break;end y(jj)=Imgmarklinebin(embedNumsed);%嵌入 end  end  ImgGlineNew(ii)=bin2dec_trans(y(8),y(7),y(6),y(5),y(4),y(3),y(2),y(1));%嵌入后的
end
ImgG2=reshape(ImgGlineNew,[M,N]);%对于B通道
ImgBline=ImgB(:); %转换为一列
ImgBlineNew=ImgBline; %嵌入后
for ii=1:M*Nif flag==1; %跳出外层循环break;end[y(8),y(7),y(6),y(5),y(4),y(3),y(2),y(1)]=Find8bits(ImgBline(ii));   posNzreo=FindNotZero(y(8),y(7),y(6),y(5),y(4),y(3),y(2),y(1));embedNums=posNzreo-yb; %能嵌入的个数if  embedNums>0 %符合嵌入条件for jj=1:embedNumsembedNumsed=embedNumsed+1; %已嵌入个数if embedNumsed>markm*markn*8 %嵌入完成flag=1; %设置标识,使外层循环也跳出break;end y(jj)=Imgmarklinebin(embedNumsed);%嵌入 end  end  ImgBlineNew(ii)=bin2dec_trans(y(8),y(7),y(6),y(5),y(4),y(3),y(2),y(1));%嵌入后的
end
ImgB2=reshape(ImgBlineNew,[M,N]);ImgNew=zeros(M,N,Z);
ImgNew(:,:,1)=ImgR2;
ImgNew(:,:,2)=ImgG2;
ImgNew(:,:,3)=ImgB2;figure;imshow(uint8(ImgNew),[]);title('嵌入后的RGB图');
imwrite(uint8(ImgNew),'介质图片_嵌入图像后.jpg'); %保存图片%%
%提取嵌入图像
flag=0;
Imgmark_extractlinebin=zeros(markm*markn*8,1);
extractNumsed=0;%已提取个数% R通道
ImgRline2=ImgR2(:); %转换为一列
for ii=1:M*Nif flag==1; %跳出外层循环break;end[y(8),y(7),y(6),y(5),y(4),y(3),y(2),y(1)]=Find8bits(ImgRline2(ii));   posNzreo=FindNotZero(y(8),y(7),y(6),y(5),y(4),y(3),y(2),y(1));embedNums=posNzreo-yr; %已嵌入的个数if  embedNums>0 %符合嵌入条件for jj=1:embedNumsextractNumsed=extractNumsed+1; %已提取个数if extractNumsed>markm*markn*8 %提取完成flag=1; %设置标识,使外层循环也跳出break;end Imgmark_extractlinebin(extractNumsed)=y(jj);%提取end  end
end% G通道
ImgGline2=ImgG2(:); %转换为一列
for ii=1:M*Nif flag==1; %跳出外层循环break;end[y(8),y(7),y(6),y(5),y(4),y(3),y(2),y(1)]=Find8bits(ImgGline2(ii));   posNzreo=FindNotZero(y(8),y(7),y(6),y(5),y(4),y(3),y(2),y(1));embedNums=posNzreo-yg; %已嵌入的个数if  embedNums>0 %符合嵌入条件for jj=1:embedNumsextractNumsed=extractNumsed+1; %已提取个数if extractNumsed>markm*markn*8 %提取完成flag=1; %设置标识,使外层循环也跳出break;end Imgmark_extractlinebin(extractNumsed)=y(jj);%提取end  end
end% G通道
ImgBline2=ImgB2(:); %转换为一列
for ii=1:M*Nif flag==1; %跳出外层循环break;end[y(8),y(7),y(6),y(5),y(4),y(3),y(2),y(1)]=Find8bits(ImgBline2(ii));   posNzreo=FindNotZero(y(8),y(7),y(6),y(5),y(4),y(3),y(2),y(1));embedNums=posNzreo-yb; %已嵌入的个数if  embedNums>0 %符合嵌入条件for jj=1:embedNumsextractNumsed=extractNumsed+1; %已提取个数if extractNumsed>markm*markn*8 %提取完成flag=1; %设置标识,使外层循环也跳出break;end Imgmark_extractlinebin(extractNumsed)=y(jj);%提取end  end
end%二进制转十进制
Imgmarklinedec=zeros(markm*markn,1); %转化为十进制
for ii=1:markm*markn Imgmarklinedec(ii)=bin2dec_trans(Imgmark_extractlinebin(8*ii-7),Imgmark_extractlinebin(8*ii-6),Imgmark_extractlinebin(8*ii-5),Imgmark_extractlinebin(8*ii-4),...Imgmark_extractlinebin(8*ii-3),Imgmark_extractlinebin(8*ii-2),Imgmark_extractlinebin(8*ii-1),Imgmark_extractlinebin(8*ii));
end
Imgmarkextract=reshape(Imgmarklinedec,[markm,markn]);
figure;imshow(Imgmarkextract,[]);title('提取的水印');
imwrite(uint8(Imgmarkextract),'待嵌入图片_gray_提取结果.jpg'); %保存图片%检查提取的水印和原水印的区别
difmarked=Imgmarkextract-Imgmark; %做差
%发现差为0,即说明完全一致,提取正确

3个子函数:

(1)

%bin2dec_trans.m
%二进制转十进制
function Data=bin2dec_trans(y7,y6,y5,y4,y3,y2,y1,y0)Data=y7*128+y6*64+y5*32+y4*16+y3*8+y2*4+y1*2+y0;
end

(2)

% Find8bits.m
function [y7,y6,y5,y4,y3,y2,y1,y0]=Find8bits(Data)
y0=mod(Data,2);
y7=fix(Data/128);Data=Data-y7*128;
y6=fix(Data/64); Data=Data-y6*64;
y5=fix(Data/32); Data=Data-y5*32;
y4=fix(Data/16); Data=Data-y4*16;
y3=fix(Data/8);  Data=Data-y3*8;
y2=fix(Data/4);  Data=Data-y2*4;
y1=fix(Data/2);  Data=Data-y1*2;
end

(3)

%FindNotZero.m
%找出第一个不为零的数位 从最高位(第八位)开始
function posNzreo=FindNotZero(y7,y6,y5,y4,y3,y2,y1,y0)
if y7~=0      posNzreo=8;
elseif y6~=0  posNzreo=7;
elseif y5~=0  posNzreo=6;
elseif y4~=0  posNzreo=5;
elseif y3~=0  posNzreo=4;
elseif y2~=0  posNzreo=3;
elseif y1~=0  posNzreo=2;
else          posNzreo=1;
end
end

结果如图所示:

(原图)

(待嵌入的图像)

代码下载请到:http://download.csdn.net/download/tianma5/9508467

欢迎一起交流。

图片嵌入隐藏-大容量的信息隐藏算法相关推荐

  1. 信息隐藏——二值图像的信息隐藏

    二值图像的信息隐藏 [实验目的]: 使用一个特定图像区域中黑像素的个数来编码秘密信息. 若某块P1 (Bi)>50%,则嵌入一个1,若P0 (Bi)>50%,则嵌入一个0. 在嵌入过程中, ...

  2. 文件隐藏服务器版本信息,隐藏版本信息

    隐藏版本信息 内容精选 换一换 PG_EXTENSION_DATA_SOURCE系统表存储外部数据源对象的信息.一个外部数据源对象(Data Source)包含了外部数据库的一些口令编码等信息,主要配 ...

  3. 文件隐藏服务器版本信息,隐藏Tengine的版本信息

    [AI]蒙特卡洛搜索树 http://jeffbradberry.com/posts/2015/09/intro-to-monte-carlo-tree-search/ 蒙特卡洛方法与随机优化: ht ...

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

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

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

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

  6. Matlab-LSB信息隐藏实验

    一.实验内容 实验完成形式:  用MATLAB函数实现LSB信息隐藏和提取 实验选择载体:  512×512灰度图像 实验效果和分析:  1.完成基本的LSB信息隐藏及提取 2.能随机选择嵌入位进行信 ...

  7. 变换域信息隐藏--DCT

    思想提出背景–空间域隐藏 空间域隐藏是基于位图分解的思想产生的,其主要方法是将秘密信息存储到载体不那么重要的部分中,这样即使改变了载体的部分信息后,载体从肉眼来看也不会有太大区别.这种隐藏方法的优点是 ...

  8. 信息隐藏原理与技术复习

    信息隐藏原理与技术 第一章 1.密码发展的三个阶段 第一阶段:古典密码,是从古代到1949年,1949年以前的密码技术可以说是一种艺术,而不是一种科学,那时的密 码专家是凭直觉和信念来进行密码设计和分 ...

  9. 信息安全技术——(五)信息隐藏技术

    文章目录 1.信息隐藏的基本概念 1.1概念 1.2信息隐藏的基本模型 1.3水印攻击和隐写分析的步骤 2.隐藏和提取信息的基本方法 2.1隐藏信息的基本方法 3.鲁棒水印.脆弱水印方案和相关功能 3 ...

最新文章

  1. JQuery Attributes 方法说明
  2. 第十二天:规划成本管理,成本类型, 资产折旧;和 估算成本,估算成本知识点提示
  3. wordweb在线编辑_使用WordWeb享受按需词典和词库功能
  4. Linux(Ubuntu 16) 下Java开发环境的配置(二)------Tomcat的配置及常见问题
  5. 应用filestream设置时存在未知错误_开机黑屏?常见启动黑屏错误的中文解释!学习电脑知识电脑小匠...
  6. Vc中对话框数据交换和验证机制
  7. 【渝粤教育】电大中专电商运营实操 (2)作业 题库
  8. 如何调整转场时间和移动转场效果
  9. Javascript:利用闭包实现高级排他
  10. javascript原型继承圣杯模式
  11. 黑马程序员传智播客 进程、线程、协程对比
  12. ubunut 安装 pyqt5
  13. php netstat,Netstat 命令详解
  14. mfc入门基础(三)创建对话框
  15. Apple Developer苹果签名工具
  16. Frefox安装AeroFox皮肤插件后菜单字体的美化
  17. Android WMS架构:WindowContainer树形组合模式-理论基础+实践结果
  18. totolink服务器未响应,totolink路由器登陆页面打不开怎么办
  19. Hyperledger/Quorum等区块链技术综述
  20. excel(2015)表格如何在滑动时固定标题栏

热门文章

  1. mywallop、orkut、gmail的邀请
  2. day25/RegexDemo1.java
  3. html上传后门,网站查后门软件 WebShellKiller
  4. Fleet 1.9.231发布,支持window10 version 1809及以上版本,MacOs支持,但win7不支持
  5. 利用硬件机器人实现网络试衣
  6. viewpager禁止左右滑动
  7. 中科大何向南团队+快手App联合出品 KuaiRec | 快手首个稠密为99.6%的数据集 | 相关介绍、下载、处理、使用方法
  8. 微软面试题:站在地球上的某一点,向南走一公里,然后向东走一公里,最后向北走一公里,回到了原点。地球上有多少个满足这样条件的点?
  9. ubuntu无法ping www.baidu.com问题
  10. 金海佳学C++primer9.45/9.46