深度学习机器学习图像处理的matlab项目实战案例系列
基于小波变换的数字水印技术
数字水印技术
作为一门有效的多媒体版权保护技术受到越来越多的关注.提出了一种基于小波变换的图像数字水印算法.依据人眼视觉特性,将数字水印信息嵌入到经过小波变换后的图像的高频子带纹理区内,人眼不易察觉,再利用含水印图像和原始图像提取出嵌入的水印。
小波变换
小波变换(wavelet transform,WT)是一种新的变换分析方法,它继承和发展了短时傅立叶变换局部化的思想,同时又克服了窗口大小不随频率变化等缺点,能够提供一个随频率改变的“时间-频率”窗口,是进行信号时频分析和处理的理想工具。它的主要特点是通过变换能够充分突出问题某些方面的特征,能对时间(空间)频率的局部化分析,通过伸缩平移运算对信号(函数)逐步进行多尺度细化,最终达到高频处时间细分,低频处频率细分,能自动适应时频信号分析的要求,从而可聚焦到信号的任意细节,解决了Fourier变换的困难问题,成为继Fourier变换以来在科学方法上的重大突破。
小波变换联系了应用数学、物理学、计算机科学、信号与信息处理、图像处理等多种方法。该方法还继承和发展了短时傅立叶变换局部化的思想,同时又克服了窗口大小不随频率变化等缺点,能够提供一个随频率改变的“时间-频率”窗口,是进行信号时频分析和处理的理想工具。它的主要特点是通过变换能够充分突出问题某些方面的特征,因此,小波变换在许多领域都得到了成功的应用,特别是小波变换的离散数字算法已被广泛用于许多问题的变换研究中。
函数及文件目录
效果展示:
对于其中的主函数
main.m
close all
I = imread('office_5.jpg');
I = rgb2gray(I);
W = imread('logo.tif');
W=W(12:91,17:96);
figure('Name','载体图像')
imshow(I);
title('载体图像')
figure('Name','水印图像')
imshow(W);
title('水印图像')
ntimes=23;
rngseed=59433;
flag=1;
[Iw,psnr]=setdwtwatermark(I,W,ntimes,rngseed,0);
[Wg,nc]=getdwtwatermark(Iw,W,ntimes,rngseed,0);
close all
action={'filter','resize','crop','noise','rotate'};
for i=1:numel(action)
dwtwatermarkattack(action{i},Iw,W,ntimes,rngseed);
end
水印函数1
function [Wg,nc]=getdwtwatermark(Iw,W,ntimes,rngseed,flag)
[mW,nW]=size(W);
if mW~=nW
error('GETDWTWATERMARK:ARNOLD','ARNOLD置乱要求水印图像长宽必须相等!')
end
Iw=double(Iw);
W=logical(W);
ca1w=dwt2(Iw,'haar');
ca2w=dwt2(ca1w,'haar');
Wa=W;
rng(rngseed);
idx=randperm(numel(ca2w),numel(Wa));
for i=1:numel(Wa)
c=ca2w(idx(i));
z=mod(c,nW);
if z<nW/2
Wa(i)=0;
else
Wa(i)=1;
end
end
Wg=Wa;
H=[2 -1;-1,1]^ntimes;
for i=1:nW
for j=1:nW
idx=mod(H*[i-1;j-1],nW)+1;
Wg(idx(1),idx(2))=Wa(i,j);
end
end
nc=sum(Wg(:).*W(:))/sqrt(sum(Wg(:).^2))/sqrt(sum(W(:).^2));
if flag
figure('Name','数字水印提取结果')
subplot(121)
imshow(W)
title('原始水印')
subplot(122)
imshow(Wg)
title(['提取水印,NC=',num2str(nc)]);
end
水印函数
function dwtwatermarkattack(action,Iw,W,ntimes,rngseed)
switch lower(action)
case 'filter'
Ia=imfilter(Iw,ones(3)/9);
case 'resize'
Ia=imresize(Iw,0.5);
Ia=imresize(Ia,2);
case 'noise'
Ia=imnoise(Iw,'salt & pepper',0.01);
case 'crop'
Ia=Iw;
Ia(50:400,50:400)=randn();
case 'rotate'
Ia=imrotate(Iw,45,'nearest','crop');
Ia=imrotate(Ia,-45,'nearest','crop');
end
[Wg,nc]=getdwtwatermark(Ia,W,ntimes,rngseed,0);
figure('Name',['数字水印 ',upper(action),' 攻击试验'],'Position',[287,108,943,557]);
subplot(221)
imshow(Iw)
title('嵌入水印图像')
subplot(222)
imshow(Ia)
title(['遭受 ',upper(action), ' 攻击'])
subplot(223)
imshow(W)
title('原始水印图像')
subplot(224)
imshow(Wg)
title(['提取水印,NC=',num2str(nc)]);
水印处理函数
function [Iw,psnr]=setdwtwatermark(I,W,ntimes,rngseed,flag)
type=class(I);
I=double(I);
W=logical(W);
[mI,nI]=size(I);
[mW,nW]=size(W);
if mW~=nW
error('SETDWTWATERMARK:ARNOLD','ARNOLD置乱要求水印图像长宽必须相等!')
end
[ca1,ch1,cv1,cd1]=dwt2(I,'haar');
[ca2,ch2,cv2,cd2]=dwt2(ca1,'haar');
if flag
figure('Name','载体小波分解')
subplot(121)
imagesc([wcodemat(ca1),wcodemat(ch1);wcodemat(cv1),wcodemat(cd1)])
title('一级小波分解')
subplot(122)
imagesc([wcodemat(ca2),wcodemat(ch2);wcodemat(cv2),wcodemat(cd2)])
title('二级小波分解')
end
Wa=W;
H=[1,1;1,2]^ntimes;
for i=1:nW
for j=1:nW
idx=mod(H*[i-1;j-1],nW)+1;
Wa(idx(1),idx(2))=W(i,j);
end
end
if flag
figure('Name','水印置乱效果')
subplot(121)
imshow(W)
title('原始水印')
subplot(122)
imshow(Wa)
title(['置乱水印,变换次数=',num2str(ntimes)]);
end
ca2w=ca2;
rng(rngseed);
idx=randperm(numel(ca2),numel(Wa));
for i=1:numel(Wa)
c=ca2(idx(i));
z=mod(c,nW);
if Wa(i)
if z<nW/4
f=c-nW/4-z;
else
f=c+nW*3/4-z;
end
else
if z<nW*3/4
f=c+nW/4-z;
else
f=c+nW*5/4-z;
end
end
ca2w(idx(i))=f;
end
ca1w=idwt2(ca2w,ch2,cv2,cd2,'haar');
Iw=idwt2(ca1w,ch1,cv1,cd1,'haar');
Iw=Iw(1:mI,1:nI);
mn=numel(I);
Imax=max(I(:));
psnr=10*log10(mn*Imax^2/sum((I(:)-Iw(:)).^2));
I=cast(I,type);
Iw=cast(Iw,type);
if flag
figure('Name','嵌入水印的图像')
subplot(121)
imshow(I);
title('原始图像')
subplot(122);
imshow(Iw);
title(['添加水印,PSNR=',num2str(psnr)]);
end
主要是水印的添加、获取和处理相关的。嵌入式开发。hhh
本文配套
源码文件–—>传送门