包括RLEhiding,RLEextract,bit2str等文件,完成二值图像信息的隐藏和提取。
注:本代码来源于《信息隐藏于数字水印实验教程》,但是源程序在Matlab2012版本上面无法正确运行,因此本人进行简单的修改后可以顺利运行,但是提取的数据还是不对。。。
1. 隐藏算法源代码RLEhiding.m文件
clc;
clear all
oi=imread('lena.bmp');
if(length(size(oi))==3)
oi=rgb2gray(oi);
end
[row col]=size(oi);
oi=oi(:);
oi=ToBin(oi);
len=size(oi);
i=1;
j=1;
t=1;
whilei<len(1)
or=oi(i);
count=1;
while (i<len(1)&&oi(i+1)==or)
i=i+1;
count=count+1;
end
RLE(j,:)=[t,count];%RLE为游程
j=j+1;
i=i+1;
t=t+count;
end
ifi==len(1)
RLE(j,:)=[i,1];
end
% RLE=RLE';
msgfid=fopen('hidden.txt','r');
[msg,msgcount]=fread(msgfid);
fclose(msgfid);
msg=uint8(dec2bin(msg)-48);
[htxt,ltxt]=size(msg);
mmsg=zeros(htxt,8);
if(ltxt<8)
n=8-ltxt;
mm=zeros(htxt,n);
fori=1:htxt
包括RLEhiding,RLEextract,bit2str等文件,完成二值图像信息的隐藏和提取。
mmsg(i,:)=[mm(i,:),msg(i,:)];
end
end
msg=mmsg';
msgcount=msgcount*8;
% for l=1:msgcount
% if msg(l)==0
% if((mod(RLE(l,2),2)~=0)&&(RLE(l+1,2)~=1)) % oi(RLE(l+1,1))=mod(oi(RLE(l+1,1))+1,2); % RLE(l+1,2)=RLE(l+1,2)-1;
% end
% else
% if((mod(RLE(l,2),2)==0)&&(RLE(l+1,2)~=1)) % oi(RLE(l+1,1))=mod(oi(RLE(l+1,1))+1,2); % RLE(l+1,2)=RLE(l+1,2)-1;
% end
% end
% end
for l=1:msgcount
modpoint=0;
for x=1:2*l
modpoint=modpoint+RLE(x,2);
end
ifmsg(l)==0
if ((mod(RLE(2*l,2),2)~=0)&&(RLE(2*l+1,2)~=1)) oi(modpoint+1)=mod(oi(modpoint+1)+1,2);
end
else
if ((mod(RLE(2*l,2),2)==0)&&(RLE(2*l+1,2)~=1)) oi(modpoint+1)=mod(oi(modpoint+1)+1,2);
end
end
end
m1=Vector2Matrix(oi,row);
m1=m1';
imwrite(m1,'marked.bmp');
figure;
subplot(1,2,1);imshow('lena.bmp');title('original image');
subplot(1,2,2);imshow('marked.bmp');title('watermarked image');
2. Vector2Matrix.m子函数
function A=Vector2Matrix(oi,row)
%将数组转换成二位数组,row为行数
包括RLEhiding,RLEextract,bit2str等文件,完成二值图像信息的隐藏和提取。
cl=length(oi)/row;
A=zeros(row,cl);
fori=1:row
for j=1:cl
A(i,j)=oi(cl*(i-1)+j);
end
end
3. ToBin.m子函数
function A=ToBin(oi)
%将像素点的值转换为0和1,oi为一维二值图像数组 A=oi;
fori=1:length(oi)
if(oi(i)<128)
A(i)=0;
else
A(i)=1;
end
end
4. 提取算法源代码RLEextract.m文件 clc;
clear all;
oi=imread('marked.bmp');
if(length(size(oi))==3)
oi=rgb2gray(oi);
end
[row col]=size(oi);
oi=oi(:);
len=size(oi);
i=1;
j=1;
while(i<len(1))
or=oi(i);
count=1;
while(i<len(1)&&oi(i+1)==or)
i=i+1;
count=count+1;
end
RLE(j)=count;
j=j+1;
i=i+1;
包括RLEhiding,RLEextract,bit2str等文件,完成二值图像信息的隐藏和提取。
end
ifi==len(1)
RLE(j)=1;
end
RLE=RLE';
msgcount=72;%必须知道水印的长度 msg=zeros(msgcount,1);
n=0;
for l=1:msgcount
if mod(RLE(2*l),2)==0
msg(l)=0;
else
msg(l)=1;
end
end
ot=Vector2Matrix(msg,msgcount/8); out=bit2str(ot);
fid=fopen('message.txt','wt');
fwrite(fid,out);
fclose(fid);
5. bit2str.m子函数
function A=bit2str(ot)
%二进制转换为十进制,ot为二进制一维向量 len=size(ot);
A=zeros(len(1),1);
fori=1:len(1)
sum=0;
for j=7:(-1):0
sum=sum+ot(i,8-j)*2^j;
end
A(i)=sum;
End