W=imread('d:\design\2.bmp');
I=imread('d:\design\1.bmp');
I=double(I)
figure(2),imshow(I,[]);
title('原始图像') %读取原始图像并显示
N=32; %水印信息尺度
M=256; %原图像尺度
K=8; %分块系数
L=0.5; %嵌入深度
%将水印加入到原始图像
for m=1:N %原图像8×8分块
for n=1:N
x=(m-1)*K+1;
y=(n-1)*K+1;
block_dwt=I(x:x+K-1,y:y+K-1);
[ca1,ch1,cv1,cd1]=dwt2(block_dwt,'db1');%对原始图像分块后进行二维离散小波变换
if W(m,n)==0
ca2=ca1 ;
else ca2=ca1+L*W(m,n);%将水印嵌入到图像块中
end
blockidwt=idwt2(ca2,ch1,cv1,cd1,'db1')%对分块后的图像进行二维离散反变换
D(x:x+K-1,y:y+K-1)=blockidwt;
end
end
figure(3),imshow(D,[]);
title('含水印图像') %显示出被植入水印的图像
%提取水印图像
TT=0.95 ; %提取时所设置的门限,为了更好的提取出水印。
for j=1:N
for i=1:N
x=(j-1)*K+1;
y=(i-1)*K+1;
block_dwt1=I(x:x+K-1,y:y+K-1);
[Ca1,Ch1,Cv1,Cd1]=dwt2(block_dwt1,'db1');%对含水印图像进行DWT
block_dwt2=D(x:x+K-1,y:y+K-1);
[Ca2,Ch2,Cv2,Cd2]=dwt2(block_dwt2,'db1');%对原始图像进行DWT
if Ca2==Ca1
a(j,i)=0 ;
else wmf(4,4)=0; %定义的一个矩阵。
wmf(1:4,1:4)=(Ca2-Ca1)/L;%将水印从图像块中提取
if wmf(1,1)>TT;
a(j,i)=1;
else a(j,i)=0;
end
end
end
end
figure(4),imshow(a,[]);title('提取后的水印') ;
%对水印进行各种攻击
%低通滤波攻击
%加入方差不同的高斯噪声
hh=fspecial('gaussian',3,0.1);
% hh=fspecial('gaussian',3,0.24);
% hh=fspecial('gaussian',3,0.5);
R1=filter2(hh,D); %低通滤波
%提取水印图像
TT=0.95 ;%提取时所设置的门限,为了更好的提取出水印。
for j=1:N
for i=1:N
x=(j-1)*K+1;
y=(i-1)*K+1;
block_dwt1=I(x:x+K-1,y:y+K-1);
[Ca1,Ch1,Cv1,Cd1]=dwt2(R1,'db1');
block_dwt2=D(x:x+K-1,y:y+K-1);
[Ca2,Ch2,Cv2,Cd2]=dwt2(block_dwt2,'db1');
if Ca2==Ca1
a(j,i)=0 ;
else wmf(4,4)=0; %定义的一个矩阵。
wmf(1:4,1:2)=(Ca2-Ca1)/L;
if wmf(1,1)>TT;
a(j,i)=1;
else a(j,i)=0;
end
end
end
end
figure(5),imshow(a,[]) ;title('受攻击后提取出的水印');