论文部分内容阅读
【摘 要】 针对以往图像水印的研究大都停留在理论方面,真正的图像水印软件并不多见,在分析了Visual Basic优越的可视化界面和MATLAB强大的图像处理能力相结合的编程原理基础上,提出了一种通过外部过程的调用将VB和MATLAB结合在一起进行彩色图像水印软件设计的方法,并通过具体的设计表明,通过VB优越的可视化界面和MATLAB强大的图像处理功能的结合开发了一个在Windows工作环境下运行的具有方便的程序接口和彩色图像水印处理能力的应用软件,对解决工程问题具有较大的参考价值。
【关键词】 混合编程 数字水印 图像处理
中图分类号:TP311.1 文献标识码:A
引言
数字水印(Digital Watermarking)技术[1]是信息隐藏技术的一个分支,通过一定的算法,在不影响原内容的价值和使用的前提下,在多媒体文件中嵌入一些标志性信息(如作者的序列号、公司标志、有特殊意义的文本),然后公开发布嵌入水印后的版本作品。当该作品被盗版或出现版权纠纷时,所有者只有通过专门的水印检测方法,才可从被盗版作品中获得水印信息,从而保护所有者的合法权益[2]。Cox等把水印定义为“在作品中不可感知地嵌入信息的操作行为”。目前绝大多数的研究都是数字水印理论方面的研究,实用的水印软件并不多见,所以对水印软件的设计很有实际意义和实用价值。
MATLAB是一套高性能的数值计算和可视化软件,具有编程简单、可操作性强等特点,而且能够方便、高效的实现图像中大量的矩阵运算[3],这样可用较少的代码实现水印算法;但它复杂的人机交互式图像界面的能力使其界面设计较为困难。
Visual Basic(以下简称VB) 是一种面向对象的可视化高级程序设计语言,能快速、高效的开发友好的用户界面[4]。相对于MATLAB而言, VB的计算功能相对薄弱,实现复杂算法的工作量比较大。因此VB与MATLAB的优缺点正好互补,利用优缺点的互补性,可以对VB与MATLAB混合编程[5],实现图像水印软件的开发。
1 VB与MATLAB混合编程主要问题
MATLAB提供了与C++的程序接口,并没有提供直接与VB的接口,因此,要进行VB与MATLAB的混合编程[5],先要将MATLAB中的M文件编译生成可执行性文件,然后才能在VB中通过调用MATLAB的可执行性文件进行,而在VB中调用可执行性文件,常以Shell指令来执行外部程序[6],然而用Shell指令在调用执行该外部程序时,VB立刻就会回到它的原程序入口处,执行VB的下一行程序,也就是说,这些都不是Shell指令所能控制的,因此我们需要在VB中使用API的帮助来完成,即要实现VB与MATLAB的混合编程,主要从以下方面解决VB与MATLAB的接口问题[7]:(1)MATLAB中的函数文件生成可执行文件;(2)在VB中调用可执行文件,并解决VB调用外部过程的一些基本问题;(3)VB与MATLAB的数据通信;(4)解决VB调用外部过程的一些基本问题。
2 MATLAB下的程序编译
利用VB友好的界面和MATLAB强大的图像处理功能,设计开发了基于小波变换的彩色图像水印处理软件,主要包括水印置乱变换、水印嵌入、水印提取等功能,功能模块结构如图1所示。
2.1 编写M文件
在MATLAB中编写设计时用到的水印置乱、水印嵌入和水印提取算法,选用MATLAB R2009b版本,采用基于DWT域的水印算法,分别编写水印置乱函数、水印嵌入函数以及水印提取函数。算法编写完成后,将其在MATLAB中进行各种攻击实验,实验结果良好。
2.2 将M文件转换成可执行性文件
要将MATLAB语言编写的函数文件,编译成可独自执行的可执行性文件(即可脱离MATLAB环境的可执行程序),首先要安装和配置好MATLAB Compiler,一般情况下,在安装了MATLAB时就已经安装了相应版本的compiler。在确定安装好compiler后,还需要对compiler进行适当的配置。方法如下。
(1)在MATLAB命令行输入mex–setup,然后根据提示执行相应的操作,选择合适的编译器。也可选择MATLAB自带的Lcc编译器,其实自带的编译器对多数用户来说就已经够用了(本文选择的就是MATLAB自带的Lcc编译器)。
(2)调用编译器,使用MATLAB下的一个GUI平台deploytool能够完全实现,在命令窗口输入deploytool即可看到。当然也可以输入mcc –m filename ,其中,filename为将要转换成可执行性文件的函数。如果要在没安装MATLAB的计算机上执行编译后的程序,先要将\MATLAB701\toolbox\compiler\deploy
\win32中的MCRinstaller.exe安装到该计算机上,其次要将MCRinstaller.exe安装目录\runtime\win32这个路径添加到该计算机的环境变量中,方法是:右击“我的电脑”-->“属性”-->“高级”-->“环境变量”-->“添加”指定一个变量名,将上述路径复制到里面就可以了。
(3)最后将编译生成的相关文件拷贝到同一目录下,打开dos操作窗口,进入到编译后的.exe程序所在的目录,执行编译生成的exe文件即可。
(4)解决运行时dos窗口存在问题。
上述方法美中不足就是,运行的时候dos窗口一直存在,可使用如下方法消除。
在命令窗口输入:
cd (prefdir)
edit compopts.bat
在打开的文件最后添加以下语句:
setLINKFLAGS=%LINKFLAGS%-subsystemwindows 保存以后,重新编译M文件,此时生成的exe文件运行起来就没有dos窗口了,而且在任何没有安装MATLAB的机子上运行也不会有黑屏。
3 VB中调用MATLAB可执行性文件
当VB界面设计完成后,就需要用适当的方法完成对外部过程的调用[8]。
3.1 使用API函数ShellExcute
VB6.0中提供了Shell函数直接调用可执行性文件,即使用户提供了正确的路径和文件名,系统往往提示被调用过程的路径找不到。为此,本文采用的Windows的API函数ShellExcute,从而有效地解决了上述问题。
(1) 用ShellExcute声明
在使用ShellExcute函数前,必须在代码窗口的通用部分对函数作如下声明:
Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
(2)语法结构
ShellExecute函数的调用语法为:
ShellExecute 0, "open", "地址", "", "工作目录", X
式中的“地址”是指外部过程所在的路径及文件名,“工作目录”是指运算结果保存的位置,变量X则代表外部过程运行时的窗口情况,0-隐藏Dos窗口,1-正常窗口。
(3)函数的改进与封装
鉴于这样比较麻烦,本设计对该函数进行了改进和重新封装,以方便用户调用。其代码如下:
Public Sub ShellEx(Path As String)
Dim splitpos As Long
splitpos = InStrRev(Path, "\")
ShellExecute 0,"open",Path,"",Mid(Path, 1, splitpos - 1),0
End Sub
3.2 解决VB程序执行中的不等待问题
VB调用外部过程后,不管该外部过程是否运行完毕,立刻会继续执行VB的其它程序。从而出现一个不可回避的问题,即外部过程未执行完,而VB又想使用外部过程的结果。这样必然会出现程序崩溃的现象。
上述问题是VB自身造成的,Shell和ShellExcute函数都不能控制,必须使用API的帮助来完成。要解决的问题有两个:获取外部过程的控制句柄和让VB等待直到外部过程运行结束。
(1)获取外部过程的控制句柄
要获取外部过程的控制句柄,需要调用API函数OpenProcess和GetExitCodeProcess,前者用于获取外部过程的控制句柄,后都用于判断外部过程是否执行完毕。VB中两过程的声明方法如下:
Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess&, ByVal bInherithandle&, ByVal dwProcessid&) As Long
Declare Function GetExitCodeProcess Lib "kernel32" (ByVal hProcess As Long, lpexitcode As Long) As Long
(2)等待函数的封装
通过对上述函数的分析,本文编写了等待函数ShellWait,若外部过程未执行完毕,则VB一直执行该等待函数。其代码如下:
Sub ShellWait(cCommandLine As String)
Dim hShell As Long
Dim hProc As Long
Dim lExit As Long
hShell = Shell(cCommandLine, vbHide)
hProc=OpenProcess(PROCESS_QUERY_INFOR MATION, False, hShell)
Waiting.Show
Do
GetExitCodeProcess hProc, lExit
DoEvents
' MsgBox "请等待,系统正在计算中……"
Loop While lExit = STILL_ACTIVE
Waiting.Hide
End Sub
程序中函数参变量cCommandLine表示外部过程的路径及过程名,Waiting是用VB制作的窗体,用于显示等待信息。
3.3 系统界面设计方法
水印嵌入系统界面由1个Tabscrip控件,1个Frame控件组,1个CommonDialog控件,3个Textbox控件,3个Label控件和5个Command按钮控件组成。使用Tabscrip控件,可在应用程序中定义多个页面,可通过CommonDialog控件提供一组标准的操作对话框,控件所显示的对话框由控件的方法来决定。系统界面如图2所示。
为了能按需求显示相应的界面,设计中将不同的内容分别放置在三个Frame中,并通过设置Frame的Visible属性显示。为了调用方便,编写的显示函数如下: Private Function Display_Frame(I As Integer)
Dim J As Integer
For J = 0 To 2
Frame1(J).Visible = False
Next J
Frame1(I).Visible = True
End Function
程序中参数I代表第I个Frame,可通过Tabscrip控件的Index属性来控制。
进入系统后,首先进行水印的置乱,切换到“水印置乱”选项卡,单击“确定”按钮,采用对水印图像进行Arnold置乱变换,这样图像数据就会传递到置乱函数中,同时在显示区域会显示出原始水印和置乱水印,如图3所示。
然后进行水印的嵌入,将置乱变换后的水印嵌入到载体图像,由于要在载体图像的Y通道中嵌入置乱变换后的水印图像。所以首先将载体图像的RGB空间即彩色空间转换到YUV空间并抽取Y通道,将Y通道经小波分解后添加置乱后的水印,再将添加置乱后的水印的Y通道与其余两个通道合并后,并将合并后的YUV颜色空间再转换到RGB空间,得到添加水印后的图像。水印嵌入过程中调用函数sdwt(double(a),'db2',m2,n2,e0)进行树状小波分解、调用函数embed(t,tkey,b)进行水印嵌入、调用sidwt(t,'db2')进行数据组合,水印嵌入过程如图4(a)所示。水印嵌入选择“嵌入水印”选项卡,可以对目标文件按要求进行保存,设置好路径后,按“确定”按钮可在显示区域显示出原始图像和添加水印后的图像及相似度如图5所示。
最后进行水印的提取,将含水印的图像从RGB变换到YUV空间并抽取Y通道,将Y通道经小波逆变换后从中采用nextract(tnd,tkey)抽取水印图像,再对抽取出的水印图像做Arnold逆变换,得到最后抽取出的水印图像。抽取水印过程如图4(b)所示。水印提取选择“提取水印”选项卡,在源文件中选择添加水印后的图像,单击“确定按钮”,经过计算将显示水印提取及相似度如图6所示。
3.4 打包软件
要使设计好的水印软件具有真正的实用价值,就要对它进行打包,选用Setup Factory 7.0软件进行打包并创建安装文件,这样就可以在其他电脑上安装使用了。
结语
本文利用在VB中调用MATLAB的可执行性文件,巧妙的将MATLAB强大的图像处理功能与VB优越的图形界面功能结合起来,解决了VB的Shell函数调用外部过程出现的出错问题和VB调用外部过程的不等待问题,设计出一种基于DWT域的水印算法的彩色图像水印软件,并能够脱离MATLAB的运行环境而独立运行,由于整个过程中软件的相互调用和复杂的运算,水印嵌入和提取的速度有点慢,如何提高运行速度是今后努力要解决的一个问题。
参考文献
[1]杨义先,钮心忻.数字水印理论与技术[M] .北京.高等教育出版社,2006.
[2]亢娟娜.基于小波变换的图像水印系统设计与实现[D].陕西:西北农林科技大学,2012.
[3]唐松生,董颖.数字视频水印技术综述[J].计算机安全,2007(9) ,31-32.
[4]侍孝虎.VB与MATLAB混合编程研究与实现[J].软件导刊,2012,11(9),33-35.
[5]朱志松,郭晓丽,朱小松等.VB与MATLAB混合编程探讨[J].计算机应用,2003(9),18-19.
[6]魏玲,杨峰.基于小波变换的静止图像数字水印 [J].微计算机信息,2007年,12-3:306-308.
[7]彭川.基于DCT域的图像数字水印算法[J].计算机时代,2006(10) ,56-57.
[8]张钰.基于小波变换的彩色图像数字水印算法[D].吉林:吉林大学,2012.
【关键词】 混合编程 数字水印 图像处理
中图分类号:TP311.1 文献标识码:A
引言
数字水印(Digital Watermarking)技术[1]是信息隐藏技术的一个分支,通过一定的算法,在不影响原内容的价值和使用的前提下,在多媒体文件中嵌入一些标志性信息(如作者的序列号、公司标志、有特殊意义的文本),然后公开发布嵌入水印后的版本作品。当该作品被盗版或出现版权纠纷时,所有者只有通过专门的水印检测方法,才可从被盗版作品中获得水印信息,从而保护所有者的合法权益[2]。Cox等把水印定义为“在作品中不可感知地嵌入信息的操作行为”。目前绝大多数的研究都是数字水印理论方面的研究,实用的水印软件并不多见,所以对水印软件的设计很有实际意义和实用价值。
MATLAB是一套高性能的数值计算和可视化软件,具有编程简单、可操作性强等特点,而且能够方便、高效的实现图像中大量的矩阵运算[3],这样可用较少的代码实现水印算法;但它复杂的人机交互式图像界面的能力使其界面设计较为困难。
Visual Basic(以下简称VB) 是一种面向对象的可视化高级程序设计语言,能快速、高效的开发友好的用户界面[4]。相对于MATLAB而言, VB的计算功能相对薄弱,实现复杂算法的工作量比较大。因此VB与MATLAB的优缺点正好互补,利用优缺点的互补性,可以对VB与MATLAB混合编程[5],实现图像水印软件的开发。
1 VB与MATLAB混合编程主要问题
MATLAB提供了与C++的程序接口,并没有提供直接与VB的接口,因此,要进行VB与MATLAB的混合编程[5],先要将MATLAB中的M文件编译生成可执行性文件,然后才能在VB中通过调用MATLAB的可执行性文件进行,而在VB中调用可执行性文件,常以Shell指令来执行外部程序[6],然而用Shell指令在调用执行该外部程序时,VB立刻就会回到它的原程序入口处,执行VB的下一行程序,也就是说,这些都不是Shell指令所能控制的,因此我们需要在VB中使用API的帮助来完成,即要实现VB与MATLAB的混合编程,主要从以下方面解决VB与MATLAB的接口问题[7]:(1)MATLAB中的函数文件生成可执行文件;(2)在VB中调用可执行文件,并解决VB调用外部过程的一些基本问题;(3)VB与MATLAB的数据通信;(4)解决VB调用外部过程的一些基本问题。
2 MATLAB下的程序编译
利用VB友好的界面和MATLAB强大的图像处理功能,设计开发了基于小波变换的彩色图像水印处理软件,主要包括水印置乱变换、水印嵌入、水印提取等功能,功能模块结构如图1所示。
2.1 编写M文件
在MATLAB中编写设计时用到的水印置乱、水印嵌入和水印提取算法,选用MATLAB R2009b版本,采用基于DWT域的水印算法,分别编写水印置乱函数、水印嵌入函数以及水印提取函数。算法编写完成后,将其在MATLAB中进行各种攻击实验,实验结果良好。
2.2 将M文件转换成可执行性文件
要将MATLAB语言编写的函数文件,编译成可独自执行的可执行性文件(即可脱离MATLAB环境的可执行程序),首先要安装和配置好MATLAB Compiler,一般情况下,在安装了MATLAB时就已经安装了相应版本的compiler。在确定安装好compiler后,还需要对compiler进行适当的配置。方法如下。
(1)在MATLAB命令行输入mex–setup,然后根据提示执行相应的操作,选择合适的编译器。也可选择MATLAB自带的Lcc编译器,其实自带的编译器对多数用户来说就已经够用了(本文选择的就是MATLAB自带的Lcc编译器)。
(2)调用编译器,使用MATLAB下的一个GUI平台deploytool能够完全实现,在命令窗口输入deploytool即可看到。当然也可以输入mcc –m filename ,其中,filename为将要转换成可执行性文件的函数。如果要在没安装MATLAB的计算机上执行编译后的程序,先要将\MATLAB701\toolbox\compiler\deploy
\win32中的MCRinstaller.exe安装到该计算机上,其次要将MCRinstaller.exe安装目录\runtime\win32这个路径添加到该计算机的环境变量中,方法是:右击“我的电脑”-->“属性”-->“高级”-->“环境变量”-->“添加”指定一个变量名,将上述路径复制到里面就可以了。
(3)最后将编译生成的相关文件拷贝到同一目录下,打开dos操作窗口,进入到编译后的.exe程序所在的目录,执行编译生成的exe文件即可。
(4)解决运行时dos窗口存在问题。
上述方法美中不足就是,运行的时候dos窗口一直存在,可使用如下方法消除。
在命令窗口输入:
cd (prefdir)
edit compopts.bat
在打开的文件最后添加以下语句:
setLINKFLAGS=%LINKFLAGS%-subsystemwindows 保存以后,重新编译M文件,此时生成的exe文件运行起来就没有dos窗口了,而且在任何没有安装MATLAB的机子上运行也不会有黑屏。
3 VB中调用MATLAB可执行性文件
当VB界面设计完成后,就需要用适当的方法完成对外部过程的调用[8]。
3.1 使用API函数ShellExcute
VB6.0中提供了Shell函数直接调用可执行性文件,即使用户提供了正确的路径和文件名,系统往往提示被调用过程的路径找不到。为此,本文采用的Windows的API函数ShellExcute,从而有效地解决了上述问题。
(1) 用ShellExcute声明
在使用ShellExcute函数前,必须在代码窗口的通用部分对函数作如下声明:
Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
(2)语法结构
ShellExecute函数的调用语法为:
ShellExecute 0, "open", "地址", "", "工作目录", X
式中的“地址”是指外部过程所在的路径及文件名,“工作目录”是指运算结果保存的位置,变量X则代表外部过程运行时的窗口情况,0-隐藏Dos窗口,1-正常窗口。
(3)函数的改进与封装
鉴于这样比较麻烦,本设计对该函数进行了改进和重新封装,以方便用户调用。其代码如下:
Public Sub ShellEx(Path As String)
Dim splitpos As Long
splitpos = InStrRev(Path, "\")
ShellExecute 0,"open",Path,"",Mid(Path, 1, splitpos - 1),0
End Sub
3.2 解决VB程序执行中的不等待问题
VB调用外部过程后,不管该外部过程是否运行完毕,立刻会继续执行VB的其它程序。从而出现一个不可回避的问题,即外部过程未执行完,而VB又想使用外部过程的结果。这样必然会出现程序崩溃的现象。
上述问题是VB自身造成的,Shell和ShellExcute函数都不能控制,必须使用API的帮助来完成。要解决的问题有两个:获取外部过程的控制句柄和让VB等待直到外部过程运行结束。
(1)获取外部过程的控制句柄
要获取外部过程的控制句柄,需要调用API函数OpenProcess和GetExitCodeProcess,前者用于获取外部过程的控制句柄,后都用于判断外部过程是否执行完毕。VB中两过程的声明方法如下:
Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess&, ByVal bInherithandle&, ByVal dwProcessid&) As Long
Declare Function GetExitCodeProcess Lib "kernel32" (ByVal hProcess As Long, lpexitcode As Long) As Long
(2)等待函数的封装
通过对上述函数的分析,本文编写了等待函数ShellWait,若外部过程未执行完毕,则VB一直执行该等待函数。其代码如下:
Sub ShellWait(cCommandLine As String)
Dim hShell As Long
Dim hProc As Long
Dim lExit As Long
hShell = Shell(cCommandLine, vbHide)
hProc=OpenProcess(PROCESS_QUERY_INFOR MATION, False, hShell)
Waiting.Show
Do
GetExitCodeProcess hProc, lExit
DoEvents
' MsgBox "请等待,系统正在计算中……"
Loop While lExit = STILL_ACTIVE
Waiting.Hide
End Sub
程序中函数参变量cCommandLine表示外部过程的路径及过程名,Waiting是用VB制作的窗体,用于显示等待信息。
3.3 系统界面设计方法
水印嵌入系统界面由1个Tabscrip控件,1个Frame控件组,1个CommonDialog控件,3个Textbox控件,3个Label控件和5个Command按钮控件组成。使用Tabscrip控件,可在应用程序中定义多个页面,可通过CommonDialog控件提供一组标准的操作对话框,控件所显示的对话框由控件的方法来决定。系统界面如图2所示。
为了能按需求显示相应的界面,设计中将不同的内容分别放置在三个Frame中,并通过设置Frame的Visible属性显示。为了调用方便,编写的显示函数如下: Private Function Display_Frame(I As Integer)
Dim J As Integer
For J = 0 To 2
Frame1(J).Visible = False
Next J
Frame1(I).Visible = True
End Function
程序中参数I代表第I个Frame,可通过Tabscrip控件的Index属性来控制。
进入系统后,首先进行水印的置乱,切换到“水印置乱”选项卡,单击“确定”按钮,采用对水印图像进行Arnold置乱变换,这样图像数据就会传递到置乱函数中,同时在显示区域会显示出原始水印和置乱水印,如图3所示。
然后进行水印的嵌入,将置乱变换后的水印嵌入到载体图像,由于要在载体图像的Y通道中嵌入置乱变换后的水印图像。所以首先将载体图像的RGB空间即彩色空间转换到YUV空间并抽取Y通道,将Y通道经小波分解后添加置乱后的水印,再将添加置乱后的水印的Y通道与其余两个通道合并后,并将合并后的YUV颜色空间再转换到RGB空间,得到添加水印后的图像。水印嵌入过程中调用函数sdwt(double(a),'db2',m2,n2,e0)进行树状小波分解、调用函数embed(t,tkey,b)进行水印嵌入、调用sidwt(t,'db2')进行数据组合,水印嵌入过程如图4(a)所示。水印嵌入选择“嵌入水印”选项卡,可以对目标文件按要求进行保存,设置好路径后,按“确定”按钮可在显示区域显示出原始图像和添加水印后的图像及相似度如图5所示。
最后进行水印的提取,将含水印的图像从RGB变换到YUV空间并抽取Y通道,将Y通道经小波逆变换后从中采用nextract(tnd,tkey)抽取水印图像,再对抽取出的水印图像做Arnold逆变换,得到最后抽取出的水印图像。抽取水印过程如图4(b)所示。水印提取选择“提取水印”选项卡,在源文件中选择添加水印后的图像,单击“确定按钮”,经过计算将显示水印提取及相似度如图6所示。
3.4 打包软件
要使设计好的水印软件具有真正的实用价值,就要对它进行打包,选用Setup Factory 7.0软件进行打包并创建安装文件,这样就可以在其他电脑上安装使用了。
结语
本文利用在VB中调用MATLAB的可执行性文件,巧妙的将MATLAB强大的图像处理功能与VB优越的图形界面功能结合起来,解决了VB的Shell函数调用外部过程出现的出错问题和VB调用外部过程的不等待问题,设计出一种基于DWT域的水印算法的彩色图像水印软件,并能够脱离MATLAB的运行环境而独立运行,由于整个过程中软件的相互调用和复杂的运算,水印嵌入和提取的速度有点慢,如何提高运行速度是今后努力要解决的一个问题。
参考文献
[1]杨义先,钮心忻.数字水印理论与技术[M] .北京.高等教育出版社,2006.
[2]亢娟娜.基于小波变换的图像水印系统设计与实现[D].陕西:西北农林科技大学,2012.
[3]唐松生,董颖.数字视频水印技术综述[J].计算机安全,2007(9) ,31-32.
[4]侍孝虎.VB与MATLAB混合编程研究与实现[J].软件导刊,2012,11(9),33-35.
[5]朱志松,郭晓丽,朱小松等.VB与MATLAB混合编程探讨[J].计算机应用,2003(9),18-19.
[6]魏玲,杨峰.基于小波变换的静止图像数字水印 [J].微计算机信息,2007年,12-3:306-308.
[7]彭川.基于DCT域的图像数字水印算法[J].计算机时代,2006(10) ,56-57.
[8]张钰.基于小波变换的彩色图像数字水印算法[D].吉林:吉林大学,2012.