【数据隐写】基于matlab四叉树分割和直方图平移的可逆图像数据隐藏【含Matlab源码 2143期】
一、一种使用四叉树分割的分形信息隐藏算法简介
1 使用四叉树分割的正交分形编码
2008年,Pi等人提出了一个新的正交分 形编码水 印算法[8],在正交分形编码中,灰度仿射变换中的亮度因子就是待编码子块的均值,而且这个均值在解码过程中是迭代不变的,嵌入到该均值中的秘密信息不会因正交分形解码而消失,而是散布于整个载体图像像素域中。此外,秘密信息的提取只需要计算图像子块的均值,因而秘密信息的提取比其它变换域算法都快。随后,很多学者在Pi等人提出的算法上做了很多改进,并将这种方法应用在了图像隐写中,获得了很好的效果,如考虑HVS特性将值域块分类[9,12],对不同的值域块选择不同的嵌入强度,或者利用拼贴误差的原理[11,12],这些方法都能较好地兼顾秘密信息的不可感知性和鲁棒性,使得基于正交分形的信息隐藏算法更具有实用价值。但这些方法在载体图像进行正交分形编码时,都是将图像平均分割成若干互不重叠大小为2b×2b的值域块R ,如果分割的值域块尺寸过大,那么整个信息隐藏和信息提取过程所需要的时间就越少,但是隐藏的信息量就会很少,如果分割的尺寸过小,所需要的时间很长,也不利于整个信息隐藏过程。
因此可以考虑在图像分割时,根据图像块的特征分割为可变大小的块,这样就能很好地兼顾时间和隐藏量。Y. Fisher于1991年提出图像的四叉树分割方案[6],该方案在图像分割时能根据值域块的拼贴误差自适应地调整值域块的大小。将四叉树分割理论运用到信息隐藏中,可以根据原始载体图像的特征,动态自适应分割图像值域块,同时根据值域块的拼贴误差,调整嵌入秘密信息的强度,兼顾了信息隐藏的时间和隐藏容量,实验表明,这种方法的抗攻击能力( 鲁棒性) 比传统的正交分形信息隐藏算法要强。具体的分割流程如图1所示。
图 1 四叉树分割方法
2 彩色图像分量相关性以及拼贴误差
现在,互联网上的图像大都是彩色图像,考虑到信息隐藏的透明性,本文选择彩色图像作为载体图像,通过第1节的编码方法,将秘密图像嵌入到其中,以达到隐蔽通信的目的。而传统的SFC方法[13],未能考虑到彩色图像R、G、B三个分量的相关性,对分量进行分别编码相当费时。本文结合文献[13]中的根据彩色图像R、G、B三个分量的相关性,在对彩色载体图像进行正交分形编码时,首先对亮度分量Y = 0. 301r + 0. 586g + 0. 113b进行编码,然后对三个分量中的对比度因子s以及值域块均值r进行修正,s的修正公式如下:
其中ri是彩色图像红色分量Ir中值域块R的像素值,d’i是Ir中D块经过四邻域平均后与R块等大的定义域块D’ 中的像素值,–r和d’分别是R和D’ 的平均值( 具体的修正过程在第3节的信息嵌入过程中有详尽的描述) 。在保证图像质量的前提下,加快了正交分形编码的速度。这种算法和SFC编码算法相比,匹配时间缩短约为原来的1 /3,大大缩短了正交分形编码的时间。
很多基于正交分形编码的信息隐藏算法是通过修改载体图像的分形编码参数实现信息嵌入的,具体来说是修改参数中R块均值来嵌入信息的。通过实验发现,R块均值的改变量越大,图像的鲁棒性越强,但是载体图像就会在视觉上降质,从而带来秘密信息透明性的降低,因此需要折中处理[12]。本文将拼贴误差[10,12]运用到均值的修改上,具体说,图像中纹理或边缘区域的拼贴误差大,但是图像中的平滑区域的拼贴误差要小好多,拼贴误差反映了图像的局部特征,如果对于图像的平滑区域也就是拼贴误差小的值域块均值修改量小,反之修改量大,这样既能保证秘密信息的隐蔽性,同时也能带来载体图像鲁棒性的提升。本文首先采用正交分形编码得到分形参数,然后根据拼贴误差将值域块R分成Ci类,不同类中的Ri嵌入强度Δi不同( 式2) ,这样图像的不同局部采用了不同的嵌入强度,从而兼顾秘密信息的透明性和载密图像的鲁棒性。
3 信息嵌入和提取
本文的秘密图像采用灰度图像,然而传统的正交分形算法无法直接运用到灰度图像中。所以,本文采用文献[11]中的方法,通过变换函数,将灰度秘密图像的像素值作为修改参数时的增量,以达到嵌入秘密图像的目的。
设载体图像IN×N,利用正交分形编码嵌入秘密图像时需要修改R块均值r,修改公式如下:
设原始载体图像是2m×2n的彩色图像I,秘密图像为256级灰度图像S。为了增强秘密图像的安全性,同时防止剪切、涂抹等攻击使提取的图像丢失大片连续的区域,这里选择对秘密图像进行Arnold置乱,迭代次数作为密钥key1保存。具体的嵌入过程如下:
( 1) 原始图像I提取亮度分量Y = 0. 301r + 0. 586g +0. 113b,得到一幅灰度图像I’ 。
( 2) 设置整个图像I’ 为当前值域块Ri,按照图1四叉树的方式进行分割,分割的过程中记录下正交分形编码参数( xi,yi,ai,s,r) 。( 其中( xi,yi) 表示定义域块的位置,ai是8种仿射变换的序号,s表示对比度,r表示当前值域块的均值) 。
( 3) 将原始图像I中红色分量所组成的灰度图Ir中,与值域块R最佳匹配的定义域块D块的坐标和仿射变换序号用I’ 中得到的来替代,而R块的平均值用Ir自身的平均值替代,对因子s进行修正,修正公式见式( 2) 。G( 绿色) 分量和B( 蓝色) 分量做相同的处理。最终得到修正后的编码参数 ( xi,yi,ai,sr,rr,sg,rg,sb,rb) 。
( 4) 重复( 2) 、( 3) 直到所有的值域块编码完毕,因为不是等分割载体图像,这里需要记录图像分割情况,作为秘钥key2,供提取信息时使用。
( 5) 按拼贴误差E( R) 对子块集合{ Ri} 进行降序排列,得到子块序列,并把它划分为n类记为Ci,每类的子块个数为:2m + n -2b/ n,每类的嵌入强度为Δi,1≤i≤n。
( 6) 对于子块R∈Ci( 1≤i≤n) ,若对应秘密图像像素值为w,则将分形参数( xi,yi,ai,sr,rr,sg,rg,sb,rb) 中的rr按式( 1)修改得到rr’,量化步长满足Δi> Δi+ 1( 1≤i≤n) 。同理,下一个像素值,我们依次处理rg、rb。按照修改均值后的分形码( xi,yi,ai,sr,rr’,sg,rg’,sb,rb’) 进行分形解码迭代,得到含秘密信息的彩色图像。
秘密信息的提取是嵌入的逆过程。具体提取步骤如下:
( 1) 将载密图像按照秘钥key2进行分割,对于每个块Ri,计算三个分量图像的均值ri( 0≤i < 2m + n -2b) 。
( 3) 根据密钥key1,对提取的秘密图像序列W’ 进行逆Arnold变换,就得到了秘密图像W。
二、部分源代码
clc;
clear all;
close all;
z=1;
%--------------------读取图像------------------------
b=imread(‘goldhill.jpg’);
I=rgb2gray(b);
figure(1);
imshow(I);
title(‘原始图像’);
[m,n]=size(I);
figure(2);
imhist(I);
title(‘原始图像的直方图’);
%--------------------四叉树分解---------------------
mindim=4;
S = qtdecomp(I,@Split,mindim,@Predicate);
%-------------------显示块表示------------
blocks = repmat(uint8(0),size(S));
for dim = [512 256 128 64 32 16 8 4 2 1];
numblocks = length(find(S==dim));
if (numblocks > 0)
values = repmat(uint8(1),[dim dim numblocks]);
values(2:dim,2:dim,:) = 0;
blocks = qtsetblk(blocks,S,dim,values);
end
end
blocks(end,1:end) = 1;
blocks(1:end,end) = 1;
figure(3);
imshow(blocks,[]);
title(‘分解的图像块’);
%-------------------显示全图-----------------------------------
vals1 = repmat(uint8(0),size(S));
for dim = [512 256 128 64 32 16 8 4 2 1]
[vals,r,c]=qtgetblk(I,S,dim);
numblocks = length(find(S==dim));
- 1
if (numblocks > 0)
values = repmat(uint8(1),[dim dim numblocks]);
values(2:dim,2:dim,:) = vals(2:dim,2:dim,1:numblocks) ;
vals1 = qtsetblk(vals1,S,dim,values);
- 1
end
end
figure(4);
imshow(vals1,[]);
title(‘分解图像’);
%----------------输入要隐藏的消息/数据---------------------
hide_data=input(‘Enter the data to be hide’); %用于手动输入
%cell_data=textread(‘myfile.txt’, ‘%s’, ‘whitespace’, ‘’); %reading data from text file
%hide_data=char(cell_data);
bin_data=convert_binary(hide_data); %调用函数将数据转换为二进制
binary_data=bin_data’;
size_binary=size(binary_data,1)*size(binary_data,2);
bin=1;
a=1;
% %-------------------在图像块中嵌入数据---------------------
vals5 = repmat(uint8(0),size(S));
pd=1;
q=1;
ind=1;
rec_data(size_binary)=0;
for h=1:size_binary
rec_data(h)=0;
end
三、运行结果
四、matlab版本及参考文献
1 matlab版本
2014a
2 参考文献
[1]聂道聪,郑洪源.一种使用四叉树分割的分形信息隐藏算法[J].计算机应用与软件. 2015,32(02)
3 备注
简介此部分摘自互联网,仅供参考,若侵权,联系删除
文章来源: qq912100926.blog.csdn.net,作者:海神之光,版权归原作者所有,如需转载,请联系作者。
原文链接:qq912100926.blog.csdn.net/article/details/127018813
- 点赞
- 收藏
- 关注作者
评论(0)