数字水印实验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
运行结果:
观察图像像素值的变化
原图像:
信息隐藏后:
可以看到,每两个像素组中,至多两个像素的值+或-1。