M=256;%原图像长度
N=32;%水印图像长度
K=8;
I=zeros(M,M);
J=zeros(N,N);
BLOCK=zeros(K,K);
%显示水印图像
subplot(2,5,1);
J=imread('水印.bmp');
imshow(J);
title('水印图像');
%显示原图像
subplot(2,5,2);
I=imread('原图.bmp');
imshow(I);
title('原始公开图像');
%嵌入水印
tem=1;
for p=1:N
for q=1:N
x=(p-1)*K+1;
y=(q-1)*K+1;
BLOCK=I(x:x+K-1,y:y+K-1);
BLOCK=dct2(BLOCK);
if J(p,q)==0
a=-1;
else
a=1;
end
BLOCK(2,1)=BLOCK(2,1)*(1+a*0.01);
BLOCK=idct2(BLOCK);
I(x:x+K-1,y:y+K-1)=BLOCK;
end
end
%显示嵌入水印后的图像
subplot(2,5,3);
imshow(I);
title('嵌入水印后的图像');
imwrite(I,'嵌入后.bmp');
%从嵌入水印的图像中提取水印
I=imread('原图.bmp');
J=imread('嵌入后.bmp','bmp');
for p=1:N
for q=1:N
x=(p-1)*K+1;
y=(q-1)*K+1;
BLOCK1 =I(x:x+K-1,y:y+K-1);
BLOCK2 =J(x:x+K-1,y:y+K-1);
BLOCK1=dct2(BLOCK1);
BLOCK2=dct2(BLOCK2);
a = BLOCK2(2,1)/BLOCK1(2,1)-1;
if a<0
W(p,q)=0;
else
W(p,q)=1;
end
end
end
%显示提取的水印
subplot(2,5,4);
imshow(W);
title('从含水印图像中提取的水印');
%攻击检测
L=imread('嵌入后图像.bmp');
title('待检测图像');
imwrite(L,'待检测图像.bmp');
%进行高斯攻击
P=imnoise(L,'gaussian',0,0.0002);
subplot(2,5,5);
imshow(P);%显示高斯攻击后的图像
title('高斯攻击');
imwrite(P,'高斯图.bmp');
%加入椒盐噪声
Q=imnoise(L,'salt & pepper',0.006);
subplot(2,5,6);
imshow(Q);
title('加入椒盐噪声');
imwrite(Q,'椒盐噪声图.bmp');
%滤波
H=fspecial('gaussian',[10,10],5);
I=imfilter(L,H);
subplot(2,5,7);
imshow(I);
title('滤波');
imwrite(I,'滤波图.bmp');
%剪切
Q=L;
Q(1:128,1:128)=256;
subplot(2,5,8);
imshow(Q);
title('剪切');
imwrite(Q,'剪切图.bmp');
%旋转攻击
E=L;
E=imrotate(E,15,'bilinear');%旋转15度
subplot(2,5,9);
imshow(E);
title('旋转');
imwrite(E,'旋转图.bmp');
%JPEG压缩
L=im2double(L);
T=dctmtx(8);p1=T;p2=T';
B=blkproc(L,[8 8],'P1*x*P2',T,T');
mask=[ 1 1 1 1 0 0 0 0
1 1 1 0 0 0 0 0
1 1 0 0 0 0 0 0
1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0] ;
B2=blkproc(B,[8 8],'P1.*x',mask);
I2=blkproc(B2,[8 8],'P1*x*P2',T',T);
subplot(2,5,10);
imshow(I2);
title('压缩');
imwrite(I2,'压缩图.bmp');