资源简介

基于小波变换的数字水印算法matlab代码,含有各种攻击的效果对比,对做毕设的同学应该有帮助

资源截图

代码片段和文件信息

clc
clear all;


k=20;          
blocksize=8;   % 设置块的大小

% 读入原图像
file_name=‘_lena_std_bw.bmp‘;
cover_object=double(imread(file_name));
 
% 原图像的行数与列数
Mc=size(cover_object1);         %原图像行数
Nc=size(cover_object2);         %原图像列数

% 最大嵌入信息量
max_message=Mc*Nc/(blocksize^2);

% 读入水印图像
file_name=‘c.bmp‘;
message=double(imread(file_name));

%%水印图像的行数与列数
Mm=size(message1);               %水印行数
Nm=size(message2);               %水印列数

message_vector=reshape(message1Mm*Nm);

% 检查水印信息是否过大
if (Mm*Nm> max_message)
  error(‘水印太大‘)
end

% 产生watermarked_image并写入原图信息
watermarked_image=cover_object;


% 将图像分块嵌入
% 当 (22) > (23) 且 message_pad(kk)=0
% 当 (22) < (23) 且 message_pad(kk)=1

%%在提取水印时,如果cD1(22)>cD1(23)便是嵌入了水印的黑色像素,
%%反之则是嵌入了白色像素
x=1;
y=1;
h=waitbar(0‘嵌入水印,请等待‘);
for (kk = 1:length(message_vector))

  % 对块进行DWT变换
  [cA1cH1cV1cD1] = dwt2(cover_object(x:x+blocksize-1y:y+blocksize-1)‘haar‘);
  % 如果 message_pad(kk)== 0
  if (message_vector(kk) == 0)

    % 且(22) < (23) ,交换它们
    if (cD1(22) < cD1(23))
          temp=cD1(23);
          cD1(23)=cD1(22);
          cD1(22)=temp;
    end
  
  % 如果message_pad(kk) == 1 
  elseif (message_vector(kk) == 1)
    
    % 且(22) > (23) ,交换它们
    if (cD1(22) >= cD1(23))
          temp=cD1(23);
          cD1(23)=cD1(22);
          cD1(22)=temp;
    end
  end
  
  % 检查(22) , (23)的差是否>= k
  if cD1(22) > cD1(23)
    if cD1(22) - cD1(23) < k
        cD1(22)=cD1(22)+(k/2);
        cD1(23)=cD1(23)-(k/2);         
    end
  else 
      if cD1(23) - cD1(22) < k
        cD1(23)=cD1(23)+(k/2); 
        cD1(22)=cD1(22)-(k/2);
    end
  end
    
  %IDWT
  watermarked_image(x:x+blocksize-1y:y+blocksize-1)= idwt2(cA1cH1cV1cD1‘haar‘[McNc]);


  % 移动到下一块
  if (x+blocksize) >= Nc
    x=1;
    y=y+blocksize;
  else
    x=x+blocksize;
  end
  waitbar(kk/length(message_vector)h);
end
close(h);

% 转换为uint8并写入dwt_watermarked.bmp
watermarked_image_uint=uint8(watermarked_image);
imwrite(watermarked_image_uint‘dwt_watermarked.bmp‘‘bmp‘);

% 计算psnr值
psnr=psnr(cover_objectwatermarked_image) 

% 显示图像
%figure(1)
%imshow(message[]);
%title(‘水印‘);
figure(2)
subplot(121);
imshow(watermarked_image[])
title(‘嵌入水印图像‘)
subplot(122);
imshow(cover_object[]);
title(‘原图‘);




%提取源码
clear all;

blocksize=8;   % 设置块的大小

% 读入嵌入水印图像
file_name=‘dwt_watermarked.bmp‘;
watermarked_image=double(imread(file_name));

% 嵌入水印图像的行数与列数
Mw=size(watermarked_image1);         %嵌入水印图像的行数
Nw=size(watermarked_image2);         %嵌入水印图像的列数

% 最大嵌入信息量
max_message=Mw*Nw/(blocksize^2);

% 读入原始水印
file_name=‘c.bmp‘;
orig_watermark=double(imread(file_name));

% 原始水印的行数与列数
Mo=size(orig_watermark1);    %原始水印的行数
No=size(orig_watermark2);    %原始水印的列数

% 将图像分块提取水印
x=1;
y=1;
h=waitbar(0‘水印提取中,请等待‘);
for (kk = 1:max_message) 

  % 对块进行dwt变换
  [cA1cH1cV1cD1] = dwt2(watermarked_im

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件     263222  2009-04-03 14:02  算法代码\attack.bmp

     文件      14877  2008-05-28 12:51  算法代码\attackf.jpg

     文件        574  2008-05-23 15:33  算法代码\c.BMP

     文件        969  2008-05-23 15:26  算法代码\c.jpg

     文件        190  2008-05-23 15:31  算法代码\d.BMP

     文件       7205  2008-05-27 23:54  算法代码\dwt.asv

     文件       7172  2008-05-30 10:18  算法代码\dwt.m

     文件     263222  2009-04-03 14:01  算法代码\dwt_watermarked.bmp

     文件      44465  2008-05-23 14:58  算法代码\lina.jpg

     文件        572  2008-05-12 11:03  算法代码\psnr.m

    ..A.SH.     27648  2010-01-16 15:28  算法代码\Thumbs.db

     文件     263222  2008-05-23 14:58  算法代码\_lena_std_bw.bmp

     目录          0  2010-01-16 15:28  算法代码

----------- ---------  ---------- -----  ----

               893338                    13


评论

共有 条评论