沈阳理工大学数字图像处理课程设计
类似于上面的原理,作为水印的彩色图像也分为R,G,B三层,每层可以作为一幅水印图像分别嵌入原图像的矩阵中。提取的时候只要将提取出的三个水印图像存入一个三维矩阵即使一幅彩色图像。
但是这里要注意的是所用的水印图像的R、G、B分量分别只有0、1两个值。所以如果使用的彩色图像不当将会影响嵌入效果,甚至无法提取。
4.3 水印的提取
这里的水印提取方法可以看作是嵌入的反变换,由于在频域的8*8块的直流量中乘上了与水印信息有关的系数,那么同样我们可以通过原图像与水印图像8*8块直流分量的值相除得到的商即是与水印图像相关的值,由于嵌入时水印图像值只含0、1,而且我们在这个值得后面又减了一个小的常数,因此将除得的商减去1记为cc,这样就可以在嵌入的水印值为0的时候cc<0,反之在嵌入的水印值为1的时候cc>0。这样就可以绘制出水印图像。
4.4 仿真程序
%定义常量
size=256; %图像大小:256*256 block=8; %块大小:8*8
%决定了水印图片不大于32*32
blockno=size/block; %每行块的个数
LENGTH=size*size/64; %总块的个数1024 Alpha1=0.03; %非边界处的强度因子 Alpha2=0.1; %边界处的强度因子 T1=3; %域值为三个边界点 I=zeros(size,size); %原始图像
BW=zeros(size,size); %原始图像的边缘图 block_dct1=zeros(block,block);
mark=imread('D:\\水印图','bmp'); %沈阳理工大学字样彩色水印图 mark1=logical(mark(:,:,1)); mark2=logical(mark(:,:,2)); mark3=logical(mark(:,:,3)); figure(1)
subplot(2,2,1);
imshow(mark);title('水印图像'); %显示原图
9
沈阳理工大学数字图像处理课程设计
subplot(2,2,2);I=imread('D:\\原始图','bmp'); %读入彩色图像 imshow(I);title('原始图像:I'); %显示prewitt为算子的边缘图
GRAY=rgb2gray(I); %变灰度要用三位数,即彩色图片 BW=edge(GRAY,'prewitt'); %取边界,用于边界自适应 subplot(2,2,3);imshow(BW); title('原始图像的边缘'); %嵌入水印
for m=1:blockno; %到第(m,n)个块 for n=1:blockno;
x=(m-1)*block+1; %该块的起始像素 y=(n-1)*block+1;
block_dct1=I(x:x+block-1,y:y+block-1); %取该块所有像素 block_dct1=dct2(block_dct1); %变换 %第二维
block_dct2=I(x:x+block-1,y:y+block-1,2); %取该块所有像素 block_dct2=dct2(block_dct2); %变换 %第三维
block_dct3=I(x:x+block-1,y:y+block-1,3); %取该块所有像素 block_dct3=dct2(block_dct3); %变换
BW_8_8=BW(x:x+block-1,y:y+block-1); %取边缘的对应块像素 if m<=1|n<=1;%m或n小于等于1时, T=0; else
T=sum(BW_8_8); %列取和
T=sum(T); %对整个BW_8_8中的数字取和 %取和 end
if T>T1; %如果改为<则意味着高频区嵌入了低能量,低频区嵌入了高能量。所以在低频区嵌入的过高能量会是不该看出的水印显示出来
%因此这里表示着边缘自适应性 Alpha=Alpha2; %0.1 else
Alpha=Alpha1; %0.03 end
block_dct1(1,1)=block_dct1(1,1)*(1+Alpha*(mark1(m,n)-1)); %对直流进行嵌入 block_dct2(1,1)=block_dct2(1,1)*(1+Alpha*(mark2(m,n)-1)); %第二层
10
沈阳理工大学数字图像处理课程设计
block_dct3(1,1)=block_dct3(1,1)*(1+Alpha*(mark3(m,n)-1)); %第三层 block_dct1=idct2(block_dct1); %变回空域 block_dct2=idct2(block_dct2); %第二层 block_dct3=idct2(block_dct3); %第三层
I(x:x+block-1,y:y+block-1)=block_dct1; %贴回原图像 I(x:x+block-1,y:y+block-1,2)=block_dct2; %第二层 I(x:x+block-1,y:y+block-1,3)=block_dct3; %第三层 end end
%显示嵌入水印后的图像
subplot(2,2,4);imshow(I);title('嵌入水印后的图像'); imwrite(I,'D:\\输出图.bmp','bmp');
figure(2);subplot(2,2,1);imshow(mark(:,:,1));title('原水印的第一层'); subplot(2,2,2);imshow(mark(:,:,2));title('原水印的第二层'); subplot(2,2,3);imshow(mark(:,:,3));title('原水印的第三层'); imwrite(I,'D:\\压缩图.jpg','jpg','quality',90); %压缩 %通过原图片对比提取水印 I=imread('D:\\原始图.bmp','bmp'); J=imread('D:\\输出图.bmp','bmp');
K=zeros(32,32,3); %水印图片为32*32
for q=1:blockno; for p=1:blockno;
x=(p-1)*block+1; y=(q-1)*block+1;
BLOCK1=I(x:x+block-1,y:y+block-1); %取无水印图的块 BLOCK2=J(x:x+block-1,y:y+block-1); %取带水印图的块 BLOCK1=dct2(BLOCK1); BLOCK2=dct2(BLOCK2);
a=BLOCK2(1,1)/BLOCK1(1,1)-1; %第二层
BLOCK12=I(x:x+block-1,y:y+block-1,2); BLOCK22=J(x:x+block-1,y:y+block-1,2); BLOCK12=dct2(BLOCK12); BLOCK22=dct2(BLOCK22);
b=BLOCK22(1,1)/BLOCK12(1,1)-1; %第三层
BLOCK13=I(x:x+block-1,y:y+block-1,3);
11
沈阳理工大学数字图像处理课程设计
BLOCK23=J(x:x+block-1,y:y+block-1,3); BLOCK13=dct2(BLOCK13); BLOCK23=dct2(BLOCK23);
c=BLOCK23(1,1)/BLOCK13(1,1)-1; if a<0
W(p,q)=0; %恢复水印图像 else
W(p,q)=1; end if b<0
W2(p,q)=0; else
W2(p,q)=1; end if c<0
W3(p,q)=0; else
W3(p,q)=1; end end
end
figure(3);
subplot(2,2,1);imshow(W);
title('从第一层提取的水印(红R)'); %0表示黑色 subplot(2,2,2);imshow(W2);
title('从第二层提取的水印(绿G)'); subplot(2,2,3);imshow(W3);
title('从第三层提取的水印(蓝B)'); K(:,:,1)=W; K(:,:,2)=W2;
K(:,:,3)=W3;
subplot(2,2,4);imshow(K);title('合并的彩图'); %检测压缩后的水印图像 J=imread('D:\\压缩图.jpg','jpg'); for q=1:blockno; for p=1:blockno;
x=(p-1)*block+1;
12
沈阳理工大学数字图像处理课程设计
y=(q-1)*block+1;
BLOCK1=I(x:x+block-1,y:y+block-1); %取无水印图的块 BLOCK2=J(x:x+block-1,y:y+block-1); %取带水印图的块 BLOCK1=dct2(BLOCK1); BLOCK2=dct2(BLOCK2);
a=BLOCK2(1,1)/BLOCK1(1,1)-1; %第二层
BLOCK12=I(x:x+block-1,y:y+block-1,2); BLOCK22=J(x:x+block-1,y:y+block-1,2); BLOCK12=dct2(BLOCK12);
BLOCK22=dct2(BLOCK22);
b=BLOCK22(1,1)/BLOCK12(1,1)-1; %第三层
BLOCK13=I(x:x+block-1,y:y+block-1,3); BLOCK23=J(x:x+block-1,y:y+block-1,3); BLOCK13=dct2(BLOCK13); BLOCK23=dct2(BLOCK23);
c=BLOCK23(1,1)/BLOCK13(1,1)-1; if a<0
W(p,q)=0; else
W(p,q)=1; end if b<0
W2(p,q)=0; else
W2(p,q)=1; end if c<0
W3(p,q)=0;
else
W3(p,q)=1; end end end
K(:,:,1)=W;K(:,:,2)=W2;K(:,:,3)=W3;
figure(4);imshow(K);title('90压缩的提取');
13