【实验名称】基于LSB和EMD的信息隐藏实验
【实验目的】
1、学习并掌握图像信息隐藏的基本原理和方法
2、学习并实现基于LSB的信息隐藏和提取算法
3、学习并实现基于EMD的信息隐藏和提取算法
【实验原理】
1、LSB算法是最早提出的一种典型的空间域信息隐藏算法。它使用特定的密钥通过伪随机序列发生器产生随机信号,然后按一定的规则排列成二维水印信号,并逐一插到原始图像相应像素值的最低几位。由于水印信号隐藏在最低位,相当于叠加了一个能量微弱的信号,因此在视觉和听觉上很难察觉。作为大数据量的信息隐藏方法,LSB在隐藏通信中仍占据相当重要的地位。
2、EMD算法仅通过修改一组像素中一个像素的灰度值就可以嵌入一个2n+1进制的隐秘信息,具有图像像素值改变量小,嵌入信息量大的特点。
【实验内容】
一、基于LSB的信息隐藏和提取算法
代码:
function MY1()
clc;clear;
I=imread('coverlena.bmp');
figure;subplot(1,2,1);imshow(I);
title('原图');
Secret=10; %待隐藏数据的大小
data=round(rand(1,Secret)); %随机生成大小为Secret的待隐藏的2进制数据
[length,width,~]=size(I);
fprintf('隐藏数据:');disp(data);
%进行信息隐藏
point=1;
for i=1:length
if point>Secret
break;
end
for j=i:width
if point>Secret
break;
end
if point==Secret-mod(Secret,3)+1 %剩余数据不足三位时单独处理
I(i,j)=fix(double(I(i,j))/8);
I(i,j)=I(i,j)*8;
num=4;
for k=point:Secret
I(i,j)=I(i,j)+data(k)*num;
num=num/2;
end
break
end
I(i,j)=fix(double(I(i,j))/8); %后三位置0,放入待隐藏数据
I(i,j)=I(i,j)*8;
I(i,j)=I(i,j)+data(point)*4+data(point+1)*2+data(point+2);
point=point+3;
end
end
fprintf('信息隐藏成功!\r\n');
subplot(1,2,2);imshow(I);
title('隐藏后图像');
%隐藏信息读取
point=1;
for i=1:length
if point>Secret
break;
end
for j=i:width
if point>Secret
break;
end
if point==Secret-mod(Secret,3)+1 %之前做单独放入处理的隐藏点进行单独读取
message=double(mod(I(i,j),8));
message=floor(message/2);
if mod(Secret,3)==1
message=floor(message/2);
Data(point)=mod(message,2);
end
if mod(Secret,3)==2
Data(point+1)=mod(message,2);
message=floor(message/2);
Data(point)=mod(message,2);
end
break
end
message=double(mod(I(i,j),8)); %读取放置在后三位的隐藏数据
Data(point+2)=mod(message,2);
message=floor(message/2);
Data(point+1)=mod(message,2);
message=floor(message/2);
Data(point)=mod(message,2);
point=point+3;
end
end
fprintf('提取数据:');disp(Data);
end
运行结果:
观察图像像素值变化
原图像:
信息隐藏后图像:
可以看出,程序从待隐藏数据第一位开始,每三个二进制数据放入到一个像素值后三位。
二、基于EMD的信息隐藏和提取算法
代码:
function MY2()
clc;clear;
I=imread('coverlena.bmp');
figure;subplot(1,2,1);imshow(I);
title('原图');
Secret=10; %待隐藏数据的大小
data=round(rand(1,Secret)); %随机生成大小为Secret的待隐藏的2进制数据
fprintf('隐藏数据:');disp(data);
[length,width]=size(I);
data3=Num2to5(data,Secret); %将2进制数据转换为5进制
fprintf('转换成5进制:');disp(data3);
KimMatrix=newmatrixn(); %生成模5矩阵
%进行信息隐藏
point=1;
for i=1:length
if point>size(data3,2)
break;
end
for j=1:2:width
if point>size(data3,2)
break;
end
%找到对应点并对图像进行更新
if KimMatrix(I(i,j),I(i,j+1))==data3(point)
elseif KimMatrix(I(i,j)+1,I(i,j+1))==data3(point)
I(i,j)=I(i,j)+1;
elseif KimMatrix(I(i,j)-1,I(i,j+1))==data3(point)
I(i,j)=I(i,j)-1;
elseif KimMatrix(I(i,j),I(i,j+1)+1)==data3(point)
I(i,j+1)=I(i,j+1)+1;
elseif KimMatrix(I(i,j),I(i,j+1)-1)==data3(point)
I(i,j+1)=I(i,j+1)-1;
end
point=point+1;
end
end
fprintf('信息隐藏成功!\r\n');
subplot(1,2,2);imshow(I);
title('隐藏后图像');
%隐藏信息读取
point=1;
for i=1:length
if point>size(data3,2)
break;
end
for j=1:2:width
if point>size(data3,2)
break;
end
Data2(point)=KimMatrix(I(i,j),I(i,j+1));
point=point+1;
end
end
Data2=double(Data2);
fprintf('提取数据:');disp(Data2);
Data=Num5to2(Data2,Secret); %将5进制数据转换为2进制
fprintf('转换成2进制:');disp(Data);
end
function KimMatrix=newmatrixn() %生成模5矩阵
n=256;
munit=uint8(zeros(5,5));
for j=1:5
munit(1,j)=j-1;
munit(2,j)=mod(j+2,5);
munit(3,j)=mod(j+5,5);
munit(4,j)=mod(j+3,5);
munit(5,j)=mod(j+1,5);
end
nm=ceil(n/5);
nn=ceil(n/5);
KimMatrix=repmat(munit,nm,nn);
KimMatrix=KimMatrix(1:256,1:256);
end
function data3=Num2to5(data,Secret) %将2进制数据转换为5进制
data1=0;
num=1;
for i=Secret:-1:1
data1=data1+data(i)*num;
num=num*2;
end
for i=Secret:-1:1
if data1==0
break;
end
data2(i)=mod(data1,5);
data1=(data1-mod(data1,5))/5;
end
for i=1:Secret
if data2(i)~=0
num=i;
break;
end
end
for i=1:Secret-num+1
data3(i)=data2(num+i-1);
end
end
function Data=Num5to2(Data2,Secret) %将5进制数据转换为2进制
Data1=0;
Data1=double(Data1);
num=1;
for i=size(Data2,2):-1:1
Data1=Data1+Data2(i)*num;
num=num*5;
end
Data=zeros(1,Secret);
for i=Secret:-1:1
if Data1==0
break;
end
Data(i)=mod(Data1,2);
Data1=(Data1-mod(Data1,2))/2;
end
end
运行结果:
观察图像像素值的变化
原图像:
信息隐藏后:
可以看到,每两个像素组中,至多有一个像素的值+或-1.
【小结或讨论】
LSB是最经典、最基础的一种图像信息隐藏算法,其原理也比较简单,即将图像像素值的最后几位直接舍弃(在本次实验中是最后三位),再将待隐藏的二进制信息每三位一份,放入每个像素值空出来的后三位中。由于改动的只是像素值的后三位,对于整个像素值来说影响不大,故而能达到信息隐藏后,肉眼很难察觉的效果,也达到了信息隐藏的根本目的。
当然,LSB算法的缺点也是显而易见的。当需要隐藏的数据很多时,要么增多修改的像素值数目,要么增大每个像素值修改的位数。如果增多修改的像素值数目,那么必然需要一张很大的图像来隐藏,而且隐藏耗时也是一个需要考虑的问题。如果增大每个像素值修改的位数,那么势必会导致每个像素值修改幅度增大,从而会导致图像的修改更加易于被人发现。
EMD算法较好地解决了LSB的上述问题。EMD算法的原理是先构造一个模数矩阵,再将图像的像素值两两组成一对,以第一个值为行数,第二个值为列数,在模数矩阵上找到相应的需要隐藏的信息值,最后改变行数和列数,即两个像素的像素值。EMD的优点在于,它的像素值的修改极小,使其更难被人发现。由于模数矩阵的特殊性,EMD中的十字矩阵中必然包含了0到4的五个值,使得像素值的+或-1就能实现一位五进制数的隐藏。如果需要隐藏大量数据,使用EMD算法不需增多修改的像素值数目,只要增大模数,就能在不会过于增大每个像素值修改幅度的前提下实现秘密信息的隐藏。