matlab信息隐藏和提取,使⽤matlab进⾏图像信息隐藏和提取基于格式的信息隐藏⽅法通常在⽂件头与图像数据之间,或图像数据末尾添加秘密信息,具有实现简单,透明性⾼,隐藏容量⼤等多个优点;LSB图像信息隐藏算法是将秘密信息隐藏在图像像素数据的低位上来隐藏信息的⽅法,具有实现简单,隐藏容量⼤等优点。本次实验基于以上两种⽅法,需完成如下内容:从⽹络中随机下载或拍摄⼀张图⽚,图⽚分辨率⼤于80*80,储存格式任意;分别采⽤上述两种⽅法将⼀段约100⾄200字左右的⽂本隐藏在这张图⽚中;设计并编写信息嵌⼊程序和信息提取程序;给出实验结果并提交符合规范的实验报告。
基于格式的图像信息隐藏
1、信息嵌⼊步骤
1)在DOS命令⾏中输⼊copy logo.jpg /b + /a logoout.jpg命令;
2、信息提取步骤
1)读取并打开嵌⼊前的logo.jpg,;
2)读取并打开嵌⼊后的logoout.jpg
3)提取⽂件
信息提取代码
clc;clear;close all
fid=fopen('logo.jpg','r');%以读的⽅式打开logo.jpg
[ori,length1]=fread(fid,inf,'uint8');
fclose(fid);
fid=fopen('logoout.jpg','r');%以读的⽅式打开logoout.jpg
[hid,length2]=fread(fid,inf,'uint8');
fclose(fid);
fid=fopen('','r');%以读的⽅式打开
[hidtxt,length3]=fread(fid,inf,'uint8');
fclose(fid);
fid=fopen('','w');%以读的⽅式打开
fwrite(fid,hid(length1+1:length2-1),'uint8');
fclose(fid);
errnum=biterr(hidtxt,hid(length1+1:length2-1));
基于LSB图像信息隐藏⽅法
1、信息嵌⼊步骤
1)将⽂本⽂件转化为⼆进制流;
2)读取图像logo;
3)以⼆进制形式读取要嵌⼊到图⽚⾥的消息。并读取消息的长度(嵌⼊消息的长度不能超过图像位数);
4)产⽣与消息长度⼀致的⼀串随机数(不能相同)。⾃定义⼀个random函数来实现伪随机数的⽣成产⽣的伪随机数是代表消息要隐藏的像素位置(⾏和列的信息)
5)按照产⽣的随机数的序列依次将图⽚层的最后⼀位改为消息的信息。即⽤消息替换图⽚的最后⼀位信息
2、信息提取步骤
1)读取已经隐藏信息的图像;
2)⽤与 LSB 算法中相同的随机数种⼦产⽣相同的⼀串随机数。随机数串的长度由 LSB 中获得(长度不得⼤于图像⼤⼩)。;
3)按照产⽣的随机数序列依次读取图像的相应点最后⼀位的信息。并将其以⼆进制形式写到⽂件中;
4)看⽂件,即获取的信息,与嵌⼊的信息进⾏⽐较。
源代码(仅供参考)
嵌⼊
clc;clear;close all
%⽂本⽂件与⼆进制流的转化
fid=fopen('','r');
[hidtxt,length]=fread(fid,'ubit8');
%保存hidtxt,length值
save save.mat hidtxt length
fclose(fid);
txtb=de2bi(hidtxt,8);%⼗进制转⼆进制
txtbm=reshape(txtb,1,length*8);%txtbm为⼆进制码流
bmtxt=reshape(txtbm,length,8);
btxt=bi2de(bmtxt);%⼆进制转⼗进制
fid=fopen('','w');
fwrite(fid,btxt,'uint8');
fclose(fid);
%读取图像
img=imread('logo.jpg');
img=double(img);
[a,b]=size(img);
t=1;
%产⽣随机数
[c,d]=random(img,length,1712031005);
%按照产⽣的随机数的序列依次将图⽚层的最后⼀位改为消息的信息。即⽤消息替换图⽚的最后⼀位信息
for i=1:length
img(c(i),d(i))=img(c(i),d(i))-mod(img(c(i),d(i)),2)+hidtxt(t,1);
if t==length
break;
end
%还原图像
img=uint8(img);
imwrite(img,'logoout.jpg');
%⾃定义⼀个random函数来实现伪随机数的⽣成
%产⽣的伪随机数是代表消息要隐藏的像素位置(⾏和列的信息) %mat为载体矩阵
%count为嵌⼊信息的⼤⼩
%key为随机数种⼦
function [R,C]=random(mat,count,key)
%计算间隔的位数
[m,n]=size(mat);
interval1=floor(m*n/count)+1;
interval2=interval1-2;
if interval2==0
error('error');
end
%⽣成随机序列
rand('seed',key);
a=rand(1,count);
%初始化
matlab生成随机数
R=zeros([1 count]);
C=zeros([1 count]);
%计算row,col
r=1;
c=1;
R(1,1)=r;
C(1,1)=c;
for i=2:count
if a(i)>=0.5
c=c+interval1;
else
c=c+interval2;
r=r+1;
if r>m
error('error');
end
c=mod(c,n);
if c==0
c=1;
end
end
R(1,i)=r;
C(1,i)=c;
end
end
提取
clc;clear;close all
%读取携密图⽚
img=imread('logoout.jpg');
img=double(img);
%计算⼤⼩
[a,b]=size(img);
load save.mat;
fid=fopen('','w');
p=1;
[row,col]=random(img,length,1712031005); %产⽣随机数for i=1:length
if bitand(img(row(i),col(i)),1)==1 %按位与运算
fwrite(fid,1,'ubit1');
result(p,1)=1;
else
fwrite(fid,0,'ubit1');
result(p,1)=0;
end
if p==length
break;
end
p=p+1;
end
fclose(fid);
fid=fopen('','r');
[hidtxt,length]=fread(fid,inf,'uint8'); fclose(fid);
fid=fopen('','r');
[hidout,length1]=fread(fid,inf,'uint8'); fclose(fid);
%errnum=biterr(hidtxt,hidout);
function [R,C]=random(mat,count,key) %计算间隔的位数
[m,n]=size(mat);
i1=floor(m*n/count)+1;
i2=i1-2;
if i2==0
error('error');
end
%⽣成随机序列
rand('seed',key);
a=rand(1,count);
%初始化
R=zeros([1 count]);
C=zeros([1 count]);
%计算row,col
r=1;
c=1;
R(1,1)=r;
C(1,1)=c;
for i=2:count
if a(i)>=0.5

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。