数字水印DCT变换域算法实现

随机间隔法:

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)<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

    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);

猜你喜欢

转载自witsky.iteye.com/blog/2063435