使用matlab进行图像信息隐藏和提取

基于格式的信息隐藏方法通常在文件头与图像数据之间,或图像数据末尾添加秘密信息,具有实现简单,透明性高,隐藏容量大等多个优点;LSB图像信息隐藏算法是将秘密信息隐藏在图像像素数据的低位上来隐藏信息的方法,具有实现简单,隐藏容量大等优点。本次实验基于以上两种方法,需完成如下内容:从网络中随机下载或拍摄一张图片,图片分辨率大于80*80,储存格式任意;分别采用上述两种方法将一段约100至200字左右的文本隐藏在这张图片中;设计并编写信息嵌入程序和信息提取程序;给出实验结果并提交符合规范的实验报告。

基于格式的图像信息隐藏

1、信息嵌入步骤
1)在DOS命令行中输入copy logo.jpg /b + hidden.txt /a logoout.jpg命令;
2、信息提取步骤
1)读取并打开嵌入前的logo.jpg,hidden.txt;
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('hidden.txt','r');%以读的方式打开hidden.txt
[hidtxt,length3]=fread(fid,inf,'uint8');
fclose(fid);  
 
fid=fopen('extract.txt','w');%以读的方式打开extract.txt
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('hidden.txt','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('extracttxt.txt','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
    t=t+1;
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);
%初始化
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;
    end
    if c>n
        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('hidout.txt','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('hidden.txt','r');
[hidtxt,length]=fread(fid,inf,'uint8');
fclose(fid);
fid=fopen('hidout.txt','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
        c=c+i1;
    else
        c=c+i2;
    end
    if c>n
        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

总结

1、基于格式的信息隐藏:只需在DOS命令行中输入一条命令,无需编码,简单;隐藏信息可以通过现有工具提取,透明性低;隐藏容量大。
2、基于LSB的图像信息隐藏,优点是算法简单,便于实现,计算速度快;在基础算法上能很快的进行改进,并在脆弱水印中广泛应用;由于能在最低有效位进行嵌入,所以对于图像影响很小,几乎无法用肉眼识别。LSB缺点是:嵌入消息较大似乎,耗时长;只能处理简单的流格式的文件;为满足水印的不可见性,允许嵌入的水印强度较低,对于空域的各种操作较敏感;鲁棒性差。

你可能感兴趣的:(实验,算法,matlab)