?? 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 + -