随机间隔法:
function [row,col]=randinterval(matrix,count,key)
[m,n]=size(matrix);
interval1=floor(m*n/count)+1;
interval2=interval1-2;
if interval2==0
error('载体小不能秘信息藏进去');
end
rand('seed',key);
a=rand(1,count);
row=zeros([1 count]);
col=zeros([1 count]);
r=1;
c=1;
row(1,1)=r;
col(1,1)=c;
for i=2:count
if a(i)>=0.5
c=c+interval1;
else
c=c+interval2;
end
if c>n
r=r+1;
if r>m
error('载体小不能秘信息藏进去');
end
c=mod(c,n);
if c==0
c=1;
end
end
row(1,i)=r;
col(1,i)=c;
end
嵌入:
function [count,msg,result]=hidedctadv(image,imagegoal,msg,key,alpha)
%image='lena.jpg';
%imagegoal='lenahide.jpg';
%msg='1.txt';
%key=1982;
%alpha=1;
frr=fopen(msg,'r');
[msg,count]=fread(frr,'ubit1');
fclose(frr);
data0=imread('lena.jpg');
data0=double(data0)/255;
data=data0(:,:,1);
T=dctmtx(8);
DCTrgb=blkproc(data,[8 8],'P1*x*P2',T,T');
[row,col]=size(DCTrgb);
row=floor(row/8);
col=floor(col/8);
a=zeros([row col]);
[k1,k2]=randinterval(a,count,key);
for i=1:count
k1(1,i)=(k1(1,i)-1)*8+1;
k2(1,i)=(k2(1,i)-1)*8+1;
end
temp=0;
for i=1:count
if msg(i,1)==0
if DCTrgb(k1(i)+4,k2(i)+1)>DCTrgb(k1(i)+3,k2(i)+2)
temp=DCTrgb(k1(i)+4,k2(i)+1);
DCTrgb(k1(i)+4,k2(i)+1)=DCTrgb(k1(i)+3,k2(i)+2);
DCTrgb(k1(i)+3,k2(i)+2)=temp;
end
else
if DCTrgb(k1(i)+4,k2(i)+1) temp=DCTrgb(k1(i)+4,k2(i)+1); DCTrgb(k1(i)+4,k2(i)+1)=DCTrgb(k1(i)+3,k2(i)+2); DCTrgb(k1(i)+3,k2(i)+2)=temp; end end if DCTrgb(k1(i)+4,k2(i)+1)>DCTrgb(k1(i)+3,k2(i)+2) DCTrgb(k1(i)+3,k2(i)+2)=DCTrgb(k1(i)+3,k2(i)+2)-alpha; else DCTrgb(k1(i)+4,k2(i)+1)=DCTrgb(k1(i)+4,k2(i)+1)-alpha; end end DCTrgb1=DCTrgb; data=blkproc(DCTrgb,[8 8],'P1*x*P2',T',T); result=data0; result(:,:,1)=data; imwrite(result,imagegoal); 提取: function result=extractdctadv(image,msg,key,count) data0=imread(image); data0=double(data0)/255; data=data0(:,:,1); T=dctmtx(8); DCTcheck=blkproc(data,[8 8],'P1*x*P2',T,T'); [row,col]=size(DCTcheck); row=floor(row/8); col=floor(col/8); a=zeros([row col]); [k1,k2]=randinterval(a,count,key); for i=1:count k1(1,i)=(k1(1,i)-1)*8+1; k2(1,i)=(k2(1,i)-1)*8+1; end frr=fopen(msg,'a'); for i=1:count if DCTcheck(k1(i)+4,k2(i)+1)<=DCTcheck(k1(i)+3,k2(i)+2) fwrite(frr,0,'bit1'); result(i,1)=0; else fwrite(frr,1,'bit1'); result(i,1)=1; end end fclose(frr); test: function test() key=1982; count=0; alpha=0.5; [count,msg,data]=hidedctadv('lena.jpg','lenahide.jpg','1.txt',key,alpha); tt=extractdctadv('lenahide.jpg','2.txt',key,count);