算法思想
把一个二值图像分成矩形图像区域Bi,若某块p1bi > 50% 则嵌入一个1,若p0bi > 50% 则嵌入一个0
但是在嵌入的过程中需要对一些像素的颜色进行调整。
准备1——计算可以利用的块
由上图可以看出,只有当一个块中0或者1的比例落在某个区间并且结合消息是0or1才可以决定这一块究竟是藏0还是藏1
为了简化我们将一幅图片分为10*10的大小,同时我们采用8*8检测,于是可以严格8*8检测的就只剩下中间的64个块了
我们假设有:
- msg 要隐藏的消息
- count 消息的长度
- image 二值图像
- R1,R0,lumda 是我们设置的参数
- computep1bi函数可以计算出某个块的p1bi
- row,col是为了随机隐藏我们随机选择的块首地址
我们需要确定的就是随机选出来的row
和col
是否可以用,于是很自然地想到需要对8*8的块进行遍历,同时标记col
和row
是否可用,不可用的直接将其设为-1
1 | % 最后计算哪些是可以用的存起来 |
完整代码
1 | %分析可用的图像块与秘密信息对应 |
准备2——修改像素点
1 | %修改像素的函数 |
这里其实就是针对中间的64个块进行8连接检测。关于8连接检测边界的做法,我的理解就是只要一个像素点周围的8个点有一个不一样就说明这个点是可以修改的,并且为了防止边界扩散,我们并不直接取反,而是取反后+0.01
准备3——计算p1bi的函数
1 | function p1bi = compute1bi(headr,headc,image) |