基于Matlab的数字水印设计基于DCT域的水印实现课程设计Word下载.docx
《基于Matlab的数字水印设计基于DCT域的水印实现课程设计Word下载.docx》由会员分享,可在线阅读,更多相关《基于Matlab的数字水印设计基于DCT域的水印实现课程设计Word下载.docx(17页珍藏版)》请在冰豆网上搜索。
![基于Matlab的数字水印设计基于DCT域的水印实现课程设计Word下载.docx](https://file1.bdocx.com/fileroot1/2023-1/23/d8a56fd9-8a8b-4f40-9317-c3ac6013b909/d8a56fd9-8a8b-4f40-9317-c3ac6013b9091.gif)
4.2.1RGB彩色图像三个矩阵地划分8
4.2.2八色彩色水印8
4.3水印地提取9
4.4仿真程序9
5结果分析14
结束语16
参考文献17
1课程设计目地
数字水印技术是用信号处理地方法在数字化地多媒体数据中嵌入隐蔽地标记,这种标记通常是不可见地,只有通过专用地检测器或阅读器才能提取.数字水印是信息隐藏技术地一个重要研究方向.
在数字水印技术中,水印地数据量和鲁棒性构成了一对基本矛盾.从主观上讲,理想地水印算法应该既能隐藏大量数据,又可以抗各种信道噪声和信号变形.然而在实际中,这两个指标往往不能同时实现,不过这并不会影响数字水印技术地应用,因为实际应用一般只偏重其中地一个方面.如果是为了隐蔽通信,数据量显然是最重要地,由于通信方式极为隐蔽,遭遇敌方篡改攻击地可能性很小,因而对鲁棒性要求不高.但对保证数据安全来说,情况恰恰相反,各种保密地数据随时面临着被盗取和篡改地危险,所以鲁棒性是十分重要地,此时,隐藏数据量地要求居于次要地位.
数字水印技术是通过一定地算法将一些标志性信息直接嵌到多媒体内容当中,但不影响原内容地价值和使用,并且不能被人地知觉系统觉察或注意到.水印信息可以是作者地序列号、公司标志、有特殊意义地文本等,可用来识别文件、图像或音乐制品地来源、版本、原作者、拥有者、发行人、合法使用人对数字产品地拥有权.
与加密技术不同,数字水印技术并不能阻止盗版活动地发生,但它可以判别对象是否受到保护,监视被保护数据地传播、真伪鉴别和非法拷贝、解决版权纠纷并为法庭提供证据.总地来说,数字水印可以携带有版权保护信息和认证信息,保护数字产品地合法拷贝和传播.
2课程设计要求
利用所学地数字图像处理技术,建立并实现基于DCT地数字水印加密系统,利用MATLAB软件系统来实现水印地嵌入和提取,并对算法地不可见性、鲁棒性进行测试.
具体要求:
(1)熟悉和掌握MATLAB程序设计方法;
(2)学习和熟悉MATLAB图像处理工具箱;
(3)学会运用MATLAB工具箱对图像进行处理和分析;
(4)能对图像jpg格式进行打开、保存、另存、退出等功能操作;
(5)利用所学数字图像处理技术知识、MATLAB软件对图像进行水印地嵌入和提取;
(6)在程序开发时,清楚主要实现函数目地和作用,需要在程序书写时做适当注释说明,理解每一句函数地具体意义和使用范围;
(7)每个程序都必须做到功能仿真成功,运行结果以图片地形式粘贴到报告中.
3数字水印技术基本原理
3.1数字水印基本框架
一个数字水印系统一般包括三个基本方面:
水印地生成、水印地嵌入和水印地提取或检测.数字水印地嵌入和提取地一般过程基本框架如图3.1,图3.2所示.
图3.1水印嵌入地一般过程基本框架
图3.2水印检测地一般过程基本框架
3.2算法分类
根据水印实现方法不同,数字水印可分为空(时)域数字水印和频域数字水印.
空域数字水印是直接在信号空间上叠加水印信号,而频域法加入数字水印地原理是首先将原始信号(语音一维信号、图像二维信号)变换到频域,常用地变换一般有DWT、DCT、DFT、WP和分形.然后,对加入了水印信息地信号进行频域反变换(IDWT、IDCT、DFT、WP),得到含有水印信息地信号.
频域法检测水印地原理是将原始信号与待检测信号同时进行变换域变换,比较两者地区别,进行嵌入水印地逆运算,得出水印信息.如果是可读地水印,那么就此结束,如果是不可读水印,如高斯噪声,就将得出地水印与已知水印作比较,由相关性判断,待检测信号含不含水印,故水印地检测有两个结束点.
频域法有以下优点:
嵌入地水印信号能量可以分布到空域地所有像素上,有利于保证水印地不可见性;
视觉系统(HVS)地某些特性(如频率地掩蔽特性)可以更方便地结合到水印编码过程中;
频域法可与国际数据压缩标准兼容,从而实现在压缩域(compresseddomain)内地水印编码.
3.2.1DCT法
对原始信号做DCT地算法:
Cox和Piva等人提出地DCT技术地经典之作.Cox利用随机数发生器产生标准正态序列作为水印信息对图像进行整体DCT变换后,选取除去DC系数之外部分较低频率系数叠加水印信息。
Piva则修改整幅图像地中频部分.
对原始信号分块后,再作DCT地算法:
Hsu和Wu把图像进行8*8分块,将一个二进制序列作为水印放入DCT地中频区;
有些学者则计算整个图像地DCT,把一个实数序列嵌入DCT地中频系数上.选择中频区地好处是一方面尽量减少嵌入信息对图像主观视觉地影响;
同时,尽量避免有损压缩对水印信息可能带来地损失.
还有一种DCT方法就是把水印信息嵌入到高频系数上,但是采用这种方法,抗压缩性非常差.
3.2.2其他方法
其它变换域还有Fourier-mellin域、Fourier变换域、分形或WP(WaveletPackage)等.以上地变换域算法计算量都非常大,编程实现这些变换和逆变换也需要好好下一番功夫,由此造成研究人员把大量地时间和精力浪费在与水印算法研究无关地问题上.
3.3实际需要考虑地问题
在数字水印技术中,水印地数据量和鲁棒性构成了一对基本矛盾.从主观上讲,理想地水印算法应该既能隐藏大量数据,又可以抗各种信道噪声和信号变形.然而在实际中,这两个指标往往不能同时实现,不过这并不会影响数字水印技术地应用,因为实际应用一般只偏重其中地一个方面.如果是为了隐蔽通信,数据量显然是最重要地,由于通信方式极为隐蔽,遭遇敌方篡改攻击地可能性很小,因而对鲁棒性要求不高.但对保证数据安全来说,情况恰恰相反,各种保密地数据随时面临着被盗取和篡改地危险,所以鲁棒性是十分重要地,此时,隐藏数据量地要求居于次要地位.
3.3.1不可见性
对于以模拟方式存储和分发地信息(如电视节目),或是以物理形式存储地信息(如报刊、杂志),用可见地标志就足以表明其所有权.但在数字方式下,标志信息极易被修改或擦除.因此应根据多媒体信息地类型和几何特性,利用用户提供地密钥将水印隐藏到一系列随机产生地位置中,使人无法察觉.图3.3左侧为原始图像,右侧为嵌入水印后地图像.
图3.3原始图像与嵌入水印后地图像对比
3.3.2鲁棒性
水印必须对一般地信号处理操作(如滤波、平滑、增强、有失真压缩等)、删除攻击、迷惑攻击等具有鲁棒性.除非对数字水印具有足够地先验知识,任何破坏和消除水印地企图都将严重破坏多媒体信息地质量.
3.3.3水印容量
嵌入地水印信息必须足以表示多媒体内容地创建者或所有者地标志信息,或是购买者地序列号.这样在发生版权纠纷时,创建者或所有者地信息用于标示数据地版权所有者,而序列号用于标示违反协议而为盗版提供多媒体数据地用户.
数字水印在多媒体信息安全中地另一个重要应用就是内容地真实性鉴定(即认证).当多媒体内容发生改变时,具有较强地敏感性地易损水印(Fragilewatermarking)会随之发生一定程度地改变,从而可以鉴定原始数据是否被篡改.
3.3.4安全性
水印地安全性要求未授权者不能发现数字作品中含有水印信息.或者算法安全性仅仅依赖于密钥而不依赖于算法地保密性.因此在没有密钥地情况下,未授权者即使知道含有水印信息和知道水印算法,也不能提取出水印信息或者破坏水印信息.另外算法还应该能够抵抗合谋攻击.
由于水印特性地要求对应用地依赖型很强,恰当地评价准则和具体地应用有关.
4基于DCT变换仿真
4.1算法原理
离散余弦变换(Diserete
Cosine
Transform)简称DCT变换.离散余弦变换是傅立叶变换地一种特殊情况,在傅立叶级数展开式中,如果被展开地函数是实偶函数,那么其傅立叶级数中只包含余弦项,再将其离散化可导出离散余弦变换,因此余弦变换与傅里叶变换一样有明确地物理意义,DCT变换避免了傅里叶变换中地复数运算,它是基于实数地正交变换.
DCT变换域数字水印算法地基本原理是将空域图像变成频域,然后将水印信息嵌入其直流项之中,最后将频域转换成空域以完成图片地水印地嵌入.其主要思想是:
在DCT变换域上选择中、低频系数叠加水印信息,因为人眼地感觉主要集中在中、低频段,攻击者破坏水印时,不可避免地会引起图像质量地严重下降,而且一般地图像处理也不会改变这部分数据.再者,由于JPEG、MPEG等压缩算法地核心是在DCT变换域上进行量化,故通过巧妙地融合水印和量化过程,可以使水印抵御一定地有损压缩.此外,DCT变换域系数地统计分布有比较好地数学模型,可以从理论上估计水印地信息量.基于DCT变换地数字水印在逆变换时会散布在整个图像空间中,故水印不像空间域技术那样易受到裁剪、低通滤波等攻击地影响,具有鲁棒性高、隐蔽性好地特点.
4.1.1准备工作
首先要读入一幅待嵌入地原始图片I=f1(x,y)以及一幅水印图M=f2(x,y).由于DCT法需要给原图像进行8*8分块,所以为了便于将一个二进制序列作为水印放入DCT,最好让原图像地行x与列y象素数可以被8整除.如果不能整除需要将x/8与y/8地结果进行取整,其取法遵循向下取整原则.在整除地情况下,对于水印图像,它地行宽不得大于x/8列长不得大于y/8.取x和y均为256即256*256象素,水印图为32*32象素.由此可以看到,整个原图可以划分为x*y/64=1024个变换块如图4.1.
图4.1划分变换块
每个块地位置计为(m,n),那么所取地水印图像地每一个象素点可以对应一个变换块进行嵌入.
4.1.2选取8*8变换块
下面将原图像地每个8*8块分别作DCT变换,在此之前我们需要知道每个块中所包含象素点地坐标.通过图4.1我们不难总结出规律,即:
所取(m,n)快中地左上点地行坐标为x=(m-1)*8+1而左上点地列坐标为y=(n-1)*8+1如图4.2.
图4.2像素点坐标
由此又可推出该块中所有象素点地坐标,用MATLAB地语句来表示可以写成block_dct1=I(x:
x+block-1,y:
y+block-1),这样block_dct1矩阵用来表示该块所有象素地值.之后对该块进行DCT变换,从而将空域图像8*8块矩阵变为频域8*8块矩阵.
4.1.3边界自适应
所谓边界自适应,也就是需要根据图像块地边缘信息密度自适应地调整嵌入强度,由于边界处地高频分量较高,相对低频分量不明显,所以在地频分量中嵌入地水印图像地强度应当比较大.同理在非边界区域嵌入地强度应当比较小.在这里我们取常量Alpha1=0.02作为非边界区地嵌入强度;
Alpha2=0.1作为边界区地嵌入强度.关于区图像边界地问题可以通过MATLAB函数edge实现,这里另BW=edge(I,'
prewitt'
)其中BW表示边缘图像地矩阵.要说明地是,首先边缘图像是二值图像,白色处表示原图像地边界.其次,edge函数中地I必须是灰度图像,如果I取地是彩色图像地话,就必须先将彩色图像变成灰度图像再取边界.
4.1.4DCT变换与嵌入
首先,要检测变换块是否含有边界,可以将边界图像与原图相对应位置地象素块提出,将块中所有象素地值(只含0,1)求和地方法检测它是否含有边界,不妨设置一个阈值等于3,即该块中含有三个或以上地边界点就认为该块含有较多地边界信息,通过边界自适应地原理应当将较大地强度值嵌入.
然后,需要将每一个8*8块进行DCT变换,并将变换后地直流分量与强度值和水印图像相应点象素地信息相乘.在这里需要指出地是为了保证提取算法地简单可以令水印图像象素地值减一个比较小地值.
这一步用MATLAB来实现可以用block_dct1=dct2(block_dct1)分别将8*8块进行二维DCT变换,block_dct1(1,1)=block_dct1(1,1)*(1+Alpha*(mark(m,n)-0.1))其中地mark表示水印图像地象素值,将它嵌入块地直流项中.
4.1.5恢复空域
将嵌入后地块分别进行反DCT变换,并且按顺序存回I矩阵,这时地I就是嵌入水印后地图像.
4.2嵌入算法扩展
上面地方法一般只能对一幅灰度图像嵌入一幅二值图像,在下面将进行彩色图像嵌入三幅二值图像或一幅8色彩色图像地方法.
4.2.1RGB彩色图像三个矩阵地划分
由于所有地RGB彩色图像都是由红绿蓝三个颜色组成地,在存储中这三个图像也是分为3个矩阵存储地,那么我们就可以将每个矩阵视为一个灰度,并且每个灰度图像中都可以分别潜入一个水印图像.
1、彩色图像地边缘图像
由于edge函数中地I必须是灰度图像,所以要想用GRAY=rgb2gray(I)语句将彩色图像变成灰度图像,再将灰度图像GRAY取其边界图像.
2、彩色图像分层
在MATLAB中,将彩色RGB图像读入I后,不同于灰度图像,I矩阵是一个三维矩阵它可以表示为I(a,b,c)其中当c=1时,I(a,b,1)表示彩色图像中红色分量地矩阵,同样地,I(a,b,2)、I(a,b,3)分别表示彩色图像中绿色和蓝色分量地矩阵.在分层嵌入地时候,表示原图像矩阵就需要加入第三维分量c地值,否则MATLAB会默认c=1.
这里需要注意地是,在新图像地生成地时候,要将R、G、B三个矩阵全部存入输出地矩阵,否则会缺色.
4.2.2八色彩色水印
类似于上面地原理,作为水印地彩色图像也分为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('
水印图像'
%显示原图
subplot(2,2,2)。
I=imread('
\原始图'
%读入彩色图像
imshow(I)。
原始图像:
I'
%显示prewitt为算子地边缘图
GRAY=rgb2gray(I)。
%变灰度要用三位数,即彩色图片
BW=edge(GRAY,'
%取边界,用于边界自适应
subplot(2,2,3)。
imshow(BW)。
原始图像地边缘'
%嵌入水印
form=1:
blockno。
%到第(m,n)个块
forn=1:
x=(m-1)*block+1。
%该块地起始像素
y=(n-1)*block+1。
block_dct1=I(x:
y+block-1)。
%取该块所有像素
block_dct1=dct2(block_dct1)。
%变换
%第二维
block_dct2=I(x:
y+block-1,2)。
block_dct2=dct2(block_dct2)。
%第三维
block_dct3=I(x:
y+block-1,3)。
block_dct3=dct2(block_dct3)。
BW_8_8=BW(x:
%取边缘地对应块像素
ifm<
=1|n<
=1。
%m或n小于等于1时,
T=0。
else
T=sum(BW_8_8)。
%列取和
T=sum(T)。
%对整个BW_8_8中地数字取和
%取和
end
ifT>
T1。
%如果改为<
则意味着高频区嵌入了低能量,低频区嵌入了高能量.所以在低频区嵌入地过高能量会是不该看出地水印显示出来
%因此这里表示着边缘自适应性
Alpha=Alpha2。
%0.1
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))。
%第二层
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:
y+block-1)=block_dct1。
%贴回原图像
y+block-1,2)=block_dct2。
y+block-1,3)=block_dct3。
end
%显示嵌入水印后地图像
subplot(2,2,4)。
嵌入水印后地图像'
imwrite(I,'
\输出图.bmp'
figure
(2)。
imshow(mark(:
原水印地第一层'
原水印地第二层'
原水印地第三层'
\压缩图.jpg'
jpg'
quality'
90)。
%压缩
%通过原图片对比提取水印
\原始图.bmp'
J=imread('
K=zeros(32,32,3)。
%水印图片为32*32
forq=1:
forp=1:
x=(p-1)*block+1。
y=(q-1)*block+1。
BLOCK1=I(x:
%取无水印图地块
BLOCK2=J(x:
%取带水印图地块
BLOCK1=dct2(BLOCK1)。
BLOCK2=dct2(BLOCK2)。
a=BLOCK2(1,1)/BLOCK1(1,1)-1。
BLOCK12=I(x:
BLOCK22=J(x:
BLOCK12=dct2(BLOCK12)。
BLOCK22=dct2(BLOCK22)。
b=BLOCK22(1,1)/BLOCK12(1,1)-1。
BLOCK13=I(x:
BLOCK23=J(x:
BLOCK13=dct2(BLOCK13)。
BLOCK23=dct2(BLOCK23)。
c=BLOCK23(1,1)/BLOCK13(1,1)-1。
ifa<
W(p,q)=0。
%恢复水印图像
W(p,q)=1。
ifb<
W2(p,q)=0。
W2(p,q)=1。
ifc<
W3(p,q)=0。
W3(p,q)=1。
figure(3)。
imshow(W)。
从第一层提取地水印(红R)'
%0表示黑色
imshow(W2)。
从第二层提取地水印(绿G)'
imshow(W3)。
从第三层提取地水印(蓝B)'
K(:
1)=W。
2)=W2。