本文介绍论文《基于自适应哈夫曼编码的密文可逆信息隐藏算法》的基本算法流程。
一 哈夫曼编码
哈夫曼编码(Huffman Coding),又称霍夫曼编码。Huffman于1952年提出这种编码方式。主要功能就是缩短编码长度。论文采用哈夫曼编码,目的就是尽可能的缩短位图(bit map)的编码长度,节省存储空间。
此处只简述构建方法。具体详细说明还有唯一可译性等解释可参考我的这篇文章:
一文搞懂哈夫曼编码如何根据哈夫曼树构造及其唯一可译性_zrc007007的博客-CSDN博客
熟悉可跳过。
构建方法
首先构建哈夫曼树。构建哈夫曼树的原则就是①先合并权值最小,在具体应用中就是出现频率最小的两个节点;②所有节点必须都在树上。
比如我们有5种字符,ABCDE,出现频率如下:
然后合并权值/出现概率最小的两项,这里就是0.1的A和0.15的B。后面类似。
其余合并过程如下:
然后根据哈夫曼树进行编码,就可以得到哈夫曼编码了。我们先确认编码规则,很简单,左边标1,右边标0,还是左边标0,右边标1。比如我们这里选左边标1,右边标0,那标出来的结果就是这样的:
所以编码结果如下:
A 111
B 110
C 101
D 100
E 0
二 中值预测器MED
中值预测器(Median Edge Detector, MED),指用图像中值进行预测的预测器。一般保留图像的第一行和第一列,然后根据以下公式,用当前像素的左、上、左上像素值预测其值:
比如一个这样的块:
然后用中值预测的结果应该是这样:
三 用哈夫曼编码、中值预测器生成位图、嵌入信息
生成哈夫曼编码结果
还是上面的例子。我们首先把原始值与预测结果转化为二进制。
列一下转化为二进制的公式吧:
然后比较各像素最多前多少位与预测值一样。所产生的值就是标记值label。
比如原值x=158与预测值px=164的比较。
如上面图像块的比较结果就如下:
然后统计各值出现的次数,再对其进行哈夫曼编码,除了第一行第一列标记的-1。比如这里统计的结果如下:
生成嵌入信息
位图嵌入信息如下:
其中为哈夫曼编码,也就是后面的的长度的二进制形式,也就是上面表格中码长2、4、4、3、1等的二进制形式,分别用4位进行存储;
为具体的哈夫曼编码,就是上面表格中的码字;
为用该码字对位图进行编码的总编码长度对应的二进制形式,计算公式如下:
而对m×n的图像,用位存储;
为位图具体的位二进制序列,就是位图的具体信息了。前面的则都是附加信息。
四 图像加密
用加密密匙生成一个伪随机矩阵,必须要和图像同样大小,比如都得是m×n。然后都转化为二进制,执行按位异或操作。公式如下:
其中⊕为按位异或操作。记得再转换回来十进制(如下公式)。
五 嵌入
嵌入位图
首先保存图像第一行、第一列的信息,这些信息在位图之后嵌入,然后用空出来的位置首先嵌入位图,至于另一部分,则按如下公式嵌入:
为要嵌入的信息,为中当前像素的位图标记值。
你可能会有疑惑,欸,为啥7位和8位一样都是全部嵌入,这个嵌入是不是多了一个比特位啊,别着急,嵌入秘密信息时也是一样的,然后我会一起解释。
嵌入秘密信息
同样是比最大相同MSB位多一位来嵌入秘密信息。
顺着嵌入完位图、首行首列的参考像素信息后,余下的空间就可以嵌入秘密信息了(提一嘴,通常加密了)。
为什么要多一位来嵌入秘密信息呢?因为多的那一位,是可以通过取反来预测的!所以这一位也是可以预测的,所以可以这么嵌入。
六 提取和恢复
信息提取
按顺序提取位图、首行列的参考像素信息,后面的就是秘密信息了。通常配了一个数据隐藏密匙,用这个解密之后就可以得到了秘密信息。
图像恢复
按原则,位图的t位是一样的,第t+1位是取反能够得到的,所以这t+1位就是预测可得。(当然,如果t=8,t+1的说法就是全部都预测可得,不用取反了)剩下的没有动,只要有图像加密密匙就能通过和加密过程一样的解密操作解出来。所以稍微放一下公式吧:
其中
高t位MSB预测可得
第t+1位取反可得
剩下的mod取余,解密可得。