文档章节

图片嵌入隐藏-大容量的信息隐藏算法

o
 osc_zoa3moe9
发布于 2019/12/07 21:21
字数 1619
阅读 31
收藏 0

精选30+云产品,助力企业轻松上云!>>>

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

  这是一种基于空间域的自适应多平面位的信息隐藏算法。该算法计算复杂度低、信息隐藏量大。且有实验表明在不影响图像视觉效果的前提下,其信息隐藏量比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*N
    if 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:embedNums
            
            embedNumsed=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*N
    if 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:embedNums
            embedNumsed=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*N
    if 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:embedNums
            embedNumsed=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*N
    if 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:embedNums
            
            extractNumsed=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*N
    if 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:embedNums
            
            extractNumsed=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*N
    if 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:embedNums
            
            extractNumsed=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

欢迎一起交流。

 

 

出处:https://blog.csdn.net/Tianma5/article/details/51299000

o
粉丝 1
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。
ctf与隐写

本文是对简单隐写和ctf中隐写思路的一个小总结推荐我的另两篇博客常见文件格式特征ctf常用隐写工具介绍 隐写的载体 文本、图像、音频、视频 文本隐写 1、利用文档格式:行移、子移、字符颜色...

osc_05umekgg
02/22
5
0
BMP图像信息隐藏

图像隐写算法LSB—Least Significant Bits,又称最不显著位。LSB算法就是将秘密信息嵌入到载体图像像素值得最低有效位,改变这一位置对载体图像的品质影响最小。 原理如下: 以实验用的24位真...

osc_dnid8j42
2019/10/09
6
0
CTF之图片隐写术解题思路

参考大佬的博客:https://blog.csdn.net/asmallrabbit/article/details/79644078 深有感触,觉得写得比较全,因此将此篇文章记录在此方便以后用得到。 0x01图像隐写术进行数据隐写分为以下几...

osc_td5zc8kl
2019/09/09
6
0
基于DCT的图片数字水印实验

实验类别 设计型实验:MATLAB设计并实现基于DCT的图像数字水印算法。 2. 实验目的 了解基于DCT的图像数字水印技术,掌握基于DCT系数关系的图像水印算法原理,设计并实现一种基于DCT的数字水印...

osc_851bq07r
2019/03/21
57
0
走进信息隐藏的世界,全面讲解信息隐藏——第1节:信息隐藏技术简介

走进信息隐藏的世界,全面讲解信息隐藏——第1节:信息隐藏技术简介 专栏题记:奥斯卡优秀电影《美丽心灵》里面有讲述一位优秀数学家为政府破译敌国通讯的情节,如电影所讲,现实中也有着类似...

qq_1196581964
2019/01/04
0
0

没有更多内容

加载失败,请刷新页面

加载更多

使用命名管道承载gRPC

最近GRPC很火,感觉整RPC不用GRPC都快跟不上时髦了。 gRPC设计 gRPC是一种与语言无关的高性能远程过程调用 (RPC) 框架。刚好需要使用一个的RPC应用系统,自然而然就盯上了它,但是它真能够解...

osc_nq69o22c
1分钟前
0
0
06-敏捷开发框架-apis 脚本库 引用位置无关性设计

动态引入技术的设计,对我们来说非常重要。 同时也说明动态语言的使用对我们来说也是非常重要。 没有动态语言的支撑,有些想法可能不容易实现,或者有替代方案,可能会花更大的代价。 前端开...

osc_5zg9z6t1
3分钟前
0
0
(三)学习了解OrchardCore笔记——灵魂中间件ModularTenantContainerMiddleware的第一行①的模块部分

  了解到了OrchardCore主要由两个中间件(ModularTenantContainerMiddleware和ModularTenantRouterMiddleware)构成,下面开始了解ModularTenantContainerMiddleware中间件第一行代码。   ...

osc_kdarxvx0
5分钟前
0
0
50Mn18Cr4V锻锻环件

电机无磁护环怎么锻性能才能《高高》?50Mn18Cr4V高锰无磁钢在变形温度为900~1 100℃、应变速率为0.1 ~10s-1条件下的热变形行为. 结果,VC第二相的应变诱导析出对50Mn18Cr4V的热变形行为产生...

无磁钢
5分钟前
1
0
【遇见offer】一汽-大众实习生专场来啦!成长+学习+福利,一个也不能少~

在上次一汽-大众的社招直播之后,实习生的专场招聘也终于来啦! 针对2020年暑期,我们提供了非常多的实习岗位给大家选择。 如果你想得到大厂实习的宝贵经验,如果你想得到更快速的成长,如果...

osc_b88oux8w
6分钟前
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部