发明内容
本发明的目的在于提供一种编码分组的可逆信息隐藏方法,通过对二进制隐藏信息进行编码分组,得到十进制编码组,将十进制编码隐藏在载体序列中,还设定一待隐藏值,在载体序列中选择与该隐藏值相等的元素用于隐藏编码组,将频数较大的编码组隐藏在较少载体中,提高隐藏容量,并修改与该隐藏值不相等的元素,实现可逆信息隐藏。
实现本发明目的的技术方案是:
一种编码分组的可逆信息隐藏方法,包括如下步骤:
1、对隐藏信息进行编码分组,将二进制隐藏信息转换成十进制编码,对十进制编码两两分组;
具体是将二进制隐藏信息比特流中2bit作为一个单位转换为1位十进制的数字,若二进制隐藏信息的个数为奇数,则最后一位单独转成十进制数字;设转换后的隐藏信息十进制数字编码为C={c1,c2,c3,…,cm},则有0≤ci≤3,将C两两进行分组,若m为奇数,则在C中增加一个编码cm+1,且使cm+1=cm,cm+1与cm构成一编码组;为了准确提取隐藏信息,设置标记信息flag,判断是否增加编码,若增加编码cm+1,flag=1,否则flag=0,将flag作为密钥发送给接收方,接收方可根据flag的取值确定嵌入是否增加额外的编码,准确提取隐藏信息;设(c2k-1,c2k)为隐藏信息编码组,由于0≤ci≤3,则(c2k-1,c2k)有16种组合,分别为(0,0)、(0,1)、(0,2)、(0,3)、(1,0)、(1,1)、(1,2)、(1,3)、(2,0)、(2,1)、(2,2)、(2,3)、(3,0)、(3,1)、(3,2)、(3,3)。
2、对两两分组的十进制编码进行可逆信息隐藏;
设隐藏载体信息一维序列为S,设定一待隐藏值K,在载体序列中求出所有值为K的元素并记录元素下标信息,设值为K的元素序列为L={l1,l2,l3,…,ln},将隐藏信息编码组(c2k-1,c2k)隐藏在L中,由于隐藏时可能需要对L中元素加1或减1,设置一变量sig,当K≥0时,sig=1,否则sig=-1,li+sig为修改后的值;设隐藏后的元素为l′i,根据(c2k-1,c2k)取值情况确定隐藏方法。
具体如下:
(1)(0,0)的隐藏
从L中取li,li+1,li+2连续3个元素作为载体信息,隐藏方法如下:
l′i+j=li+j(0≤j≤2)
(0,0)对应含密信息组为(K,K,K),下一组编码从li+3开始隐藏;
(2)(1,1)、(2,2)和(3,3)的隐藏
从L中取li,li+1,li+2,li+3连续4个值为K的元素作为载体,隐藏方法如下:
隐藏后编码组与信息组的对应关系为:
(1,1)对应含密信息组为(K+sig,K,K,K);
(2,2)对应含密信息组为(K,K+sig,K,K),
(3,3)对应含密信息组为(K,K,K+sig,K),下一组编码从li+4开始隐藏;
(3)其他编码组的隐藏
设m=max(c2k-1,c2k),从L中取li,li+j,…,li+m+1连续m+2个元素作为载体信息,其中li+m+1为标志位,通过l′i+m+1确定c2k-1和c2k的大小关系,令隐藏方法如下:
隐藏后编码组与信息组的对应关系为:
(0,1)对应含密信息组为(K+sig,K+sig,K+sig);
(1,0)对应含密信息组为(K+sig,K+sig,K);
(0,2)对应含密信息组为(K+sig,K,K+sig,K+sig);
(2,0)对应含密信息组为(K+sig,K,K+sig,K);
(1,2)对应含密信息组为(K,K+sig,K+sig,K+sig);
(2,1)对应含密信息组为(K,K+sig,K+sig,K);
(0,3)对应含密信息组为(K+sig,K,K,K+sig,K+sig);
(3,0)对应含密信息组为(K+sig,K,K,K+sig,K);
(1,3)对应含密信息组为(K,K+sig,K,K+sig,K+sig);
(3,1)对应含密信息组为(K,K+sig,K,K+sig,K);
(2,3)对应含密信息组为(K,K,K+sig,K+sig,K+sig);
(3,2)对应含密信息组为(K,K,K+sig,K+sig,K);
下一组编码从li+m+2开始隐藏。
从上可得到编码组与隐藏载体的一一对应关系,按需要载体数从小到大进行排序,当载体数相同时按修改载体信息量从小到大排序,排序后的对应关系如下:
(0,0)f(K,K,K)在3个载体数据隐藏4位信息并且不修改原始载体信息;
(1,0)f(K+sig,K+sig,K)在3个载体数据隐藏4位信息修改2个原始载体信息;
(0,1)f(K+sig,K+sig,K+sig)(在3个载体数据隐藏4位信息修改3个原始载体信息;
在4个载体数据隐藏4位信息修改1个原始载体信息;
在4个载体数据隐藏4位信息修改2个原始载体信息;
在4个载体数据隐藏4位信息修改3个原始载体信息;
在5个载体数据隐藏4位信息修改2个原始载体信息;
在5个载体数据隐藏4位信息修改3个原始载体信息;
隐藏相同位数的信息,若需要的载体信息数量越少,则隐藏容量越大;当载体数量相同时,载体修改量越小,则对载体图像改变越小。
为了得到较大的隐藏容量和较好的隐藏效果,统计隐藏信息编码组的频数并按编码组频数进行排序,设频数降序排列16个编码组为m1,m2,…,m16,将频数降序排列16个编码组作为密钥发送给接受方;将编码组进行变换,使频数大编码组隐藏所需的载体信息少,提高隐藏容量和质量。
编码组变换及对应载体隐藏后的关系如下:
通过上述方法将编码组隐藏在L中,若L剩余元素个数小于5时,则剩余元素不隐藏信息。编码组隐藏在值为K的元素中得到含有编码组信息序列L′,L′中元素的值为K或K+sig,为实现可逆隐藏需对S中值不为K的元素进行修改,使含有隐藏信息的元素与不含有隐藏信息的元素不重叠,根据L′中的元素值对S中隐藏信息位进行修改,设S中没有隐藏信息位修改后的值为si',修改方法如下:
通过以上处理可实现可逆信息隐藏。
3、提取隐藏信息恢复载体信息
设载密序列为S′,由隐藏方法可知,值为K或K+sig的元素中含有秘密信息,在S′中求出所有值为K或K+sig的元素,在这些元素中根据隐藏算法提取隐藏信息;设元素序列为L′={l′1,l'2,…,l'n},在L′中从l′1开始,取连续的3个元素l′i,l′i+1,l′i+2,根据下面4种情况提取编码组;
(1)若e=0,可知在l′i,l′i+1,l′i+2中没有元素被修改,则提取编码组如下:
下一组编码提取从l′i+3开始提取;
(2)若e=1,则在l′i,l′i+1,l′i+2中修改了1个元素,需根据di+3的取值情况提取编码组:
①di+3=0,说明隐藏时在l′i,l′i+1,l′i+2,l′i+3中修改了1个元素,则c2k-1=c2k≠0,若di+j=1(0≤j≤2),则提取编码组如下:
下一组编码提取从l′i+4开始;
②若di+3=1,说明隐藏时在l′i,l′i+1,l′i+2,l′i+3中修改了2个元素,在这4个元素中,必存在a,b(0≤a,b≤3)使得l′i+a=1,l′i+b=1,然后根据元素大小标记位l′i+4取值提取编码组;
当di+4=0,则c2k-1>c2k,提取编码组如下:
当di+4=1,则c2k-1<c2k,提取编码组为:
下一组编码提取从l′i+5开始;
(3)若e=2,说明隐藏时在l′i,l′i+1,l′i+2中修改了2个元素,可由下述两种情况提取编码组:
①若l′i+2为编码组两个元素大小标记位,由于di+2=0,可知c2k-1>c2k,提取编码组如下:
下一组编码提取从l′i+3开始;
②若则需根据元素大小标记位l′i+3取值提取编码组,隐藏时修改了2个元素,必存在a,b(0≤a,b≤2)使得l′i+a=1,l′i+b=1。当di+3=0,说明c2k-1>c2k,提取编码组如下:
当di+3=1,说明c2k-1<c2k,提取编码组如下:
下一组编码提取从l′i+4开始;
(4)若e=3,可知l′i+2为编码组两个元素大小标记位,由于di+2=1,可知c2k-1<c2k,提取编码组如下:
下一组编码提取从l′i+3开始;若L′剩余元素少于5个,则结束提取;
根据编码组变换关系恢复原始隐藏编码如下:
最后将提取的编码组转化成二进制隐藏信息,对S'中元素进行修改恢复载体信息,修改方法如下:
通过修改可恢复载体信息。
本发明的优点:本发明提供一种编码分组的可逆信息隐藏方法,可将频数较大的编码组隐藏在较少数量的载体信息,具有较高的隐藏容量。且本方法可应用于各种基于直方图的可逆信息隐藏算法中,具有较好的适用性。
实施例
假设隐藏信息为{1011101100010000010110111011},首先将二进制隐藏信息转换成十进制编码,对十进制编码两两分组;
统计编码组的频数并按频数从大到小排序如下;
编码组 |
频数 |
(2,3) |
4 |
(0,1) |
2 |
(0,0) |
1 |
统计结果:(2,3)出现4次,(0,1)出现2次,(0,0)出现1次。
根据编码组的隐藏方法:
(2,3)隐藏后的载体信息为(K,K,K+sig,K+sig,K+sig):
(0,1)隐藏后的载体信息为(K+sig,K+sig,K+sig);
(0,0)隐藏后的载体信息为(K,K,K);但(2,3)出现的频数最大,(0,1)出现的频数次之,(0,0)出现的频数最少,需对编码进行变换,频数大的编码需要的载体少,变换关系为最后可得到如下的编码组与载体隐藏后对应关系:
编码组 |
隐藏后信息 |
(2,3) |
(K,K,K) |
(0,1) |
(K+sig,K+sig,K); |
(0,0) |
(K+sig,K+sig,K+sig) |
假设载体序列如下:
0 |
1 |
2 |
0 |
0 |
3 |
4 |
0 |
0 |
0 |
0 |
5 |
0 |
0 |
0 |
0 |
2 |
0 |
0 |
0 |
0 |
0 |
0 |
2 |
0 |
0 |
0 |
0 |
1 |
1 |
其中,待隐藏值为K=0,从载体序列中选出所有值为K的元素如下:
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
根据对应关系将编码组逐一隐藏在值为K的元素中,隐藏结果如下表所示:
0 |
0 |
0 |
0 |
0 |
0 |
1 |
1 |
0 |
1 |
1 |
1 |
1 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
由于隐藏后元素为K或K+sig,需对载体序列中值不为K的元素进行修改,大于K的元素都加sig,最后可得到载密序列如下表所示(其中黑体的元素含有秘密信息):
0 |
2 |
3 |
0 |
0 |
4 |
5 |
0 |
0 |
0 |
1 |
6 |
1 |
0 |
1 |
1 |
3 |
1 |
1 |
1 |
0 |
0 |
0 |
3 |
0 |
0 |
0 |
0 |
2 |
2 |
由上述例子可知21个载体信息可以隐藏28位隐藏信息,1个载体信息平均可以隐藏1.3位隐藏信息。
提取隐藏信息时,可根据载密序列和嵌入方法提取秘密信息,恢复原始载体序列。
载密序列如下(其中黑体的元素含有秘密信息):
0 |
2 |
3 |
0 |
0 |
4 |
5 |
0 |
0 |
0 |
1 |
6 |
1 |
0 |
1 |
1 |
3 |
1 |
1 |
1 |
0 |
0 |
0 |
3 |
0 |
0 |
0 |
0 |
2 |
2 |
由嵌入方法可知,载密序列中值为0或1的元素含有隐藏信息,提取含密元素如下表所示:
0 |
0 |
0 |
0 |
0 |
0 |
1 |
1 |
0 |
1 |
1 |
1 |
1 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
设上述含密元素序列为L′,从L′顺序提取若干个元素提取编码组,可知这3个元素嵌入时没有被修改,可提取编码组(0,0), 其中L'9为标志位,可提取编码组(1,0),其中L'12为标志位,可提取编码组(0,1),可提取编码组(1,0),可提取编码组(0,0),可提取编码组(0,0)。对编码组进行变换,得到编码组信息(2,3)(2,3)(0,1)(0,0)(0,1)(2,3)(2,3),最后将编码组解码得到二进制隐藏信息。
由于隐藏时,对值为K元素加一或不变,对值大于K的元素加一,恢复原始载体序列时,需对大于K的元素减一,得到载体序列如下:
0 |
1 |
2 |
0 |
0 |
3 |
4 |
0 |
0 |
0 |
0 |
5 |
0 |
0 |
0 |
0 |
2 |
0 |
0 |
0 |
0 |
0 |
0 |
2 |
0 |
0 |
0 |
0 |
1 |
1 |
与原始载体序列相同。
参照图1,为位图格式的隐藏信息,分别为100×100的cameraman图、159×271的logo图、256×256的finger图、256×256的brain图,将图像转换成二进制隐藏信息的大小分别为80000bits、334712bits、524288bits和524288bits。
表1隐藏相同容量本发明与直方图所需载体数对比
隐藏图像 |
隐藏容量 |
直方图方法需载体数 |
本发明需载体数 |
cameraman.bmp |
80000bits |
80000 |
77380 |
logo.bmp |
334712bits |
334712 |
296697 |
finger.bmp |
524288bits |
524288 |
504198 |
brain.bmp |
524288bits |
524288 |
459849 |
隐藏容量是将隐藏图像转换成二进制信息的比特数,直方图方法中一个载体只能隐藏1位比特,而本发明的方法一个载体平均可隐藏的比特数大于1,表1为本发明与直方图方法所需载体个数的对比,从表1中可以看出隐藏相同容量的信息本发明需要的载体个数比直方图少,本发明具有较高的隐藏容量。
参照图2为载体图像,其中像素值168用于隐藏信息,K=168。
参照图3为文本形式的隐藏信息。
参照图4为载密图像,同样具有较好的视觉效果。
参照图5为提取出的秘密信息,与隐藏的秘密信息是相同的。
参照图6为无损恢复出的原始图像。