📄 fft_embed.m
字号:
%DFT水印源码
%参照DCT2修改,只为抛砖引玉
%快乐!
%嵌入代码
clc
clear all;
% 保存开始时间
start_time=cputime;
k=110; % 设置嵌入强度系数
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='_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
% 将cover_object(原图矩阵)写入watermarked_image
watermarked_image=cover_object;
%置随机数发生器的状态为1100
rand('state',1100);
% 产生伪随机序列
pn_sequence=round(2*(rand(1,sum(sum(filter_m)))-0.5));
% 将图像分块
x=1;
y=1;
h=0;
h=waitbar(0,'嵌入水印,请等待');
for (kk = 1:length(message_vector))
% 做傅立叶变换
fft_block=fft2(cover_object(y:y+blocksize-1,x:x+blocksize-1));
abs_block=abs(fftshift(fft_block));
angle_block=angle(fft_block);
% 当message_vector=0且filter_m=1时用伪随机序列叠加abs_block
ll=1;
if (message_vector(kk)==0)
for ii=1:blocksize
for jj=1:blocksize
if (filter_m(ii,jj)==1)
abs_block(ii,jj)=abs_block(ii,jj)+k*pn_sequence(ll);
ll=ll+1;
end
end
end
end
% 进行傅立叶逆变换
abs_block=fftshift(abs_block);
watermarked_image(y:y+blocksize-1,x:x+blocksize-1)=abs(ifft2(abs_block.*exp(i*angle_block)));
% 移动到下一块
if (x+blocksize) >= Nc
x=1;
y=y+blocksize;
else
x=x+blocksize;
end
waitbar(kk/length(message_vector),h);
end
close(h);
% 转换为uint8,并写入
watermarked_image_int=uint8(watermarked_image);
imwrite(watermarked_image_int,'fft2_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 + -