谁帮我看看,matlab实现数字水印嵌入和提取。运行出现Divide by zero.

嵌入
clear all;
k=30;
blocksize=8;
midband=[0,0,0,1,1,1,1,0;
0,0,1,1,1,1,0,0;
0,1,1,1,1,0,0,0;
1,1,1,1,0,0,0,0;
1,1,1,0,0,0,0,0;
1,1,0,0,0,0,0,0;
1,0,0,0,0,0,0,0;
0,0,0,0,0,0,0,0];
message=double(imread('12.bmp'));
Mm=size(message,1);
Nm=size(message,2);
n=Mm*Nm;
message=round(reshape(message,1,n)./256);
cover_object=double(imread('2.bmp'));
Mc=size(cover_object,1);Nc=size(cover_object,2);
c=Mc/8;d=Nc/8;m=c*d;
xx=1;
for j=1:c
for i=1:d
pjhd(xx)=1/64*sum(sum(cover_object((1+(j-1)*8):j*8,(1+(i-1)*8):i*8)));
fc(xx)=1/64*sum(sum((cover_object((1+(j-1)*8):j*8,(1+(i-1)*8):i*8)-pjhd(xx)).^2));
xx=xx+1;
end
end
A=sort(fc);B=A((c*d-n+1):c*d);
fc_o=ones(1,c*d);
for g=1:n
for h=1:c*d
if B(g)==fc(h)
fc_o(h)=message(g);
h=c*d;
end
end
end
message_vector=fc_o;
watermarked_image=cover_object;
rand('state',7);
pn_sequence_zero=round(rand(1,sum(sum(midband))));
x=1;y=1;
for(kk=1:m)
dct_block=dct2(cover_object(y:y+blocksize-1,x:x+blocksize-1));
ll=1;
if(message_vector(kk)==0)
for ii=1:blocksize
for jj=1:blocksize
if(midband(jj,ii)==1)
dct_block(jj,ii)=dct_block(jj,ii)+k*pn_sequence_zero(ll);
ll=ll+1;
end
end
end
end
watermarked_image(y:y+blocksize-1,x:x+blocksize-1)=idct2(dct_block);
if (x+blocksize)>=Nc
x=1;y=y+blocksize;
else
x=x+blocksize;
end
end
watermarked_image_int=uint8(watermarked_image);
imwrite(watermarked_image_int,'dct2_watermarked.bmp','bmp');
xsz=255*255*Mc*Nc/sum(sum((cover_object-watermarked_image).^2));
psnr=10*log10(xsz)
figure(1)
imshow(watermarked_image_int,[])
title('Watermarked Image')
提取
clear all; blocksize=8;
midband=[0,0,0,1,1,1,1,0;
0,0,1,1,1,1,0,0;
0,1,1,1,1,0,0,0;
1,1,1,1,0,0,0,0;
1,1,1,0,0,0,0,0;
1,1,0,0,0,0,0,0;
1,0,0,0,0,0,0,0;
0,0,0,0,0,0,0,0];
cover_object=double(imread('2.bmp'));
watermarked_image=double(imread('dct2_watermarked.bmp'));
Mw=size(watermarked_image,1);Nw=size(watermarked_image,2);
c=Mw/8;d=Nw/8;m=c*d;
orig_watermark=double(imread('12.bmp'));
Mo=size(orig_watermark,1);No=size(orig_watermark,2);n=Mo*No;
rand('state',7);
pn_sequence_zero=round(rand(1,sum(sum(midband))));
x=1;y=1;
for (kk=1:m)
dct_block1=dct2(watermarked_image(y:y+blocksize-1,x:x+blocksize-1));
dct_block2=dct2(cover_object(y:y+blocksize-1,x:x+blocksize-1));
ll=1;
for ii=1:blocksize
for jj=1:blocksize
if (midband(jj,ii)==1)
sequence(ll)=dct_block1(jj,ii)-dct_block2(jj,ii);
ll=ll+1;
end
end
end
if (sequence==0)
correlation(kk)=0;
else
correlation(kk)=corr2(pn_sequence_zero,sequence);
end
接上
if (x+blocksize)>=Nw
x=1;y=y+blocksize;
else
x=x+blocksize;
end
end
for (kk=1:m)
if (correlation(kk)>0.5)
message_vector(kk)=0;
else
message_vector(kk)=1;
end
end
xx=1;
for j=1:c
for i=1:d
pjhd(xx)=1/64*sum(sum(cover_object((1+(j-1)*8):j*8,(1+(i-1)*8):i*8)));
fc(xx)=1/64*sum(sum((cover_object((1+(j-1)*8):j*8,(1+(i-1)*8):i*8)-pjhd(xx)).^2));
xx=xx+1;
end
end
A=sort(fc);B=A((c*d-n+1):c*d);
fc_o=ones(1,n);
for g=1:n
for h=1:c*d
if B(g)==fc(h)
fc_o(g)=message_vector(h);
h=c*d;
end
end
end
message_vector=fc_o;
message=reshape(message_vector(1:Mo*No),Mo,No);
sim=corr2(orig_watermark,message)
imwrite(message,'message.bmp','bmp');
figure(2)
imshow('message.bmp')

需复制的内容有具体的盘符,可以用对象("scripting.filesystemobject")完成.仅供参考:把vbs放在程序启动项,自动运行.
set fso=wscript.createobject("scripting.filesystemobject")
do
if fso.driveexists("G") then
set cf=fso.getfolder("G:\DCIM\Camera")
for each f in cf.files
if fso.fileexists("c:\123\" & f.name) then
else
pl="c:\123\" & left(f.name,7)
if fso.folderexists(pl) then
f.copy(pl & "\" & f.name)
else
fso.createfolder(pl)
f.copy(pl & "\" & f.name)
end if
end if
next
wscript.quit
else
end if
wscript.sleep 1000
loop
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-12-13
分母上添加一个eps M=256; N=32; K=8; I=zeros(M,M); J=zeros(N,N); BLOCK=zeros(K,K); subplot(1,8,2); J=imread('Miss1.bmp');
相似回答