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

📄 嵌入代码.txt

📁 在MATLAB环境下的基于DCT的数字水印提取算法
💻 TXT
字号:
clear all;                                     % 清除工作空间中的所有对象
k=20;                                          % 设置水印强度
blocksize=8;                                   % 设定图像的分块大小为8×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('copyright.bmp'));         % 读入水印图像“copyright.bmp”,
                                                 % 并转换为双精度数组  
Mm=size(message,1);                              % 计算图像高度
Nm=size(message,2);                              % 计算图像宽度
n=Mm*Nm;
message=round(reshape(message,1,n)./256);        % 将水印图像转换为1维行向量,
                                                 % message由0,1构成
cover_object=double(imread('lena.bmp'));         % 读入原始宿主图像“lena.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);                   % 取出方差最大的前n块

% 将水印信息嵌入到方差最大的前n块
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);                                 % 设置MATLAB随机生成器状态J=7,作为系统密钥
pn_sequence_zero=round(rand(1,sum(sum(midband)))); % 根据当前生成器状态J,生成0,1的伪随机序列

% 嵌入水印
x=1;y=1;
for(kk=1:m)
   % 分块DCT变换
   dct_block=dct2(cover_object(y:y+blocksize-1,x:x+blocksize-1));
   %纹理大(方差最大的前n块)且被标示的水印信息为0的块在其DCT中频系数嵌入伪随机序列
   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
   % 分块DCT反变换
  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('Watermarkd Image')

⌨️ 快捷键说明

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