📄 fft_recover.m
字号:
%DFT水印
%提取源码
%参照DCT2修改,只为抛砖引玉
%快乐!
clc
clear all;
% 保存开始时间
start_time=cputime;
blocksize=8; % 设置块的大小
filter_m=[ 0,0,0,0,0,0,0,0; % 滤波矩阵
0,1,1,1,1,1,1,0;
0,1,1,1,1,1,1,0;
0,1,1,1,1,1,1,0;
0,1,1,1,1,1,1,0;
0,1,1,1,1,1,1,0;
0,1,1,1,1,1,1,0;
0,0,0,0,0,0,0,0 ];
% 读入嵌入水印图像
file_name='fft2_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);
%置随机数发生器的状态为1100
rand('state',1100);
% 产生伪随机序列
pn_sequence=round(2*(rand(1,sum(sum(filter_m)))-0.5));
% 将图像分块
x=1;
y=1;
h=waitbar(0,'提取水印,请等待');
for (kk = 1:max_message)
% 傅立叶变换
fft_block_w=fft2(watermarked_image(y:y+blocksize-1,x:x+blocksize-1));
abs_block_w=abs(fftshift(fft_block_w));
%
ll=1;
for ii=1:blocksize
for jj=1:blocksize
if (filter_m(ii,jj)==1)
sequence(ll)=abs_block_w(ii,jj);
ll=ll+1;
end
end
end
% 计算sequence与pn_sequence的相关系数
correlation(kk)=corr2(pn_sequence,sequence);
% 移动到下一块
if (x+blocksize) >= Nw
x=1;
y=y+blocksize;
else
x=x+blocksize;
end
waitbar(kk/max_message,h);
end
close(h);
% 如果相关系数大于相关系数平均值,那么message_vector=0,反之为1.
for (kk=1:Mo*No)
if (correlation(kk) > mean(correlation(1:Mo*No)))
message_vector(kk)=0;
else
message_vector(kk)=1;
end
end
% 将message_vector转换为原始水印矩阵大小
message=reshape(message_vector(1:Mo*No),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 + -