当前位置: 首页 > news >正文

基于 MATLAB 实现的二值图像中的信息隐藏

♻️ 资源

大小:535KB

➡️资源下载:https://download.csdn.net/download/s1t16/87425381

1. 二值图像中的信息隐藏

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.m

clear all; oi=imread('载体图片.bmp');%打开载体图像 [row col]=size(oi); oi=oi(:);%将矩阵竖向排开变成一列 len=size(oi); %统计游程长度 i=1; j=1; while i<len(1) or=oi(i,1); count=1; while (i<len(1)&&oi(i+1,1)==or) i=i+1; count=count+1; end RLE(j)=count; j=j+1; i=i+1; end if i==len(1) RLE(j)=1; end RLE=RLE'; %将秘密信息转化为二进制 msgfid=fopen('隐藏信息.txt','r');%打开秘密文件 [msg,msgcount]=fread(msgfid); fclose(msgfid); msg = str2bit(msg); msg = msg'; msgcount=msgcount*8; %利用游程编码的方法将秘密信息嵌入图片 for l=1:msgcount modpoint=0; for x=1:2*l modpoint=modpoint+RLE(x,1); end if msg(l,1)==0 if ((mod(RLE(2*l,1),2)~=0)&&(RLE(2*1+1,1)~=1)) oi(modpoint+1,1)=mod((oi(modpoint+1,1)+1),2); end else if ((mod(RLE(2*l,1),2)==0)&&(RLE(2*1+1,1)~=1)) oi(modpoint+1,1)=mod((oi(modpoint+1,1)+1),2); end end end %存储处理后的图片 m1=Vector2Matrix(oi,row);%将数组转换成为二维矩阵 imwrite(m1,'载体图片_隐藏信息.bmp'); %显示处理前后的图片 figure; imshow('载体图片.bmp'); title('处理前'); figure; imshow('载体图片_隐藏信息.bmp'); title('处理后');

待隐藏信息保存在 隐藏信息.txt 中,取出信息编码为二进制比特串才能进行隐藏。为了方便处理,先将图片信息存到一维数组中对其游程的奇偶性做更改,再转换为二维数组存回图片,完成信息隐藏。

3.2. decode.m

clear all; oi=imread('载体图片_隐藏信息.bmp'); %打开携密图像 [row col]=size(oi); oi=oi(:);%将矩阵竖向排开变成一列 len=size(oi); %统计游程长度 i=1; j=1; while i<len(1) or=oi(i,1); count=1; while (i<len(1)&&oi(i+1,1)==or) i=i+1; count=count+1; end RLE(j)=count; j=j+1; i=i+1; end if i==len(1) RLE(j)=1; end RLE=RLE'; %将游程信息提取为二进制比特串 msgcount=256; for i=1:msgcount msg(i,1)=0; end for l=1:msgcount if mod(RLE((2*l),1),2)==0 msg(l,1)=0; %如果游程的值为偶数,表示隐藏的信息为0 else msg(l,1)=1; %如果游程的值为奇数,表示隐藏的信息为1 end end %将比特串解码为字符串后保存到文件 out=bit2str(msg); fid=fopen('提取信息.txt', 'wt'); fwrite(fid, out); fclose(fid);

提取与隐藏类似,但只需要对隐藏信息的载体图片的游程进行统计以获得相应的二进制比特串,之后再解码为正常的字符串即可。

3.3. 字符串处理函数

见文件 str2bit.mVector2Matrix.mbit2str.m ,分别用来:将字符串编码为比特串、将数组转换成为二维矩阵、将比特串解码为字符串,比较简单,不做详细解释。

4. 实验结果展示

4.1. 原始图片

载体图片.bmp


4.2. 待隐藏秘密信息

隐藏信息.txt

4.3. 嵌入秘密信息后的图片

载体图片_隐藏信息.bmp


4.4. 从图片提取的秘密信息

提取信息.txt

http://www.jsqmd.com/news/679995/

相关文章:

  • 从调频信号(Chirp)到故障诊断:手把手教你用MATLAB玩转瞬时频率分析
  • 2026年Q2聚氨酯砂浆彩砂地面采购指南:固耐特聚氨酯砂浆、广东固耐特、广州固耐特、聚氨酯砂浆地坪厂家、聚氨酯砂浆地坪材料选择指南 - 优质品牌商家
  • 从Transformer到AI Agent的深度解析,带你领略大型语言模型的核心技术!
  • STM32H7的USB虚拟串口,从CubeMX配置到Python测速,保姆级避坑指南
  • # 发散创新:基于Python的虚拟原型快速构建实践与实战代码解析在现代软件开发流程中,**虚拟原型(Virtual Prototy
  • 2026年4月燕窝十大品牌盘点:燕窝品牌、东南燕都、官燕苑常温鲜炖燕窝、官燕苑燕窝、官燕苑现炖燕窝、官燕苑生态燕窝选择指南 - 优质品牌商家
  • 宝塔面板无法识别数据库配置_检查配置文件是否存在乱码
  • 从面试题到Verilog实战:用两个半加器搭建全加器的完整思路与代码
  • Java工程师正在悄悄淘汰ThreadPoolExecutor?Loom响应式编程准入门槛已降至3天,你还在手动管理Future吗?
  • 好的推客系统,让商家越做越轻松
  • 手机拍HDR总有重影?聊聊动态场景多帧融合的演进与手机摄影中的实际应用
  • 如果外星人用‘微信’:从射电信号到中微子通信,地外文明可能用什么技术?
  • 从电路图到代码:蓝桥杯开发板外设(LED/数码管/电机)控制逻辑全梳理
  • 从‘NoneType‘错误看Python代码健壮性:我的5个防御性编程习惯
  • 用Verilog HDL手把手教你实现半加器和全加器(附完整代码和仿真测试)
  • Java 25虚拟线程上线即崩?:4个被官方文档隐瞒的JVM参数配置雷区与72小时热修复方案
  • STM32F405RG主频降到84MHz才稳定?聊聊MotorControl Workbench工程里那些硬件坑
  • Rdkit|分子可视化实战:从基础绘制到批量生成与3D展示
  • 避坑指南:OpenFOAM造波算例初始场设置常见错误与setFields替代方案
  • 从心电图到股价:分形维数DFA算法在Python中的实战指南与避坑要点
  • 树莓派4B网络启动踩坑实录:从Armbian服务器配置到NFS挂载的完整避坑指南
  • 别再手动清空SD卡了!在STM32F407上集成FATFS格式化功能,实现设备端一键维护
  • Dify文档解析配置极简主义实践:删掉83%冗余字段后,解析吞吐量提升4.2倍——来自金融级合规场景的配置精简清单
  • 新手易懂!如何修改excel表格创建的时间,6种实测方法
  • MPU-6000/6050选型避坑指南:SPI和I2C接口到底该怎么选?
  • Rdkit|从静态到交互:分子可视化的进阶实践
  • C# 14 AOT × Dify客户端:首份跨平台(Windows/Linux/macOS ARM64)启动延迟基准测试报告(含JIT vs AOT 12项硬指标)
  • 从PIL到Pillow:一个Python图像库的‘复活’故事与实战避坑指南
  • 从Swagger到Word:我是如何用docx.js v7.4.1为OpenAPI工具实现自动化文档生成的
  • 2026 金融通信加密全栈指南:国密算法落地、TLS 1.3 部署与量子安全预研