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

📄 dwt1_embed.m

📁 利用matlab实现的基于离散小波变换的数字水印代码
💻 M
字号:
%DWT水印源码
%完全根据DCT1修改,只为了抛砖引玉
%人生在于尝试,快乐。
%有错误的地方希望大家指正
%嵌入源码
clc
clear all;

% 保存开始时间
start_time=cputime;

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

% 读入原图像
file_name='_lena_std_bw.bmp';
cover_object=double(imread(file_name));

% 原图像的行数与列数
Mc=size(cover_object,1);	        %原图像行数
Nc=size(cover_object,2);	        %原图像列数

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

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

%%水印图像的行数与列数
Mm=size(message,1);	                %水印行数
Nm=size(message,2);	                %水印列数

message_vector=reshape(message,1,Mm*Nm);

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

%将随机数发生器的状态置为1100
randn('state',1100);


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


% 将图像分块嵌入
% 当 (2,2) > (2,3) 且 message_pad(kk)=0
% 当 (2,2) < (2,3) 且 message_pad(kk)=1

%%经过分析可以得出结论:在提取水印时,如果cD1(2,2)>cD1(2,3)便是嵌入了水印的黑色像素,
%%反之则是嵌入了白色像素
x=1;
y=1;
h=waitbar(0,'嵌入水印,请等待');
for (kk = 1:length(message_vector))

    % 对块进行DWT变换
    [cA1,cH1,cV1,cD1] = dwt2(cover_object(x:x+blocksize-1,y:y+blocksize-1),'haar');
   a=cD1;
    % 如果 message_pad(kk)== 0
    if (message_vector(kk) == 0)

        % 且(2,2) < (2,3) ,交换它们
        if (cD1(2,2) < cD1(2,3))
                temp=cD1(2,3);
                cD1(2,3)=cD1(2,2);
                cD1(2,2)=temp;
        end
    
    % 如果message_pad(kk) == 1, 
    elseif (message_vector(kk) == 1)
        
        % 且(2,2) > (2,3) ,交换它们
        if (cD1(2,2) >= cD1(2,3))
                temp=cD1(2,3);
                cD1(2,3)=cD1(2,2);
                cD1(2,2)=temp;
        end
    end
    
    % 检查(2,2) , (2,3)的差是否>= k
    if cD1(2,2) > cD1(2,3)
        if cD1(2,2) - cD1(2,3) < k
            cD1(2,2)=cD1(2,2)+(k/2);
            cD1(2,3)=cD1(2,3)-(k/2);            
        end
    else  
         if cD1(2,3) - cD1(2,2) < k
            cD1(2,3)=cD1(2,3)+(k/2);  
            cD1(2,2)=cD1(2,2)-(k/2);
        end
    end
        
    %IDWT
    watermarked_image(x:x+blocksize-1,y:y+blocksize-1)= idwt2(cA1,cH1,cV1,cD1,'haar',[Mc,Nc]);


    % 移动到下一块
    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');

% 显示运行时间
elapsed_time=cputime-start_time,

% 计算psnr值
psnr=psnr(cover_object,watermarked_image),  

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


⌨️ 快捷键说明

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