♻️ 资源大小535KB➡️资源下载https://download.csdn.net/download/s1t16/874253811. 二值图像中的信息隐藏1.1. 二值图像由黑白象素的分布构成图像。1.2. 通常方法利用图像区域中黑色象素的个数对秘密信息进行编码。2. 二值图像信息隐藏的两种方法2.1. 方法一2.1.1. 嵌入把一个二值图像分成 L(m) 个矩形图像区域 Bi 如果其中黑色象素的个数大于一半则表示嵌入 0 如果白色象素的个数大于一半则表示嵌入 1 。当需要嵌入的比特与所选区域的黑白象素的比例不一致时为了达到希望的象素关系则需要修改一些象素的颜色。修改应遵循一定的规则原则是不引起感观察觉。修改应在黑白区域的边缘进行 。2.1.2. 需注意的细节应考虑有一定的冗余度。确定有效区域。确定两个阈值 R1 50% 和 R0 50% 以及一个健壮性参数 λ 。隐藏 0 时该块的黑色象素的个数应属于 [R1 , R1 λ] 隐藏 1 时该块的黑色象素的个数应属于 [R0 - λ , R0] 。如果为了适应所嵌入的比特目标块必须修改太多的象素就把该块设为无效。标识无效块将无效块中的象素进行少量的修改使得其中黑色象素的百分比大于 R1 3λ 或者小于 R0 - 3λ 。2.1.3. 提取判断每一个图像块黑色象素的百分比如果大于 R1 3λ 或者小于 R0 - 3λ 则跳过这样的无效块。如果在 [R1 , R1 λ] 或者 [R0 - λ , R0] 的范围内则正确提取出秘密信息 0 或 1 。2.2. 方法二利用游程编码的方法例编码 a0, 3 a1, 5 a2, 4 a3, 2 a4, 1 2.2.1. 嵌入修改二值图像的游程长度。如果秘密信息位是 0 则修改该游程长度为偶数如果为 1 则修改游程长度为奇数如果秘密信息的取值与游程长度的奇偶性相匹配则不改变游程长度。2.2.2. 提取根据游程长度的奇偶性提取出秘密信息。3. 代码实现与解释使用 MATLAB 实现了第二种方法即 2.2. 中的利用游程编码的方法用 decode.m 实现秘密信息嵌入用 encode.m 实现秘密信息提取嵌入时用到了 str2bit 和 Vector2Matrix 两个函数做待隐藏信息的编码处理提取时用到了 bit2str 函数解码比特串为正常字符串。3.1. encode.mclear all; oiimread(载体图片.bmp);%打开载体图像 [row col]size(oi); oioi(:);%将矩阵竖向排开变成一列 lensize(oi); %统计游程长度 i1; j1; while ilen(1) oroi(i,1); count1; while (ilen(1)oi(i1,1)or) ii1; countcount1; end RLE(j)count; jj1; ii1; end if ilen(1) RLE(j)1; end RLERLE; %将秘密信息转化为二进制 msgfidfopen(隐藏信息.txt,r);%打开秘密文件 [msg,msgcount]fread(msgfid); fclose(msgfid); msg str2bit(msg); msg msg; msgcountmsgcount*8; %利用游程编码的方法将秘密信息嵌入图片 for l1:msgcount modpoint0; for x1:2*l modpointmodpointRLE(x,1); end if msg(l,1)0 if ((mod(RLE(2*l,1),2)~0)(RLE(2*11,1)~1)) oi(modpoint1,1)mod((oi(modpoint1,1)1),2); end else if ((mod(RLE(2*l,1),2)0)(RLE(2*11,1)~1)) oi(modpoint1,1)mod((oi(modpoint1,1)1),2); end end end %存储处理后的图片 m1Vector2Matrix(oi,row);%将数组转换成为二维矩阵 imwrite(m1,载体图片_隐藏信息.bmp); %显示处理前后的图片 figure; imshow(载体图片.bmp); title(处理前); figure; imshow(载体图片_隐藏信息.bmp); title(处理后);待隐藏信息保存在 隐藏信息.txt 中取出信息编码为二进制比特串才能进行隐藏。为了方便处理先将图片信息存到一维数组中对其游程的奇偶性做更改再转换为二维数组存回图片完成信息隐藏。3.2. decode.mclear all; oiimread(载体图片_隐藏信息.bmp); %打开携密图像 [row col]size(oi); oioi(:);%将矩阵竖向排开变成一列 lensize(oi); %统计游程长度 i1; j1; while ilen(1) oroi(i,1); count1; while (ilen(1)oi(i1,1)or) ii1; countcount1; end RLE(j)count; jj1; ii1; end if ilen(1) RLE(j)1; end RLERLE; %将游程信息提取为二进制比特串 msgcount256; for i1:msgcount msg(i,1)0; end for l1:msgcount if mod(RLE((2*l),1),2)0 msg(l,1)0; %如果游程的值为偶数表示隐藏的信息为0 else msg(l,1)1; %如果游程的值为奇数表示隐藏的信息为1 end end %将比特串解码为字符串后保存到文件 outbit2str(msg); fidfopen(提取信息.txt, wt); fwrite(fid, out); fclose(fid);提取与隐藏类似但只需要对隐藏信息的载体图片的游程进行统计以获得相应的二进制比特串之后再解码为正常的字符串即可。3.3. 字符串处理函数见文件 str2bit.mVector2Matrix.mbit2str.m 分别用来将字符串编码为比特串、将数组转换成为二维矩阵、将比特串解码为字符串比较简单不做详细解释。4. 实验结果展示4.1. 原始图片载体图片.bmp4.2. 待隐藏秘密信息隐藏信息.txt4.3. 嵌入秘密信息后的图片载体图片_隐藏信息.bmp4.4. 从图片提取的秘密信息提取信息.txt