📄 dwt1_recover.m
字号:
%DWT源码
%提取源码
clear all;
% 保存开始时间
start_time=cputime;
blocksize=8; % 设置块的大小
% 读入嵌入水印图像
file_name='dwt_watermarked.bmp';
watermarked_image=double(imread(file_name));
% 嵌入水印图像的行数与列数
Mw=size(watermarked_image,1); %嵌入水印图像的行数
Nw=size(watermarked_image,2); %嵌入水印图像的列数
% 最大嵌入信息量
max_message=Mw*Nw/(blocksize^2);
% 读入原始水印
file_name='c.bmp';
orig_watermark=double(imread(file_name));
% 原始水印的行数与列数
Mo=size(orig_watermark,1); %原始水印的行数
No=size(orig_watermark,2); %原始水印的列数
% 将图像分块提取水印
x=1;
y=1;
h=waitbar(0,'水印提取中,请等待');
for (kk = 1:max_message)
% 对块进行dwt变换
[cA1,cH1,cV1,cD1] = dwt2(watermarked_image(x:x+blocksize-1,y:y+blocksize-1),'haar');
% 如果cD1(2,2) > cD1(3,3) 那么 message_vector(kk)=0
% 否则 message_vector(kk)=1
if cD1(2,2)>cD1(3,3)
message_vector(kk)=0;
else
message_vector(kk)=1;
end
% 移动到下一块
if (x+blocksize) >= Mw
x=1;
y=y+blocksize;
else
x=x+blocksize;
end
waitbar(kk/max_message,h);
end
close(h);
% 将message重新排列
message_vector=message_vector(1,1:Mo*No); %%只需前Mo*No个
message=reshape(message_vector,Mo,No);
% 显示运行时间
elapsed_time=cputime-start_time,
% 显示提取水印与原始水印
figure(3)
subplot(1,2,1);
imshow(message,[]);
title('提取水印')
subplot(1,2,2);
imshow(orig_watermark,[])
title('原始水印');
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -