基于MATLAB的数字水印算法研究实现
一、课题背景
随着图像、音频、视频等多媒体信息以及Internet的迅速发展,多媒体信息在互联 网上的广泛传播变得及其便利,数据的交换和传输过程变得相对简单。多媒体技术的高 速发展带来方便的同时也带来一系列的问题,如此一来使得版权问题日显突出,数据文 件和作品等等容易在没有授权和许可的情况下被拷贝和传播,盗版者只需经过简单的步 骤就可以盗取与原版一致的文件作品并以此牟利。长此以往,盗版的猖獗将会给我国的 信息产业市场带来极大的负面效应,将极大阻碍该产业的健康发展。
传统多媒体保护技术使用的是密码技术,是一种基于香农理论和密码学理论的技 术。然而这种方法不能完全解决实际问题,一方面是文件加密以后由于不可解行而不利 于多媒体信息的传播,另一方面是攻击者容易注意到被加密过的多媒体信息,并进一步 去破解加密过的多媒体信息。因此,密码学通常用于保护传输中的内容,而无法保护解 密过的信息。
二、数字水印技术简介
因此,由于密码学的不完善,我们需要一种更加可靠的技术来解决上述问题。因而 数字水印技术将能满足我们的需求。数字水印技术是将一些标识信息直接嵌入数字载体 当中或是间接表示,且不影响原载体的使用价值,也不容易被探知和再次修改[1]o
数字水印技术是信息伪装技术中最重要的内容之一吐 它作为加密技术的补充,在 多媒体信息的版权保护与完整性认证方面得到了迅猛的发展。文件拥有者利用数字水印 技术把水印(例如图片、文字、商标、序列号等等)以人无法感知的方式镶嵌入用于传 播的多媒体信息中,以防止一些传统的信息破解方法。
综合众多学者的定义和分析已有的数字水印方案,现给出数字水印的定义:数字水 印是永久镶嵌在其它数据(宿主数据)中具有可鉴别性的数字信号或模式,而且并不影 响宿主数据的可用性。作为数字水印技术基本上应当满足下面几个方面的要求:
(1) 安全性:数字水印的信息应是安全的,难以篡改或伪造,同时,应当有较低 的误检测率,当宿主内容发生变法时,数字水印应当发生变化,从而可以检测原始数据 的变更;
(2) 隐蔽性:数字水印应是不可知觉的,而且应不影响被保护数据的正常使用;
(3) 稳健性:数字水印必须难以被除去,如果只知道部分数字水印信息,那么试 图除去或破坏数字水印将导致严重降质或不可用。同时,数字水印在一般信号处理和几 何变换中应具有稳健性;
(4) 水印容量:嵌入的水印信息必须足以表示多媒体内容的创建者或所有者的标 志信息,或购买者的序列号,这样有利于解决版权纠纷,保护数字产权合法拥有者的利 益。
三、算法实现
3.1基于Mat l ab的数字水印嵌入
在得到加密后的水印(图3-2),利用Matlab进行水印嵌入,得到嵌入水印后的图 像,并可以从新图中提取加密后的水印(图3-5)。
图 3-5 Figure3
11
3.2嵌入水印图像与原图的比较
把新图和原图的直方图进行比较
原图直方图(图3-6):
图3-6原图直方图
新图直方图(图3-7):
图3-7新图直方图
原图与新图的频谱比较(图3-8):
图3-8频谱图比较
可以看出,原图与新图在外观上几乎没有区别,但是通过直方图与频谱图的比较两
12
幅图片是存在区别的。那么我们就需要对一张未知的图片进行检测是否含有水印。
3.3检测图像中是否含有水印
对一幅未知的图片,我们要对其进行判断是否含有水印,则需要先从该图像中提取 水印,若存在水印,则提取的水印是基于混沌序列加密过的,用该提取的水印与生成的 混沌序列再进行一次异或运算,看是还原出来的水印(图3-9)是否与原始水印(图3-1) 一致。
图3-9还原水印
原图(图3-10)不含有水印的情况下,还原水印的结果(图3-11):
图3-10原图
图3-11空白图
从一副未知图像(图3-12)中提取水印(图3-13)并还原(图3-14)
图3-12未知图像
图3-13未知图提取水印
图3-14未知图还原水印
四、参考代码附录:
clear all; | subplot(2,2,3); |
%logistic序列生成算法 | imshow(f);title('混沌加密水印图像'); |
figure(1); | imwrite(f,'c:\new\0.BMP'); |
an=linspace(3.1,3.99,400); | subplot(2,2,4); |
hold on;box on;axis([min(an),max(an),-1,2]); | imshow(g);title('水印图像恢复'); |
N=64*64; | |
xn=zeros(1,N); | M=256; |
for a=an; | N=64; |
x=rand; | [filename1,pathname]=uigetfile('*.*,,,select the image'); |
fork=1:20; | image1=imread(num2str(filename1)); |
x=a*x*(1-x); | figure(3);subplot(2,2,1);imshow(image1); |
end | title('original image'); |
fork=1:N; | image1=double(image1); |
x=a*x*(1-x); | subplot(2,2,2);imshow(f);title('original watermark'); |
xn(k)=x; | |
b(k,1)=x; | %嵌入水印 |
end | [ca,ch,cv,cd] = dwt2(image1,'db1'); |
plot(a*ones(1,N),xn,'k.,,,markersize,,1); | [cas,chs,cvs,cds] = dwt2(ca,'db1'); |
fori=1:N | |
end | forj=1:N |
c=reshape(b,64,64); | iff(i,j)==0 |
%二维矩阵调制 | a=-1; |
fora1=1:64; | else |
fora2=1:64; | a=1; |
if c(a1,a2)>=0.5; | end |
d(a1,a2)=1; | Ca(i,j)=cas(i,j)*(1+a*0.03); |
else d(a1,a2)=0; | end |
end; | end |
end; | IM= idwt2(Ca,chs,cvs,cds,'db1'); |
end | markedimage=double(idwt2(IM,ch,cv,cd,'db1')); |
subplot(2,2,3);colormap(gray(256));image(markedimage); | |
%水印加密 | title('marked image'); |
e=imread('c:\new\123.BMP'); | imwrite(markedimage,gray(256),'c:\new\watermarked.bm |
e=double(e); | p','bmp'); |
f=bitxor(d,e);%mm=imread('c:\new\0.BMP');nn=double(m | |
m);%h=bitxor(d,mm); | %提取水印 |
g=bitxor(d,f); | image1=imread(num2str(filename1));image1=double(imag |
figure(2); | e1); |
subplot(2,2,1); | imaged二imread('c:\new\watermarked.bmp'); |
imshow(d);title('混沌序列矩阵,); | [ca,ch,cv,cd] = dwt2(image1,'db1'); |
subplot(2,2,2); | [cas,chs,cvs,cds]=dwt2(ca,'db1'); |
imshow(e);title('水印图像'); | [caa,chh,cvv,cdd]=dwt2(imaged,'db1'); |
end
[caas,chhs,cvvs,cdds]=dwt2(caa,'db1,);
for p=1:N
forq=1:N
a=caas(p,q)/cas(p,q)-1;
if a<0
W(p,q)=0;
else
W(p,q)=255;
end
%频谱
pic1= imread('c:\new\3.jpg'); %pic=rgb2gray(pic);
subplot(2,2,1);
imshow(pic1);
title('原图');
pic_fft1=fft2(double(pic1)); pic_fft1=fftshift(pic_fft1);
subplot(2,2,2);
imshow(log(abs(pic_fft1)),[]); title('原图频谱图');
end
subplot(2,2,4);
colormap(gray(256));image(W);title('从含水印图像中提取 的水印');
imwrite(W,gray(256),'watermark.bmp,,,bmp,);
%figure(4);
h=bitxor(d,W);figure(7);subplot(2,2,1);imshow(h);
pic2= imread('c:\new\watermarked.BMP'); %pic=rgb2gray(pic);
subplot(2,2,3);
imshow(pic2);
title('新图');
pic_fft2=fft2(double(pic2));
pic_fft2=fftshift(pic_fft2);
subplot(2,2,4); imshow(log(abs(pic_fft2)),[]);
title('新图频谱图’