gusucode.com > 利用DWT的图像数字水印的嵌入与提取,里面包含水印图像、原图像 > DWT_embed.m

    % DWT嵌入数字水印源码
clear crl;
clear all;

blocksize=8; %图像分块大小
A=4;B=1;b=0.318; %水印嵌入程度的调制参数

% 读入载体图像
file_name='lena.bmp';
cover_object0=imread(file_name);
[r_cover,l_cover]=size(cover_object0);

% 读入水印
I=imread('best.bmp');imshow(I);
file_name='best.bmp';
message=imread(file_name);
[r_message,l_message]=size(message);
message_vector=reshape(message,1,r_message*l_message);

if r_message*l_message > r_cover*l_cover/(blocksize^2)
    error('水印太大');
end;

cover_object=double(cover_object0);
watermarked_image=cover_object;

% 图像分块,嵌入水印信息
h=waitbar(0,'嵌入水印,请等待');
x=1;y=1;
for kk=1:length(message_vector);
    w=cover_object(x:x+blocksize-1,y:y+blocksize-1);
    [cA1,cH1,cV1,cD1]=dwt2(w,'haar');  %二级haar小波变换
    [cA2,cH2,cV2,cD2]=dwt2(cA1,'haar');
    a=[cA2,cH2,cV2,cD2];
    ca=reshape(a,1,(blocksize^2)/4);
    ca2=reshape(cA2,1,(blocksize^2)/16);
    ch2=reshape(cH2,1,(blocksize^2)/16);
    cv2=reshape(cV2,1,(blocksize^2)/16);
    cd2=reshape(cD2,1,(blocksize^2)/16);
    E=(sum(ca)-sum(ca2))/(16-4);   % 二级细节子图的小波系数的平均值
    c=[ch2,cv2,cd2]-E;s=0;
    for nn=1:length(c)
        s=s+c(nn)^2;
    end;
    s=sqrt(s);
    t=s^b;
    p=A+t*B;   % 调制参数
    if message_vector(kk)==0
        C=c+p;
    end;
    if message_vector(kk)==1
        C=c;
    end;
    cH2=reshape(C(1:4),2,2);
    cV2=reshape(C(5:8),2,2);
    cD2=reshape(C(9:12),2,2);
    cA1=idwt2(cA2,cH2,cV2,cD2,'haar',[blocksize/2,blocksize/2]); %二级haar小波逆变换
    watermarked_image(x:x+blocksize-1,y:y+blocksize-1)= idwt2(cA1,cH1,cV1,cD1,'haar',[blocksize,blocksize]);
    if (x+blocksize) >= r_cover
        x=1;
        y=y+blocksize;
    else
        x=x+blocksize;
    end;
    waitbar(kk/length(message_vector),h);
end;
close(h);

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

% 将嵌入水印的图像转换成uint8,写入DWT_watermarked_lena.bmp
watermarked_image_uint=uint8(watermarked_image);
imwrite(watermarked_image_uint,'DWT_watermarked_lena.bmp','bmp');

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