M=256; %原图256x256
N=32; %水印32x32同时,256/8=32
K=8; %8x8的分块
I=zeros(M,M);
J=zeros(N,N);
BLOCK=zeros(K,K);
subplot(2,2,1);
I=imread('original.jpg');
imshow(I);
title('原图');
subplot(2,2,2);
J=imread('waterPrint.bmp');
imshow(J);
title('水印');
%%%%%%% 分块,DCT变换 %%%%%%%
for p=1:N %256/8
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
BLOCK=dct2(BLOCK); %二维离散余弦变换
%% 嵌入水印,反DCT变换
if J(p,q)==0
a=-1;
else
a=1;
end
BLOCK=BLOCK*(1+a*0.03);
BLOCK=idct2(BLOCK); %反二维离散余弦变换
I(x:x+K-1,y:y+K-1)=BLOCK;
end
end
subplot(2,2,3);
imshow(I);
title('嵌入水印后的图像');
imwrite(I,'waterMarked.jpg');
%%%%% 提取水印 %%%%%
I=imread('original.jpg'); %原图
P=imread('waterMarked.jpg'); %嵌入水印的图像
%提取水印算法
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);
BLOCK1=idct2(BLOCK1);
BLOCK2=P(x:x+K-1,y:y+K-1);
BLOCK2=idct2(BLOCK2);
a=BLOCK2(1,1)/BLOCK1(1,1)-1;
if a<0
W(p,q)=0;
else
W(p,q)=1;
end
end
end
subplot(2,2,4);
imshow(W);
title('提取的水印');
imwrite(W,'waterPrint2.bmp');