- matlab
- 以块为单位,将块分为调整区和嵌入区,利用差分扩展将调整区中的像素的MSB嵌入嵌入区,加密后通过改变调整区像素的MSB使块平均像素与原始平均像素值基本一致从而达到缩略图保持。
- 云端的图片保存等
- 记录调整区的MSB
- 对嵌入区的像素进行分类
- 每两个像素为一组
- 计算两个像素之间的平均值以及差值
- l = [x+y]/2
- h = x-y
- 通过判断 |2h+b| , |2[h/2]+b| 与 min(2(255-l),2l+1) 之间的关系,从而对每组像素进行分类
- EZ :h=0 || h=-1
- EN : |2*h+b| <= min(2(255-l), 2l+1) 即可拓展集合
- CN : |2*[h/2]+b| <= min(2(255-l), 2l+1 即可变集合
- NC : 不满足上述两个条件,即不可变区
- 考虑到空间因素,将EN分为EN1和EN2两部分一部分作为可拓展部分,一部分作为可变部分
- 生成待嵌入数据
- locate-map用于标记可拓展像素组
- 对属于EN2和CN集合的像素组的h的LSB部分进行收集(h=1 || h=-2时不用记录)
- 调整区的MSB部分
- (若MSB>1,则将每个像素的同一位一起保存,例如将每个像素的最高位收集在一起,然后将次高位收集存在所有最高位之后)
- 将locate-map以及MSB部分进行游程编码来进行压缩
- 整合为块嵌入数据: data = Encode(locate-map) + LSB + Encode(MSB)
- 进行预备工作
- 对于可拓展像素组
- h' = 2*h
- 对于可变像素组
- h' = 2*[h/2]
- x' = l+[(h'+1)/2]
- y' = l-[h'/2]
- 对于可拓展像素组
- 整合待嵌入数据
- 对块内得到的数据信息进行编码,这里采用的是当遇到连续8个‘1’时,在后面加上‘0’
- 对块与块数据之间插入分隔符‘01111111110’用于区别
- 对图像整体进行数据嵌入
- 通过判断 |2*[h/2]+b| 与 min(2(255-l),2l+1) 之间的关系,从而对每组像素进行分类
- CH :|2*[h/2]+b| <= min(2(255-l), 2l+1 即可变集合
- NC :不可变区
- 对于可变像素组
- h' = h+b (b为待嵌入比特)
- 若数据已经嵌入完成,则不再进行嵌入操作
- x' = l+[(h'+1)/2]
- y' = l-[h'/2]
- 通过判断 |2*[h/2]+b| 与 min(2(255-l),2l+1) 之间的关系,从而对每组像素进行分类
- 此处用简单的流加密方式进行加密,当然可以采用更安全的加密方式(包括会改变像素位置的加密方式,但一定要记录可调整区像素位置用于调整)
- 通过不断改变调整区像素的MSB,找出所有可能中最接近于原图像块平均像素的一组数据(即遍历查找)
- 此处和加密一致,直接将加密过程用于解密即可
- 将嵌入区的像素组分类
- 两个像素一组
- 计算两个像素之间的平均值以及差值
- l = [x+y]/2
- hh = x-y
- 通过判断 |2*[h/2]+b| 与 min(2(255-l),2l+1) 之间的关系,从而对每组像素进行分类
- CH :|2*[h/2]+b| <= min(2(255-l), 2l+1 即可变集合
- NC :不可变区
- 可变集合CH中的hh的LSB位即为嵌入的信息
- 对提取的信息进行解码,并根据分隔符将整体嵌入信息分解为各个块的嵌入信息
- 计算出嵌入信息各组成部分压缩前的大小
- locate-map:(blocksize-2)*(blocksize-2)/2
- MSB:blocksize*4-4
- LSB:size(data) - size(locate-map) - size(MSB)
- 对经过压缩的嵌入数据进行还原
- 从data的首部开始:边还原MAP边对已经还原的MAP元素个数进行计算,当达到locate-map原大小时停止
- 从data的尾部开始:边还原MSB边对已经还原的MSB元素个数进行计算,当达到MSB原大小时停止
- 两部分中间的即为LSB部分
- 将嵌入区的像素组分类
- 两个像素一组
- 计算两个像素之间的平均值以及差值
- l = [x+y]/2
- hh = x-y
- 通过判断 |2*[h/2]+b| 与 min(2(255-l),2l+1) 之间的关系,从而对每组像素进行分类
- CH :|2*[h/2]+b| <= min(2(255-l), 2l+1 即可变集合
- NC :不可变区
- 对可变区的像素进行还原
- 对于属于EZ & EN1的像素组(即locate-map中值为1): h = [hh/2]
- 0 <= hh <= 1: h = 1
- 12 <= hh <= -1: h = -2
- else: h = 2*[hh/2]+LSB
- x = l+[(h+1)/2]
- y = l-[h/2]
- 对调整区像素进行还原
- pixel = pixel(8-MSB)+MSB