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

    % DWT数字水印提取源码
clear crl;
clear all;

blocksize=8; %图像分块大小
Th=55;

% 读入嵌入数字水印的图像
file_name='DWT_watermarked_lena.bmp';
watermarked_image0=imread(file_name);
[r_watermarked,l_watermarked]=size(watermarked_image0);
watermarked_image=double(watermarked_image0);

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

% 将图像分块,提取水印
h=waitbar(0,'提取水印,请等待');
x=1;y=1;
for kk=1:length(message_vector);
    w=watermarked_image(x:x+blocksize-1,y:y+blocksize-1);
    [cA1,cH1,cV1,cD1]=dwt2(w,'haar');
    [cA2,cH2,cV2,cD2]=dwt2(cA1,'haar');
    ch2=reshape(cH2,1,(blocksize^2)/16); %二级haar小波变换
    cv2=reshape(cV2,1,(blocksize^2)/16);
    cd2=reshape(cD2,1,(blocksize^2)/16);
    c=[ch2,cv2,cd2];
    s=sum(c); %二级细节子图的小波系数的和
    if s<Th  %当二级细节子图的小波系数的和小于阀值,水印信息判定为1
        watermark(kk)=1;
    elseif s>=Th %当二级细节子图的小波系数的和大于或等于阀值,水印信息判定为0
        watermark(kk)=0;
    end;
    if (x+blocksize) >= r_watermarked
        x=1;
        y=y+blocksize;
    else
        x=x+blocksize;
    end;
    waitbar(kk/length(message_vector),h);
end;
close(h);

% watermark0表示提取的水印
watermark0=reshape(watermark,r_message,l_message);

%计算归一化相关系数Nc
Nc=nc(message,watermark0)

figure
subplot(1,2,1)
imshow(watermark0,[]);
title('提取的水印');
subplot(1,2,2)
imshow(message,[]);
title('原始水印');