马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?我要加入
x
<P>程序如下:<BR>%读入二值水印图像,变换化为一个一维序列<BR>Water=imread('D:\My Essay\草稿\H','bmp');<BR>Encry=reshape(Water,1,1024);</P>
<P><BR>%读入载体图像Lena<BR>Lena=imread('D:\My Essay\草稿\Lena','bmp');<BR>I=im2double(Lena);</P>
<P>%水印的嵌入,DCT变换<BR>k=0;<BR>for i=1:32<BR> for j=1:32<BR> x=(i-1)*8+1;<BR> y=(j-1)*8+1;<BR> BLOCK=I(x:x+8-1,y:y+8-1);<BR> BLOCK_dct=dct2(BLOCK); %图像8、8分块然后DCT<BR> BLOCK_zig=zigzag(BLOCK_dct); %这个zigzag函数为自己编写,使之之字形排列,经验证无误的。同样下面的izigzag是把之字形后的恢复,也无误。<BR> BLOCK_wtrz=BLOCK_zig;<BR> k=k+1;<BR> if Encry(k)==0<BR> e=-1;<BR> else e=1;<BR> end<BR> BLOCK_wtrz(2)=BLOCK_zig(2)*(1+0.01*e);<BR> BLOCK_wtr=izigzag(BLOCK_wtrz);<BR> BLOCK_wtrd=idct2(BLOCK_wtr);<BR> Iw(x:x+8-1,y:y+8-1)=BLOCK_wtrd;<BR> end<BR>end</P>
<P><BR>%水印析出<BR>count=0;<BR>for i=1:32<BR> for j=1:32<BR> count=count+1;<BR> x=(i-1)*8+1;<BR> y=(j-1)*8+1; <BR> iBLOCK=I(x:x+8-1,y:y+8-1);<BR> iBLOCKw=Iw(x:x+8-1,y:y+8-1);<BR> iBLOCK_dct=dct2(iBLOCK);<BR> iBLOCKw_dct=dct2(iBLOCKw);<BR> iBLOCK_zig=zigzag(iBLOCK_dct);<BR> iBLOCKw_zig=zigzag(iBLOCKw_dct);<BR> if iBLOCKw_zig(2)<iBLOCK_zig(2)<BR> Decry(count)=0;<BR> else<BR> Decry(count)=1;<BR> end<BR> end<BR>end<BR><BR>理论上,应该是Encry(水印数据)和Decry(从图中析出后的水印数据)相等的,可实际执行之后,二者变化很大。<BR>有一些现象,如Encry是double array;而Decry却为logical array.<BR>请问,怎么改动才可使两者一样呢。</P> |