⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fft_embed.m

📁 基于离散傅立叶变换的数字水印matlab源码
💻 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 + -