matlab实现基于24位真彩色BMP图像的文件信息隐藏方法(实验内容)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


一、24位真彩色BMP图像

1.简介

BMP是英语BitMap(位图)的缩写,是Windows系统中的标准图像文件格式,而且文件几乎没有压缩,因此信息完全。

首先,需要知道BMP文件里面的字节数据有四个部分,分别是:位图文件头(bitmap-file header)、位图信息头(bitmap-information header)、彩色表(color table)、定义位图的字节(即位图数据Data Body)阵列。但是对于我们现在要讨论的24位真彩的BMP文件来说,里面不存在彩色表,因此整个里面只剩下三个部分:文件头、信息头、字节阵列。

其次,24位的二进制代码可以表示 2^ 24 (2的24次方),也就是16,777,216种色彩。其中红(R)绿(G)蓝(B)各个通道分别占用8bit,它们各有2^8=256个等级。一般称24bit以上的色彩为真彩色,也有采用30bit、36bit、42bit的。

2.文件格式

24位真彩色BMP位图文件包括3部分。第一部分是BMP文件头。前2个字节是“BM”,是用于识别BMP文件的标志;第3~6个字节存放的是位图文件的大小,以字节为单位;第7~10字节是保留的,必须为0;第11~14字节给出位图阵列相对于文件头的偏移,在24位真彩色图像中,这个值固定为54;第19~22字节表示的是图像文件的宽度,以像素为单位;第23~26字节表示的是图像文件的高度,以像素为单位。第二部分是位图信息头。从第29个字节开始,第29、30字节描述的是像素的位数,24位真彩色位图,该位的值为0×18。第三部分是数据区。从第55个字节开始,每3个字节表示一个像素,这3个字节依次表示该像素的红、绿、蓝亮度分量值。
下图是一个24位真彩色BMP图像文件用16进制编辑器(FlexHEX)打开:
在这里插入图片描述
原图test.bmp如下:
在这里插入图片描述

二、算法(四种)

本算法在24位真彩色BMP图像文件中隐藏 .txt 文件,在不影响图像正常显示的情况下,可使用以下四种方法隐藏信息。
①在图像文件尾部添加任意长度的数据,秘密信息存放在文件尾部可以减少修改文件头的数据量,仅需修改文件头中文件长度的值即可。
②在位图信息头和实际的图像数据之间隐藏数据,如果将秘密数据放在文件头与图像数据之间,则至少需要修改文件头中文件长度、数据起始偏移地址这两个域的值。
③修改文件头和信息头中的保留字段隐藏信息。
④在图像像素区利用图像宽度字节必须是4的倍数的特点,在补足处隐藏数据。
以下对这四种方法进行实现。

三、matlab实现

1.图像文件尾部添加信息

注意:添加的信息可以是任意长度,需要修改文件头中“文件长度”字段的值。
①将待隐藏的秘密信息文件名称为 hide.txt , test.bmp 为载体图像,将载体和秘密信息放置在同一个目录下。
在这里插入图片描述

②在 Windows 的 MS-DOS 方式下执行命令
Copy test.bmp /b + hide.txt /a new.bmp
其中参数/b指定以二进制格式复制、合并文件,参数 /a 以 ASCII 格式复制、 合并文件。执行该命令后,生成一个新的 new. bmp 文件。
在这里插入图片描述

③使用图像浏览工具浏览新生成的文件发现与原始载体图像完全相同,但打开二进制编辑器ultraEdit观察,发现信息隐藏在 new. bmp 文件的尾部。
在这里插入图片描述

④BMP 图像的结构中可知,图像的 3~6 字节存放整个 BMP 图像的长度。使用该方法隐藏信息时,未修改图像文件的文件长度字节,通过比较文件的实际长度和文件中保存的文件长度,就可发现该图像是否隐藏秘密信息。
用matlab运行如下代码:

clc;
clear;
fid=fopen('1.bmp','r');   %读入载体图像文件(源文件)
[a,length]=fread(fid,inf,'uint8');  %length是文件的实际长度
fclose(fid);
fid=fopen('1.bmp','r');
status=fseek(fid,2,'bof');
fileb=fread(fid,4,'uint8');%4代表有四个元素的列向量
filelength=fileb(1)*1+fileb(2)*256+fileb(3)*256^2+fileb(4)*256^3;
%文件图像中保存的文件长度(理论长度)
diff=length-filelength; 
%diff 表示隐藏的信息长度如果相同,表示图像没有隐藏任何信息。
fclose(fid);

原图像diff=0,说明没有隐藏任何信息:
在这里插入图片描述
隐藏信息后的图像diff=19:
在这里插入图片描述
当图像隐藏信息后,diff=19,表示隐藏 19 个字节的信息。要在图像中隐藏信息不被发现,需修改图像文件长度,也就是修改第 3~6 字节,将其增加 19。在 Ultraedit 中手工将第 3 个字节由原来的 0x36,变为 0x49。

在这里插入图片描述

再次运行上述脚本,diff=0,隐藏信息不易被察觉。
在这里插入图片描述

2.位图信息头和实际图像数据之间隐藏数据

注意:
①添加的信息可以是任意长度
②至少需要修改文件头中文件长度、数据起始偏移地址这两个域的值。
在数据区开始之前隐藏信息,也就是在 54 和 55 个字节之间隐藏信息,隐藏的秘密信息从 hide.txt 文件中读取,hide.txt内容为0978433243,此种方法修改图像数据的偏移量和图像数据的文件长度。

clc;
clear; 
wm=randsrc(1,300, [0 1]); % 产生随机水印
fid=fopen('test.bmp','r'); %读入载体图像文件
[a,length]=fread(fid,inf,'uint8');
fclose(fid); 
msgfid=fopen('hide.txt','r');%打开秘密文件
[msg,count]=fread(msgfid); 
fclose(msgfid); 
wa=a; 
j=1; 
wa(11)=54+count; 
wa(3)=wa(3)+count; 
for i=55:64 
 wa(i)=uint8(msg(j,1));%隐藏密码信息
 j=j+1; 
end 
for i=55:length 
 wa(i+10)=a(i); 
end 
figure; 
wa=uint8(wa); 
fid=fopen('new_2.bmp', 'wb'); 
fwrite(fid,wa); 
fclose(fid); 
imshow('new_2.bmp');

在这里插入图片描述

3.BMP 图像文件隐藏信息的检测

clc; 
clear; 
wm=randsrc(1,300, [0 1]); % 产生随机水印信息
fid=fopen('new_2.bmp','r'); %读入载体图像文件
[a,length]=fread(fid,inf,'uint8'); %文件图像实际长度
%fread()函数用于读取二进制文件,Inf 代表输出数据是列向量,文件中每一个元素对应一个值
status=fseek(fid,2,'bof'); 
fileb=fread(fid,4,'uint8'); 
filelength=fileb(1)*1+fileb(2)*256+fileb(3)*256^2+fileb(4)*256^3 
%文件图像的理论长度
status=fseek(fid,18,'bof'); 
b=fread(fid,4,'uint8'); 
biwidth=b(1)*1+b(2)*256+b(3)*256^2+b(4)*256^3 
status=fseek(fid,22,'bof'); 
b=fread(fid,4,'uint8'); 
biHeight=b(1)*1+b(2)*256+b(3)*256^2+b(4)*256^3; 
bfoffbits=54;%偏移量
biBytecount=3;%24 位真彩色图像为 3 
fclose(fid); 
diff=length-filelength;

4.在文件头和信息头中的“保留字段”隐藏信息

clc; 
clear; 
fid=fopen('test.bmp','r'); %读入载体图像文件
[a,length]=fread(fid,inf,'uint8'); 
fclose(fid); 
wa=a; 
%在 BMP 的 789 保留字中隐藏秘密信息 twl ,ASCII 值为74 77 6C
wa(7)=116; 
wa(8)=119; 
wa(9)=108; 
figure; 
wa=uint8(wa); 
fid=fopen('new_4.bmp', 'wb'); 
fwrite(fid,wa); 
fclose(fid); 
imshow('new_4.bmp');

注意:
①隐藏信息的长度受到限制。如,BMP图像的文件头中有四个字节的“保留字段”。
②无需修改其他部分。
图像隐藏前后无区别:
在这里插入图片描述
但打开编辑器可以看到隐藏信息:
在这里插入图片描述

  • 12
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值