博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
图片嵌入-大容量的信息隐藏算法
阅读量:5738 次
发布时间:2019-06-18

本文共 6707 字,大约阅读时间需要 22 分钟。

      分享一下最近看到的一个关于图片嵌入隐藏的算法:

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

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

     (1) main_ImgEmbed.m

clc;clear all;close all;warning off all;yr=4;//论文中实验得到yg=5;yb=3;Img=imread('lena.jpg');figure;imshow(Img,[]);title('原图');Img=double(Img);ImgR=Img(:,:,1);ImgG=Img(:,:,2);ImgB=Img(:,:,3);Imgmark=imread('ImgEmbed.jpg');Imgmark=double(Imgmark);figure;imshow(Imgmark,[]);title('ImgEmbed');[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));%嵌入后的  endImgR2=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));%嵌入后的  endImgG2=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));%嵌入后的  endImgB2=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));endImgmarkextract=reshape(Imgmarklinedec,[markm,markn]);figure;imshow(Imgmarkextract,[]);title('提取的嵌入图片');% imwrite(uint8(Imgmarkextract),'待嵌入图片_gray_提取结果.jpg'); %保存图片%检查提取的水印和原水印的区别difmarked=Imgmarkextract-Imgmark; %做差  %发现差为0,即说明完全一致,提取正确

 

  (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)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

  

   (4)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;endend

  

实验结果如下:

(1)原图

 

 

(2)要嵌入隐藏的图片

 

(3)嵌入隐藏图片后的介质图像

 

(4)提取的嵌入图片

 

 

      整个工程代码下载请到:http://download.csdn.net/download/tianma5/9508467

 

     才疏学浅,多多指教。

 

转载于:https://www.cnblogs.com/chenkun1/p/5468114.html

你可能感兴趣的文章
Qt编写输入法V2018超级终结版
查看>>
<context:component-scan>详解
查看>>
DS博客作业07--查找
查看>>
Git 方法
查看>>
[Python] numpy.nonzero
查看>>
2016-11-29
查看>>
C#反射的坑
查看>>
css3 box-shadow阴影(外阴影与外发光)讲解
查看>>
时间助理 时之助
查看>>
nginx快速安装
查看>>
自定义转场动画
查看>>
英国征召前黑客组建“网络兵团”
查看>>
Silverlight 2.5D RPG游戏“.NET技术”技巧与特效处理:(十二)魔法系统
查看>>
[NPM] Run npm scripts in series
查看>>
vs2013修改书签(vs书签文件位置)
查看>>
C语言学习笔记
查看>>
PHP 命令行模式实战之cli+mysql 模拟队列批量发送邮件(在Linux环境下PHP 异步执行脚本发送事件通知消息实际案例)...
查看>>
PS 如何使用液化工具给人物减肥
查看>>
cvc-complex-type.2.4.c: The matching wildcard...
查看>>
android 读取json数据(遍历JSONObject和JSONArray)
查看>>