数字水印实验2 基于LSB和EMD的信息隐藏实验

【实验名称】基于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算法不需增多修改的像素值数目,只要增大模数,就能在不会过于增大每个像素值修改幅度的前提下实现秘密信息的隐藏。

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值