基于DCT域的水印嵌入和提取

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

14电信温美松14284030489、基于DCT域的水印算法此程序对原始图像以及水印图像有一定要求:1)原始图像不能有大片灰度均匀的地方,否则大量子块方差相等,嵌入时标记、提取时比对,都会错乱;2)原始图像长、宽是8的整数倍最好;3)水印图像总像素点必须少于原始图像8*8子块数,最好是通过MATLAB查看原始图像方最大且不等的前n块,限制水印图像总像素点小于等于n。MATLAB函数——嵌入:clcclearallk=20;block_size=8;DCT_coef=[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];orig_image=double(imread('woman2.jpg'));%原始图像orig_image_show=orig_image;%用于显示原图[Hc,Wc]=size(orig_image);c=Hc/8;d=Wc/8;m=c*d;%将原图分为m个8*8块watermark=double(imread('wenmeisong.jpg'));%水印图像,白色为目标watermark_show=watermark;%用于显示水印[Hm,Wm]=size(watermark);%水印尺寸n=Hm*Wm;%水印图像总像素点n%reshape将水印按列重组为一维向量%round将序列四舍五入,通过除以256将watermark转为0(背景)、1(目标)二值watermark=round(watermark./256);watermark=reshape(watermark,1,Hm*Wm);xx=1;mean=zeros(1,c*d);%预先分配内存variance=mean;%预先分配内存%求方差forj=1:cfori=1:dmean(xx)=1/64*sum(sum(orig_image(((1+(j-1)*8):j*8),((1+(i-1)*8):i*8))));variance(xx)=1/64*sum(sum((orig_image(1+(j-1)*8:j*8,1+(i-1)*8:i*8)-mean(xx)).^2));xx=xx+1;endend%将方差升序排列存于A,长度为c*d,即子块数mA=sort(variance);%16506A=fliplr(A);%最终降序排列%取出方差最大的前n块,长度为n,即水印像素数B=A(1:n);%标记水印信息到方差最大的前n块variance_o=zeros(1,c*d);forg=1:nforh=1:c*difB(g)==variance(h)variance_o(h)=watermark(g);h=c*d;endendendwatermark_vector=variance_o;watermarked_image=orig_image;%准备嵌入的图像%设置MATLAB随机数生成器状态J,作为系统秘钥K%MATLAB只要知道初始状态,就确定唯一的伪随机序列rand('state',7);%根据当前的随机数生成器状态,生成0、1的伪随机序列,长度为22pn_sequence_zero=round(rand(1,sum(sum(DCT_coef))));%嵌入水印x=1;y=1;forkk=1:m%一共m个子块%分块DCT变换dct_block=dct2(orig_image(y:(y+block_size-1),x:(x+block_size-1)));%纹理大并且被标示的水印信息为1(目标)的块在DCT中频系数嵌入伪随机序列zz=1;ifwatermark_vector(kk)==1;forii=1:block_sizeforjj=1:block_sizeif(DCT_coef(jj,ii)==1)dct_block(jj,ii)=dct_block(jj,ii)+pn_sequence_zero(zz)*k;zz=zz+1;endendendend%分块DCT逆变换watermarked_image(y:(y+block_size-1),x:(x+block_size-1))=idct2(dct_block);if(x+block_size)Wcx=1;if(y+block_size)Hcy=1elsey=y+block_size;endelsex=x+block_size;endendwatermarked_image_int=uint8(watermarked_image);%生成并输出嵌入水印后的图像imwrite(watermarked_image_int,'dct2_A.jpg','jpg');%显示嵌入水印后的图像figure(1);subplot(131)imshow(orig_image_show,[])xlabel('原图像');subplot(132)imshow(watermark_show,[]);xlabel('水印图像')subplot(133)imshow(watermarked_image_int,[]);xlabel('嵌入水印后的图像')实验结果:MATLAB程序——提取水印:clcclearallblock_size=8;%zig_zag扫描位置DCT_coef=[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];orig_image=double(imread('woman2.jpg'));%读入原始载体图像watermarked_image=double(imread('dct2_A.jpg'));%待检测图像[Hw,Ww]=size(watermarked_image);%待检测图像尺寸c=Hw/8;d=Ww/8;m=c*d;orig_watermark=double(imread('shuiyinsong3.jpg'));%读入原水印[Ho,Wo]=size(orig_watermark);n=Ho*Wo;%设置相同的随机数生成器状态J,作为检测时的系统秘钥%生成相同伪随机序列,长度同为22rand('state',7);pn_sequence_zero=round(rand(1,sum(sum(DCT_coef))));%提取水印x=1;y=1;forkk=1:m%m个子块%对待检测图像进行分块DCT变换dct_block1=dct2(watermarked_image(y:(y+block_size-1),x:(x+block_size-1)));%对原始图像进行分块DCT变换dct_block2=dct2(orig_image(y:(y+block_size-1),x:(x+block_size-1)));tt=1;forii=1:block_sizeforjj=1:block_sizeifDCT_coef(jj,ii)==1%取出DCT中频区域的信息sequence(tt)=dct_block1(jj,ii)-dct_block2(jj,ii);tt=tt+1;endendend%计算相关性ifsequence==0;correlation(kk)=0;elsecorrelation(kk)=corr2(pn_sequence_zero,sequence);end%换行ifx+block_sizeWwx=1;ify+block_sizeHwy=1;elsey=y+block_size;endelsex=x+block_size;endend%相关性大于0.5嵌入,否则表明未被嵌入forkk=1:mifcorrelation(kk)=0.5watermark_vector(kk)=1;elsewatermark_vector(kk)=0;endend%计算原始图像的方差xx=1;forj=1:cfori=1:dmean(xx)=1/64*(sum(sum(orig_image(((1+(j-1)*8):j*8),((1+(i-1)*8):i*8)))));variance(xx)=1/64*sum(sum((orig_image((1+(j-1)*8:j*8),(1+(i-1)*8:i*8))-mean(xx)).^2));xx=xx+1;endend%取出方差最大的前N块A=sort(variance);A=fliplr(A);%最终降序排列B=A(1:n);%根据原始图像方差最大的前N块的位置把水印信息提取出来variance_o=zeros(1,n);forg=1:nforh=1:mifB(g)==variance(h)variance_o(g)=watermark_vector(h);h=m;endendendwatermark_o=variance_o;%重组水印信息watermark=reshape(watermark_o(1:Ho*Wo),Ho,Wo);%计算提取的水印和原始图像的相似度%sim=corr2(orig_watermark,watermark);%把提取的水印信息保存imwrite(watermark,'watermark.jpg','jpg');figure;subplot(211)imshow(orig_watermark,[]);xlabel('原水印图像');subplot(212)imshow(watermark,[])xlabel('提取出的水印图像');实验结果:提取出的水印,左侧与原图几乎一致,中间略有失真,右侧失真较大。这是因为,通过查看MATLAB数据信息,可以发现原始图像中方差最大的前n块中,仅有前面一部分是完全不相等,中间偶尔有几个子块的方差相等,最后经常出现方差相等的情况。故而在嵌入标记与提取比对时,B(g)==variance(h)这一条件,会导致不同B(g)匹配同一variance(h)。

1 / 6
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功