⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 提取代码.txt

📁 在MATLAB环境下的基于DCT的数字水印提取算法
💻 TXT
字号:
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(lena.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(copyright.bmp));                   % 读入水印图像
Mo=size(orig_watermark,1);No=size(orig_watermark,2);n=Mo*No;
rand('state',7);                                                % 设置相同的随机生成器状态J=7,
                                                                % 作为检测时的系统密钥K
pn_sequence_zero=round(rand(1,sum(sum(midband))));              % 生成相同的伪随机序列

% 提取水印
x=1;y=1;
for(kk=1:m)
   % 原始图像和待检测图像分别分块DCT变换
   dct_block1=dct2(watermarked_imgae(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
% 相关性大于0.5嵌入0,不大于0.5则表明曾经被嵌入
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
% 取出方差最大的前n块
A=sort(fc);B=A((c*d-n+1):c*d);
% 根据原始图像方差最大的前n块的位置把水印信息提取出来
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)
% 把水印信息保存名为“message.bmp”的位图图像
imwrite(message,'message.bmp',bmp);
    

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -