一 误差预测所用方法
1.中值预测器
使用中值预测器MED(Median Edge Detector),对图中x的左、上和左上三个相邻像素,预测出x的预测值px。
2.根据预测误差产生的位图(Location binary map)
位图(Location binary map),可以理解为记录错误位置的图/能找到预测错误位置的地图。
此处的位图标记原始值x和预测值px前两位MSB的预测错误。
用数学详细来讲就是:

然后查看 与
是否相等,相同则位图标记为0否则标记为1。
二 图像加密原理
1.图像加密原理
对单个像素:
像素位置为(i, j)。
首先将0到255范围的像素转化为二进制。用数学表示就是:

然后用加密密匙生成伪随机序列,长度算得出来,对于大小为(M, N)的单通道灰度图片,随机序列长度为
。
用加密序列与图像进行异或,得到加密图像。

不用说,加密图像的十进制表示可以计算出来。
2.初学建议采用 Logistic混沌加密
直接贴代码:
def crypt(im, miu, x0):
'''
logistic混沌加密
:param im: 待加密图像
:param miu: μ参数
:param x0: x0参数
:return: 返回密文图像
'''
h, w = im.shape
c_ = np.zeros_like(im)
c_[0][0] = x0
c=[]
c.append(x0)
result = np.zeros_like(im)
result[0][0] = (x0 * pow(2, 48)) % 256
for x in range(1, h * w):
i = x // w
j = x % w
c.append(miu * c[x - 1] * (1 - c[x - 1]))
c_[i][j] = (c[x] * pow(2, 48)) % 256
for i in range(h):
for j in range(w):
result[i][j] = im[i][j] ^ c_[i][j]
return result
简单讲一下要注意的:
要保证加密效果,miu参数和x0参数得在一下范围:
①
②
三 嵌入分块原则与错误标记方法
因为图像是用预测的方式压缩信息,那么可以想到最简单的方法就是在预测正确之处进行信息嵌入,在预测错误之处标记错误并等待算法处理,以便后续的图像无损恢复工作的开展。对于正确之处与错误之处的界限位置的识别,就可以使用分块的方法来处理。事实上,这篇文章就是这样做的。
分块:扫描顺序为从左到右、从上到下,扫描时4个像素为一组。
错误标记:出现了预测错误,则对错误位置前后分块进行处理,前后块4个像素的8个MSB都置1,如图:
这样,碰到同样块,出错的几率是。
四 嵌入过程
用图像加密密匙加密,得到加密后的图像
,其中每个像素为
,然后根据位图中的tags决定是否是可嵌入的块,可嵌入则嵌入该块中4像素的8个MSB。嵌入公式如下:
注意,由于我们使用了中值预测器,所以第一行和第一列不嵌入信息。
五 信息提取与图像无损恢复
3种情况:
1.只有图像加密密匙,则你只能无损恢复图像
首先用图像加密密匙生成解密序列,然后按位与图像进行异或操作,总之就是反照图像加密的原理来操作。具体数学公式如下:

相比原图,只有嵌入了秘密信息和标记错误的地方会不同。
嵌入秘密信息的部分,既然能嵌入那自然是没有预测误差,直接按中值预测的结果嵌入其2位MSB就行。
标记了错误的地方,就根据标记的情况进行更改就行。
2.只有信息隐藏密匙,那么你只能提取秘密信息
按分块扫描除了第一行、第一列的所有像素,再按错误标记的原则识别错误处,其余地方作为秘密信息提取出来。
然后用你已有的信息隐藏密匙对提取的信息处理,得到解密后可读的秘密信息。
3.两个密匙、
都有,那么你既可以无损恢复图像,还可以提取完整秘密信息。具体步骤参照上方。