(完整word版)(绝对可运行)加密图像中的可逆数据隐藏算法matlab代码(基于张新鹏教授的算法)

合集下载

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

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

图⽚嵌⼊隐藏-⼤容量的信息隐藏算法今天分享⼀下最近看到的⼀个图⽚嵌⼊隐藏的算法。

这是⼀种基于空间域的⾃适应多平⾯位的信息隐藏算法。

该算法计算复杂度低、信息隐藏量⼤。

且有实验表明在不影响图像视觉效果的前提下,其信息隐藏量⽐LSB算法⼤,并具有更⾼的安全性。

该算法的主要思想是对每个像素点进⾏判断,根据HVS的特性,在最⾼⾮0有效位后的指定位(y)开始嵌⼊隐藏信息,嵌⼊到另⼀个指定位(z)为⽌。

下⾯直接贴上MATLAB代码和实验结果:%下⾯是主函数main_ImgEmbed.mclc;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;endy(jj)=Imgmarklinebin(embedNumsed);%嵌⼊endendImgRlineNew(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*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;endy(jj)=Imgmarklinebin(embedNumsed);%嵌⼊endendImgGlineNew(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*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;endy(jj)=Imgmarklinebin(embedNumsed);%嵌⼊endendImgBlineNew(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*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;endImgmark_extractlinebin(extractNumsed)=y(jj);%提取endendend% 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;endImgmark_extractlinebin(extractNumsed)=y(jj);%提取endendend% 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;endImgmark_extractlinebin(extractNumsed)=y(jj);%提取endendend%⼆进制转⼗进制Imgmarklinedec=zeros(markm*markn,1); %转化为⼗进制for ii=1:markm*marknImgmarklinedec(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,即说明完全⼀致,提取正确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.mfunction [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;endend结果如图所⽰:(原图)(待嵌⼊的图像)欢迎⼀起交流。

基于粒子群算法的可逆数据隐藏技术研究

基于粒子群算法的可逆数据隐藏技术研究

基于粒子群算法的可逆数据隐藏技术研究随着信息技术的发展,数据存储已经成为现代社会必不可少的一项基础性工作。

然而,在数据发送和存储过程中,数据安全性问题也越来越引起人们的关注。

因此,可逆数据隐藏技术便应运而生。

可逆数据隐藏技术可以被简单地定义为一种将机密信息嵌入到另一个图像或媒体载体中的技术。

与此同时,无论数据的嵌入、提取还是载体的重建或还原,都要满足不损失信息、不影响载体质量和保证数据的安全性。

粒子群算法(Particle Swarm Optimization Algorithm,PSO)是一种高效的优化算法,它可以模拟社会群体中的学习与演化过程。

它的优点主要表现在其搜索速度快、容易实现以及不易陷入局部最优解等方面。

因此,在可逆数据隐藏技术中运用粒子群算法进行嵌入、提取和优化,也成为了研究热点。

粒子群算法的核心过程是对粒子个体中心及当前全局最优解进行向量运算,并根据此计算出下一步的位置和速度信息。

在可逆数据隐藏技术中,粒子群算法主要应用于嵌入数据信息。

其嵌入过程主要有两种方法:基于空域的嵌入和基于变换域的嵌入。

空域技术是指在考虑时域图像像素值的基础上进行数据的嵌入。

其实现主要包括两个过程:像素选择和像素调整。

空域嵌入技术具有嵌入效果好的特点,但它也存在两个问题:一是密度方面的问题,由于像素点的数量有限,不同的掩码策略会导致不同的嵌入率,从而影响到嵌入数据的完整性和一致性;二是嵌入率方面的问题,由于嵌入像素值是在像素之间插值完成的,所以嵌入率并不会随着嵌入数据量的增大而线性地变化。

变换域技术是指通过对图像进行频域或小波变换,将频率信息与嵌入数据信息进行匹配,实现数据嵌入的技术。

变换域技术的实现过程主要包括图像变换、系数选择、调整和量化。

变换域嵌入技术具有加密强度高的特点,但它也存在两个问题:一是随机因素的问题,不同的变换方式对应着不同的随机序列,嵌入的数据同样也会受到随机序列的限制,因此可能会导致嵌入效果的不一致性;二是稳定性的问题,由于嵌入过程采用的是随机策略,所以嵌入结果的质量与算法的稳定程度紧密相关。

《基于差值扩展的可逆数据隐藏》

《基于差值扩展的可逆数据隐藏》

《基于差值扩展的可逆数据隐藏》一、引言随着信息技术的迅猛发展,数字媒体的普及以及存储空间的扩大,数据的存储与传输成为了现代生活的重要环节。

在这一背景下,可逆数据隐藏技术作为信息隐藏技术的一种重要分支,越来越受到研究者的关注。

可逆数据隐藏技术是一种在不损害原始载体文件质量的前提下,向载体文件中嵌入秘密信息的技术。

本文将重点探讨基于差值扩展的可逆数据隐藏技术,并对其原理、实现方法及性能进行详细分析。

二、差值扩展可逆数据隐藏技术原理差值扩展可逆数据隐藏技术是一种基于图像处理的数据隐藏技术。

其基本思想是在原始载体图像中,通过分析像素间的差值来嵌入秘密信息。

该技术利用载体图像中像素之间的冗余性,在不明显改变图像视觉效果的前提下,通过修改部分像素的差值来嵌入秘密信息。

三、差值扩展可逆数据隐藏技术实现方法1. 预处理阶段:对原始载体图像进行预处理,包括灰度化、滤波等操作,以提高图像的鲁棒性和可逆性。

2. 差值分析阶段:对预处理后的图像进行差值分析,找出适合嵌入秘密信息的像素对。

3. 嵌入秘密信息阶段:根据秘密信息的特性,通过修改像素对的差值来嵌入秘密信息。

这一过程需要保证嵌入后的图像仍能保持较高的视觉质量。

4. 后处理阶段:对嵌入秘密信息后的图像进行后处理,包括调整图像亮度、对比度等操作,以进一步提高图像的视觉效果。

四、差值扩展可逆数据隐藏技术性能分析基于差值扩展的可逆数据隐藏技术具有较高的鲁棒性和可逆性。

在嵌入秘密信息后,原始图像的质量基本保持不变,同时能够保证秘密信息的完整性和安全性。

此外,该技术还具有较高的嵌入容量和较低的计算复杂度,使得其在实时性要求较高的场景中具有较好的应用前景。

五、应用领域与展望基于差值扩展的可逆数据隐藏技术在许多领域都有着广泛的应用前景。

例如,在军事领域中,可以利用该技术将重要的军事信息隐藏在图像中,以实现信息的隐蔽传输和存储;在医疗领域中,可以将病人的病历信息等敏感数据隐藏在医学影像中,以保证数据的安全性和隐私性;在司法领域中,可以利用该技术对电子文件进行篡改检测和溯源等操作。

基于图像插值技术的可逆数据隐藏算法

基于图像插值技术的可逆数据隐藏算法

基于图像插值技术的可逆数据隐藏算法童新安;李艳晓;袁可红【摘要】针对现有基于插值技术可逆数据隐藏算法具有较高的隐藏容量,但隐秘图像质量不是很高问题的问题,提出一种新的大容量图像可逆数据隐藏算法.首先对输入图像进行插值处理生成载体图像,然后对载体图像进行重叠分块,并计算分块中每一个非基准像素能隐藏的数据量,最后采用自适应的方法隐藏秘密数据.在Kodak图像集上的实验结果表明,本文算法能完整地提取隐藏的秘密数据且不会出现像素溢出现象;与相似的算法相比,该算法的秘密数据隐藏容量平均提升了约98%,隐秘图像质量平均提升了约6%.【期刊名称】《科学技术与工程》【年(卷),期】2019(019)008【总页数】7页(P157-163)【关键词】数据隐藏;可逆数据隐藏;图像插值技术;大容量【作者】童新安;李艳晓;袁可红【作者单位】洛阳理工学院数学与物理教学部,洛阳471023;洛阳理工学院数学与物理教学部,洛阳471023;洛阳理工学院数学与物理教学部,洛阳471023【正文语种】中文【中图分类】TP309信息隐藏技术按提取隐藏的信号后原始载体信号是否能完整地还原,可将其分为不可逆信息隐藏和可逆信息隐藏两大类。

对于传统的版权保护技术[1,2],虽隐藏的水印信号具有较强的鲁棒性,但载体信号在提取隐藏的水印信号后基本不能还原,这对失真较敏感的领域是不可行的。

可逆信息隐藏技术作为信息隐藏技术的一个分支,它在提取隐藏的秘密数据后能完整地还原原始载体信号,被广泛应用在对失真较敏感的领域。

目前,可逆数据隐藏算法按原理来分可将其分为基于差值扩展的可逆数据隐藏算法[3,4]、基于直方图平移[5—8]的可逆数据隐藏算法和基于插值的可逆数据隐藏算法[9—15]三类。

2003年,Tian[3]提出基于差值扩展的可逆数据隐藏算法。

该算法主要思想是利用载体图像中像素对的差值来隐藏数据,隐藏容量较高,但为实现盲提取隐藏的数据,该算法需对隐藏过程中产生的辅助数据进行压缩,再将其隐藏到载体信号中,使该算法真实隐藏容量降低了。

基于数据隐藏的可逆图像视觉变换算法

基于数据隐藏的可逆图像视觉变换算法

基于数据隐藏的可逆图像视觉变换算法唐洪祥;吴昊天【摘要】提出了一种新的基于可逆数据隐藏的图像加密算法,解决了已有算法过程复杂、信息嵌入量大、还原原始图像时产生失真等问题.利用图像中像素值最高位(MSB)对灰度影响最大的特点,将秘密图像的MSB位平面替换为事先选定的参考图像的MSB位平面,以掩饰秘密图像的视觉内容.提出的算法需要保存恢复原始图像所需的信息,采用基于直方图变换的可逆数据隐藏算法嵌入图像视觉变换信息,可以提高信息嵌入容量,并能根据提取的信息无损地还原出原始图像.【期刊名称】《传感器与微系统》【年(卷),期】2018(037)009【总页数】4页(P125-128)【关键词】图像视觉变换;像素值;最高位;嵌入容量;可逆数据隐藏【作者】唐洪祥;吴昊天【作者单位】江南大学数字媒体学院,江苏无锡214122;华南理工大学计算机科学与工程学院,广东广州510006【正文语种】中文【中图分类】TP309.20 引言可逆图像视觉变换技术是图像加密技术中重要的研究方向,可将原始图像转换成加密图像,并在加密图像中嵌入相应的变换信息,以便在恢复图像时能够根据变换信息无失真地恢复出原始图像。

文献[1]提出了一种基于影像镶嵌的图像视觉变换方法(secret-fragment-visible mosaic images),可以生成视觉上和参考图像相似的加密图像,并能够无失真地恢复原始图像,但只能从特定的图像数据库中选取参考图像。

文献[2]对此进行改进,分割后的图像块可以作0°,90°,180°或者270°旋转,每个原始图像块能够通过近可逆的颜色变换算法[3],使得产生的结果图像和原始图像的相似程度更高,但该方法仍不可逆。

为了让用户能较好地对图像信息加密,并将加密图像无失真地还原出原始图像,本文提出了一种可逆图像视觉变换算法,利用可逆数据隐藏算法[4~9]将图像变换信息嵌入到加密图像中,按照变换过程逆序操作,即可无失真地恢复出原始图像。

MATLAB中的图像压缩与加密技术

MATLAB中的图像压缩与加密技术

MATLAB中的图像压缩与加密技术引言:图像处理是计算机科学领域中的一个重要分支,它主要关注如何获取、处理和分析图像。

在数字图像处理中,图像压缩和加密是两个关键的技术,它们能够对图像进行有效地存储和保护。

本文将探讨MATLAB中的图像压缩与加密技术,介绍其基本原理和实现方法。

一、图像压缩技术1.1 无损压缩无损压缩技术是指在压缩图像时不丢失任何信息的技术。

其中最常见的算法是基于哈夫曼编码和算术编码的压缩算法。

哈夫曼编码通过建立变长编码表来实现对图像的压缩,出现频率较高的像素值会被分配短的编码,而出现频率较低的像素值则会被分配长的编码。

算术编码则是通过计算图像中每个像素值的出现概率来对图像进行编码,从而实现更高效的压缩。

1.2 有损压缩有损压缩技术是指在压缩图像时会丢失部分信息的技术,但通过控制丢失的信息量可以实现更高的压缩比。

著名的有损压缩算法包括JPEG和JPEG2000。

JPEG 算法使用离散余弦变换(DCT)将图像划分为多个8x8的块,然后对每个块进行频域变换,再通过量化和熵编码实现对图像的压缩。

JPEG2000引入了小波变换,使用位平面编码来对图像进行压缩,同时还具有更好的图像质量和可扩展性。

二、图像加密技术2.1 对称加密对称加密技术是指加密和解密使用相同的密钥的技术。

其中最常见的算法是DES和AES。

DES(数据加密标准)是一个对称密钥算法,它将64位的明文分成左右两个32位的块,然后进行16轮的加密操作,使用相同的密钥进行解密即可。

AES(高级加密标准)是DES的后继者,它支持128、192和256位密钥,并且具有更高的安全性和性能。

2.2 公钥加密公钥加密技术是指加密和解密使用不同的密钥的技术。

RSA算法是最常见的公钥加密算法之一,它依赖于大素数分解的难度。

在RSA算法中,每个用户都有一对密钥,一个是公钥用于加密,一个是私钥用于解密。

发送方使用接收方的公钥进行加密,接收方使用自己的私钥进行解密,从而实现安全的通信。

Matlab编程实现LSB信息的隐藏与提取

Matlab编程实现LSB信息的隐藏与提取

2010.111引言信息隐藏作为一门新兴学科越来越受到人们的重视,而如今成熟的信息隐藏算法基本上都是基于图像的,其中信息隐藏在图像空域中是一种最简单、有效的实现信息隐藏的手段。

Matlab 是由美国MATHWORKS 公司设计的强大的矩阵运算工具,它包含了大量的矩阵运算函数,以其强大的分析处理能力和运算能力而闻名,用以实现图像的处理非常适合。

在此介绍了一种简单的图像空域隐藏算法—LSB (最不重要位)隐秘算法。

主要是将隐秘信息嵌入到图像最不容易发觉的像素位,即最不重要位。

使用此算法的优点是隐藏效果好,不会破坏原图像的效果,隐藏信息多等,从而达到隐藏信息的目的。

2隐秘原理LSB 的嵌入方法是首先将要隐藏的信息以二进制的形式读入,再按照一定的算法选择它们要嵌入的位置。

如果要隐藏的信息的某一位为1,则它要嵌入的载体图像相应位置的像素值mod2的值为1;如果要隐藏的信息的某一位为0,则它要嵌入的载体图像相应位置的像素值mod2的值为0。

LSB 的提取方法是首先将确定隐藏信息嵌入的位置。

如果该位置的像素值mod2的值为1,则此处隐藏的信息为1;如果该位置的像素值mod2的值为0,则此处隐藏的信息为0。

但是选择选择嵌入的位置不同,抗攻击的能力是不同的,下面将介绍两种嵌入算法,并对其进行隐写分析比较。

算法一:顺序选择图像像素LSB 的嵌入算法,即将选取的像素点的最不重要位依次替换成秘密信息。

秘密消息的嵌入:for (i=1;i<=像素序列的个数;i++)Si ←Ci //Ci 为整个图像的像素集合,Si 是我们顺序选取的要隐//藏信息的像素的集合end forfor (i =1;i<=秘密信息长度;i++)S ji ←C ji ←Mi //将秘密信息Mi 存入选取的像素点Sjiend for秘密消息的提取:for (i=1;i<=像素序列的个数;i++)i ←→ji //计算存放第i 个消息位的指针jiMi ←LSB(Cji)//计算Cji 的LSB 位,恢复秘密信息end for算法二:随即选取像素点嵌入算法,即选出的嵌入信息的像素位置是随机的,这样可以增加隐秘信息的不可见性。

一种基于图像插值的可逆信息隐藏算法

一种基于图像插值的可逆信息隐藏算法

一种基于图像插值的可逆信息隐藏算法【摘要】本文将原始图像进行图像插值得到一副较大的图像作为载体图像,以重叠的3×3分块为单位嵌入秘密信息,通过计算分块的视觉影响因子确定该块是否能嵌入秘密信息。

在可嵌入秘密信息的块中,通过计算参照像素与非参照像素的差异确定何种隐藏方式。

实验结果表明本文算法不但提高了隐藏容量而且保持较好的图像质量。

【关键词】图像插值;可逆;信息隐藏1.图像插值“图像插值”一般讲就是将一副较小的图像进行放大,放大的过程就是选择信息较好的像素作为增加的像素,从而使放大后的图像视觉效果较好。

常见的插值方法有最近邻元法、双线内插法和三次内插法。

这些插值方法中,要么插值后得到的图像质量较差,要么计算复杂度较高。

本文为了在图像质量和计算复杂度之间达到较好的平衡,采用文献[2]的邻近像素插值法。

假设原始图像I为大小(w/2)×(h/2)的8位灰度图像,根据文献错误!未找到引用源。

邻近像素插值法得到一副大小为w×h的灰度图像F作为载体图像。

具体的计算方法如公式(1)所示,其中0≤j≤i,0≤m≤w/2-1,0≤n≤h/2-1。

(1)2.秘密信息嵌入(a)原始图像I (b)载体图像F图1 重叠的3×3分块根据文献[2]在载体图像中采用重叠的3×3分块从左至右,从上到下嵌入秘密信息,如图1所示,图1(a)为原始图像,图1(b)为载体图像。

在一个3×3分块中,令块中像素为F(i,j),F(i+1,j),F(i+2,j),F(i,j+1),F(i+1,j+1),F(i+2,j+1),F(i,j+2),F(i+1,j+2),F(i+2,j+2)其中i=0,2,4…w-2,j=0,2,4…h-2。

F(i,j),F(i+2,j),F(i,j+2),F(i+2,j+2)为原始图像中的像素即参照像素不用于嵌入秘密信息,其他5个像素则由参照像素产生可嵌入秘密信息。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

%This is the program of Reversible Data Hiding in Encrypted Domain clc; clear;

%===============Read image=========================== original_p=rgb2gray(imread('LENA.tif')); [m,n]=size(original_p);

%==============Image encryption====================== random_bits=rand(m,n*8)<=0.5; %伪随机序列 for i=1:m for j=1:n s=0; for k=0:7 b(k+1)=mod(fix(double(original_p(i,j))/(2^k)),2); eb(k+1)=xor(b(k+1),random_bits(i,8*j+k-7)); s=s+eb(k+1)*(2^k); end encrypted_image(i,j)=s; end end figure(1); subplot(1,2,1); imshow(original_p); hold on; title('Original image','fontsize',16); subplot(1,2,2); encrypted_image=uint8(encrypted_image); imshow(encrypted_image); title('Encrypted image','fontsize',16);

%================Data embedding====================== size=8; %分块大小 N=6;%置乱周期 number1=3; number2=N-number1; lim_row=fix(m/size); %图像的分块数 lim_col=fix(n/size); %图像的分块数 bitts=3; watermessage=rand(lim_row,lim_col)<0.5; %水印信息

%======pseudo_randomly======= for i=1:lim_row for j=1:lim_col block_image{i,j}=encrypted_image((size*i-size+1):size*i,(size*j-size+1):size*j); %分块 for k=1:size for t=1:size index=arnold(k,t,size,number1);%arnold is permutateion function; arno_block_image{i,j}(index(1)+1,index(2)+1)=block_image{i,j}(k,t); end end %数据嵌入 sum0=zeros(size/2,size); if watermessage(i,j)==0 for k=0:7 bbb{k+1}=mod(fix(double(arno_block_image{i,j}(1:size/2,:))/(2^k)),2); if kbbb{k+1}=~bbb{k+1}; end sum0=sum0+bbb{k+1}*(2^k); end data_image{i,j}=[sum0;double(arno_block_image{i,j}(size/2+1:size,:))]; end sum1=zeros(size/2,size); if watermessage(i,j)==1 for k=0:7 bbb{k+1}=mod(fix(double(arno_block_image{i,j}(size/2+1:size,:))/(2^k)),2); if kbbb{k+1}=~bbb{k+1}; end sum1=sum1+bbb{k+1}*(2^k); end data_image{i,j}=[double(arno_block_image{i,j}(1:size/2,:));sum1]; end for k=1:size for t=1:size index=arnold(k,t,size,number2);%arnold is permutateion function; re_data_image{i,j}(index(1)+1,index(2)+1)=data_image{i,j}(k,t); end end %合成嵌入数据后的图像 data_en_image((size*i-size+1):size*i,(size*j-size+1):size*j)=re_data_image{i,j}; end end %=====Encrypt image which contains data==== for i=1:lim_row*size for j=1:lim_col*size s=0; for k=0:7 b(k+1)=mod(fix(data_en_image(i,j)/(2^k)),2); eb(k+1)=xor(b(k+1),random_bits(i,8*j+k-7)); s=s+eb(k+1)*(2^k); end de_data_image(i,j)=s; end end figure(2); hold on; subplot(1,2,1); imshow(original_p); title('Original image','fontsize',16); subplot(1,2,2); imshow(uint8(de_data_image)); title('Decrypted image contains data','fontsize',16); %直接解密图像的峰值信噪比 sumsss=0; for i=1:lim_row*size for j=1:lim_col*size sumsss=(de_data_image(i,j)-double(original_p(i,j)))^2+sumsss; end end mse=sumsss/((lim_row*size)*(lim_row*size)); psnr=10*log10(255^2/mse);

%======Extract data and recover image======= for i=1:lim_row for j=1:lim_col block_de_image{i,j}=de_data_image((size*i-size+1):size*i,(size*j-size+1):size*j); %分块 for k=1:size for t=1:size index=arnold(k,t,size,number1);%arnold is permutateion function; ar_block_de_image{i,j}(index(1)+1,index(2)+1)=block_de_image{i,j}(k,t); end end sum0=zeros(size/2,size); sum1=zeros(size/2,size); for k=0:7 bbb0{k+1}=mod(fix(ar_block_de_image{i,j}(1:size/2,:)/(2^k)),2); bbb1{k+1}=mod(fix(ar_block_de_image{i,j}(size/2+1:size,:)/(2^k)),2); if kbbb0{k+1}=~bbb0{k+1}; bbb1{k+1}=~bbb1{k+1}; end sum0=sum0+bbb0{k+1}*(2^k); sum1=sum1+bbb1{k+1}*(2^k); end ar_H0_image{i,j}=[sum0;ar_block_de_image{i,j}(size/2+1:size,:)]; ar_H1_image{i,j}=[ar_block_de_image{i,j}(1:size/2,:);sum1]; for k=1:size for t=1:size index=arnold(k,t,size,number2);%arnold is permutateion function; H0_image{i,j}(index(1)+1,index(2)+1)=ar_H0_image{i,j}(k,t); H1_image{i,j}(index(1)+1,index(2)+1)=ar_H1_image{i,j}(k,t); end end f0=0; f1=0; for u=2:size-1 for v=2:size-1

f0=f0+abs(H0_image{i,j}(u,v)-(H0_image{i,j}(u-1,v)+H0_image{i,j}(u,v-1)+H0_image{i,j}(u+1,v)+H0_image{i,j}(u,v+1))/4);

f1=f1+abs(H1_image{i,j}(u,v)-(H1_image{i,j}(u-1,v)+H1_image{i,j}(u,v-1)+H1_image{i,j}(u+1,v)+H1_image{i,j}(u,v+1))/4); end end if (f0-f1)<0 extract_bits(i,j)=0; recover_image(size*i-size+1:size*i,size*j-size+1:size*j)=H0_image{i,j}; else extract_bits(i,j)=1; recover_image(size*i-size+1:size*i,size*j-size+1:size*j)=H1_image{i,j}; end end end figure(3); subplot(1,2,1); imshow(original_p); hold on;

相关文档
最新文档