数字水印实验2.2 基于Kim et al.’s Method的信息隐藏实验

基于Kim et al.’s Method的信息隐藏和提取算法

代码:

function MY3()
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进制数据转换为9进制
fprintf('转换成9进制:');disp(data3);

KimMatrix=newmatrixn();              %生成模9矩阵

%进行信息隐藏
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;
        elseif KimMatrix(I(i,j)+1,I(i,j+1)+1)==data3(point)
            I(i,j)=I(i,j)+1;
            I(i,j+1)=I(i,j+1)+1;
        elseif KimMatrix(I(i,j)+1,I(i,j+1)-1)==data3(point)
            I(i,j)=I(i,j)+1;
            I(i,j+1)=I(i,j+1)-1;
        elseif KimMatrix(I(i,j)-1,I(i,j+1)+1)==data3(point)
            I(i,j)=I(i,j)-1;
            I(i,j+1)=I(i,j+1)+1;
        elseif KimMatrix(I(i,j)-1,I(i,j+1)-1)==data3(point)
            I(i,j)=I(i,j)-1;
            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);         %将9进制数据转换为2进制
fprintf('转换成2进制:');disp(Data);
end

function KimMatrix=newmatrixn()     %生成模9矩阵
n=256;
munit=uint8(zeros(3,9));
for j=1:9
    munit(1,j)=j-1;
    munit(2,j)=mod(j+2,9);
    munit(3,j)=mod(j+5,9);
end
nm=ceil(n/3);
nn=ceil(n/9);
KimMatrix=repmat(munit,nm,nn);
KimMatrix=KimMatrix(1:256,1:256);
end

function data3=Num2to5(data,Secret)  %将2进制数据转换为9进制
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,9);
    data1=(data1-mod(data1,9))/9;
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)    %将9进制数据转换为2进制
Data1=0;
Data1=double(Data1);
num=1;
for i=size(Data2,2):-1:1
    Data1=Data1+Data2(i)*num;
    num=num*9;
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

运行结果:

数字水印实验2.2 基于Kim et al.’s Method的信息隐藏实验

数字水印实验2.2 基于Kim et al.’s Method的信息隐藏实验

观察图像像素值的变化

原图像:

数字水印实验2.2 基于Kim et al.’s Method的信息隐藏实验

信息隐藏后:

数字水印实验2.2 基于Kim et al.’s Method的信息隐藏实验

可以看到,每两个像素组中,至多两个像素的值+或-1。