基于Matlab 的数字图像水印技术
- 课题介绍
数字水印技术涉及到许多图像处理算法以及数学计算工具等,如果用普通编程工具实现上述算法,需要要花费大量的时间,MathWorks公司推出的一种简单、高效、功能极强的高级语言——MATLAB语言,它具有高性能数值计算能力,可视化计算环境。只需短短的几行代码就可在MATLAB中解决许多复杂的计算问题。
- 字水印的具体实现
1 数字水印的嵌入
水印嵌入就是把水印信号嵌入到原始图像中。水印嵌入过程如图所示
图1 水印提取过程
水印嵌入准则包括两个准则:H法准则和乘法准则。其中惩罚准则有强度因子,为保证在水印不可见的前提下,尽可能提高嵌入水印的强度。强度因子的选择必须考虑图像的性质以及视觉系统的特性。
2 数字水印的提取与检测
在某水印系统中,水印可以被精确地提取出来,这一过程就是水印提取。例如在完整性确认的应用中,必须能够精确地提取出所嵌入的水印,还要通过水印的完整性来确认多媒体数据的完整性。如果提取出的水印发生了部分的变化,最好还能够通过变化的水印的位置来确定原始数据有没有被篡改的位置。水印在提取检测时可以需要原始图像的参与,也可以不需要原始图像的参与。但将水印技术用于图像的网络发布和传播时,如果检测时需要使用原始图像,则是个缺陷,因此,当前大多数的水印检测算法不需要原始图像的参与[2]。图2和图3分别是水印提取和检测的框图。
图2 水印提取过程
图3 水印检测过程
3 利用Matlab实现图像数字水印加载算法
给图像加水印其实就是一个修改图像数据的过程, 来给图像隐藏带有特定含义的信息编码。 目前,最常见的数字水印算法包括:最低有效位算法LSB(Least significant bits)、Patchwork方法及纹理块映射编码方法、基于变换域方法等。其中LSB算法具有较大的信息隐藏量,可是水印很脆弱,容易被擦除。Patchwork方法和纹理块映射编码方法隐蔽性较好,并且对于有损的JPEG 和滤波、压缩和扭转等操作有较好的抵抗能力,可是仅适用于具有大量纹理区域的图像,不能完全自动完成。
基于变换域方法具有较好的稳健性,变换又包括:离散余弦变换(DCT)、小波变换(WT)、付氏变换(FFT)和哈马斯变换等。其中,基于分块的DCT是最常用的变换之一,因为现在所采用的静止图像压缩标准JPEG也是基于分块DCT的。
本文采用离散余弦变换(DCT)设计了水印的嵌入算法,将二值图像作为水印信号,利用Matlab(当前国内最流行的工程与设计软件)实现算法。
4 水印攻击测试
由于数字水印在实际应用中可能会遭到各种各样的攻击,因此对算法进行攻击测试是衡量一个水印算法优劣的重要手段。本程序的后半部分就是一个水印攻击与水印提取的程序,首先对嵌入水印后的图像进行JPEG压缩(一种水印攻击),而后从压缩的图像中提取出水印。
图4 原始公开图像
图5 水印图像
图6 嵌入水印后的图像
图7 加入高斯噪声的水印图像
图8 从含水印图像中提取出的水印图像
5 源码实现
clear
clc
M =512;%原图像长度
N =64;%水印图像长度
K =8;
I=zeros(M,M);J=zeros(N,N);BLOCK=zeros(K,K);
%显示原图像
subplot(2,3,1);
I=imread('C:\Documents and Settings\Administrator\桌面\图像.jpg','jpg');imshow(I);title('原始公开图像');
%显示水印图像
subplot(2,3,2);
J=imread('C:\Documents and Settings\Administrator\桌面\水印.jpg','jpg');imshow(J);title ('水印图像');
%水印嵌入
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(1,1)=BLOCK(1,1)*(1+a*0.03);BLOCK=idct2(BLOCK);
I(x:x+K-1,y:y+K-1)=BLOCK;
end
end
%显示嵌入水印后的图像
subplot(2,3,3);
imshow(I);title('嵌入水印后的图像');
imwrite(I,'C:\Documents and Settings\Administrator\桌面\图像.jpg','jpg');
%从嵌入水印的图像中提取水印
I=imread('C:\Documents and Settings\Administrator\桌面\图像.jpg','jpg');
J=imread('C:\Documents and Settings\Administrator\桌面\水印.jpg','jpg');
J=imnoise(J,'gaussian',0,0.01);
subplot(2,3,4);imshow(J,[]);title('加入高斯噪声');
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(1,1)/BLOCK1(1,1)-1;
if a<0
W(p,q)=0;
else
W(p,q)=1;
end
end
end
%显示提取的水印
subplot(2,3,5);
imshow(W);
title('从含水印图像中提取的水印');