一种基于置乱扩散的文本水印嵌入提取方法与流程

文档序号:21732344发布日期:2020-08-05 01:27阅读:362来源:国知局
一种基于置乱扩散的文本水印嵌入提取方法与流程

本发明涉及一种文本水印嵌入提取方法,尤其涉及一种基于置乱扩散的文本水印嵌入提取方法,属于图像加密技术领域。



背景技术:

大数据随着全球信息化的不断推进以及互联网的高速发展,已经成为重要的生产因素并渗透到了各个领域。文本数据作为信息交流与传递的重要载体,是大数据平台存储、计算及应用最广泛的数据类型。而文本数据被窃取和篡改会造成多种严重后果,因此保证文本文件泄露后的可追溯性成为研究的焦点。

面向文本文档的数字水印技术是将特定标识信息以某种方式嵌入文档作品中,且不影响文档载体使用价值的一种信息隐藏技术,是完成版权保护、实现防伪溯源的有效方法。根据嵌入方式的不同,人们分别提出基于文本图像的水印算法、基于文本格式的水印算法、基于文本内容的水印算法。基于文本图像的信息隐藏算法一般应用于纸质文本的打印扫描场景,该类算法大多对图像噪声攻击较为敏感,稳健性通常要高于普通文本嵌入算法。但此算法的水印载体一旦受到噪声攻击,水印信息的准确度将受到严重破坏。基于文档结构的水印算法一般适用于具有格式功能的文档,如word、xml和pdf。该水印技术利用轻微改变文本格式不易被察觉的特点嵌入水印信息,如修改文档排版属性、添加不可见字符、修改字符属性、同形字符替换等。其编码简单、易于实现。但此算法对于文本格式稍加变换就有可能使嵌入的水印遭到破坏。基于文本内容的文本水印方法一般通过自然语言处理技术对语法、语义以及文字特征进行分析,在不改变原文意思的情况下,对部分文本实施等价替换和语序修改等操作,进而实现水印信息的隐藏。但文本中的同型内容毕竟有限,对于水印信息量较大的应用场景难免显得嵌入空间不足。零水印技术是一种可以把水印信息很好地隐藏,对于用户来说是不可感知的,而且不会影响原文档使用价值的一种技术。但零水印技术在提取时不能很好地与原文档对应,且无法实现盲提取。

目前文本水印方案主要将ascii码特殊控制符、行置换算法、干扰列、图像arnold变换结合起来,实现数字水印的嵌入。利用ascii码特殊控制符的不可见性达到嵌入水印信号的不可感知的效果。通过行置换算法,将元组映射到文本数据的秘密位置上,实现嵌入位与元组结构无关,提高算法的鲁棒性。通过arnold算法对版权图像进行变换,使水印信息具有隐私性和抗攻击性。同时辅助以数值型的数据生成干扰列,在干扰列中嵌入水印信息,加强所嵌水印的鲁棒性。

上述现有技术的缺点主要表现在以下方面:

(1)现有技术方案中,通过行置换算法嵌入水印信息,即使加入了干扰列,但由于嵌入时过度依靠浮点数据的精度,一个单元格只能嵌入一位比特信息,存在无法有效利用文档空间,无法嵌入大量信息等问题。

(2)现有技术方案中,利用hash函数对元组字段处理并排序,通过哈希值与待嵌入属性字段长度相运算,将元组映射到不同分组中实现行置换,从而确定嵌入的位置,但由于每个比特信息只嵌入一次,一旦受到水印载体稍微变动,原水印信息就会受到较大的影响,鲁棒性低。



技术实现要素:

本发明要解决的技术问题是:提供一种基于置乱扩散的文本水印嵌入提取方法,通过对原水印图像进行二值化和arnold置乱处理,实现图片像素点的均匀扩散。其次,基于部分ascii码的不可见特性设计水印信息编码,实现大量信息的隐蔽嵌入。然后,基于随机置乱思想设计行列扩散算法,实现水印信息的均匀嵌入和高效盲提取,提高鲁棒性。通过上步骤,最终得到能隐蔽嵌入大量水印信息的强鲁棒性算法,有效的解决了上述存在的嵌入信息量小、鲁棒性弱及隐蔽性差等问题。

本发明的技术方案为:一种基于置乱扩散的文本水印嵌入提取方法,所述方法包括步骤:一、水印嵌入,实现水印图像到宿主载体的均匀扩散;二、水印提取,实现确权水印图像的还原。

所述步骤一中,具体包括步骤:a、生成水印信息表;b、获取行列映射表;c、水印扩散。

步骤一,水印嵌入,f:bmpw×d→t':水印嵌入的过程中,首先对水印图像进行二值化处理,再对处理后的二值化图像进行arnold置乱得到bmpb,此步骤为水印图像的预处理。然后对bmpb进行编码,得到水印信息表bmpw。通过读取水印载体t得到嵌入位索引表,置乱后再从中截取与水印信息表的同型矩阵,形成行列映射表d。最后水印信息表bmpw通过行列映射表d的映射得到嵌入后的水印载体t',至此完成水印嵌入,实现水印图像到宿主载体的均匀扩散。

所述步骤二中,具体包括步骤:d、水印位点提取;e、还原置乱水印;f、水印信息还原。

步骤二,水印提取,f-1:t'→bmp':水印信息的提取还原过程中,还原映射f-1:t'→bmp',首先按顺序扫描含水印文档t'={c+w}n×n,得到载体中的所有水印信号bmp'w={w'}n×n,其中,w′ij=(i',j',b),(i',j')∈[1,2,...,m]2;然后根据w′ij拥有的坐标行列信息(i',j')将水印信号b逆映射到水印图像对应的位置,得到确权水印图像bmp'b,实现确权水印图像的还原。

所述步骤a为:首先对原图像进行二值化处理,得到二值图像;再通过arnold置乱公式和用户密钥k对二值化图像进行arnold置乱得到bmpb={b}m×m,其中b∈{0,1},然后对bmpb的每一个像素以行i∈[1,2,...,m]、列j∈[1,2,...,m]及水印信号值b∈{0,1}进行编码,得到水印信息表bmpw={w}m×m,其中wij=(i,j,b)。

其中,arnold置乱公式为:

所述步骤b为:首先对t={c}n×n进行行列扫描,读取嵌入位水印位置的行列值(i,j),生成可嵌入位索引表tp={p}n×n,其中p=(i,j)∈[1,2,...,n]2;然后对tp内的元素进行随机置乱,形成均匀置乱的索引置乱表t′p={p'}n×n;最后以bmpw为基础在t′p内随机选取多个不重复的同型矩阵,形成多个行列映射表d={d}m×m,其中dij=p′i′,j'。

所述步骤c为:根据水印信息表与行列映射表之间元素的对应关系,通过f:bmp×d→t将wij∈bmpw映射到dij∈d下宿主载体t对应的i'行j'列中,并重复此步骤,直到所有行列映射表均完成映射,最终得到含水印载体t'={c+w}n×n,其中,“+”为字符串连接符。

所述步骤d为:首先按顺序扫描含水印文档t'={c+w}n×n,得到载体中的所有水印信号bmp'w={w'}n×n,其中,w′ij=(i',j',b),(i',j')∈[1,2,...,m]2;然后根据w′ij拥有的坐标行列信息(i',j')将水印信号b逆映射到水印图像对应的位置,得到多值水印信息集wm×m={wij=(i,j,b1,b2,...bn)}i,j∈[1,2,...,m]。

所述步骤e为:对(i,j)位上的水印信号wij=(i,j,b1,b2,...bn)进行取众数处理b'←maxfreq(b1,b2,...,bn),若众数不唯一,则该点信息提取失败,生成置乱的二值水印矩阵bmp'm×m。

所述步骤f为:通过用户密钥k对bmp'm×m进行k轮arnold逆置乱,还原出可识别的二值水印图像bmp',最终完成确权水印的重现。

其中,arnold逆置乱公式为:

本发明的有益效果是:与现有技术相比,采用本发明的技术方案,通过基于置乱扩散思想的嵌入提取方法,将水印信息通过置乱扩散的方式多轮地、均匀地嵌入水印载体,提高了鲁棒性。采用水印信息的编码方式,通过ascii码中部分不可见字符的编码,将位置信息和水印信息编码成一个水印单元,实现嵌入大量水印信息。

附图说明

图1为本发明的总体流程图;

图2为本发明生成水印信息表流程图;

图3为本发明嵌入水印流程图;

图4为本发明提取水印流程图;

图5为本发明的实施例图像一;

图6为本发明的实施例图像二。

具体实施方式

为使本发明的目的、技术方案和优点更加清楚,下面将参照本说明书附图对本发明作进一步的详细描述。

一种基于置乱扩散的文本水印嵌入提取方法,所述方法包括步骤:一、水印嵌入,实现水印图像到宿主载体的均匀扩散;二、水印提取,实现确权水印图像的还原。

所述步骤一中,具体包括步骤:a、生成水印信息表;b、获取行列映射表;c、水印扩散。

步骤一,水印嵌入,f:bmpw×d→t':水印嵌入的过程中,首先对水印图像进行二值化处理,再对处理后的二值化图像进行arnold置乱得到bmpb,此步骤为水印图像的预处理。然后对bmpb进行编码,得到水印信息表bmpw。通过读取水印载体t得到嵌入位索引表,置乱后再从中截取与水印信息表的同型矩阵,形成行列映射表d。最后水印信息表bmpw通过行列映射表d的映射得到嵌入后的水印载体t',至此完成水印嵌入,实现水印图像到宿主载体的均匀扩散。

所述步骤二中,具体包括步骤:d、水印位点提取;e、还原置乱水印;f、水印信息还原。

步骤二,水印提取,f-1:t'→bmp':水印信息的提取还原过程中,还原映射f-1:t'→bmp',首先按顺序扫描含水印文档t'={c+w}n×n,得到载体中的所有水印信号bmp'w={w'}n×n,其中,w′ij=(i',j',b),(i',j')∈[1,2,...,m]2;然后根据w′ij拥有的坐标行列信息(i',j')将水印信号b逆映射到水印图像对应的位置,得到确权水印图像bmp'b,实现确权水印图像的还原。

所述步骤a为:首先对原图像进行二值化处理,得到二值图像;再通过arnold置乱公式和用户密钥k对二值化图像进行arnold置乱得到bmpb={b}m×m,其中b∈{0,1},然后对bmpb的每一个像素以行i∈[1,2,...,m]、列j∈[1,2,...,m]及水印信号值b∈{0,1}进行编码,得到水印信息表bmpw={w}m×m,其中wij=(i,j,b)。

其中,arnold置乱公式为:

所述步骤b为:首先对t={c}n×n进行行列扫描,读取嵌入位水印位置的行列值(i,j),生成可嵌入位索引表tp={p}n×n,其中p=(i,j)∈[1,2,...,n]2;然后对tp内的元素进行随机置乱,形成均匀置乱的索引置乱表t′p={p'}n×n;最后以bmpw为基础在t′p内随机选取多个不重复的同型矩阵,形成多个行列映射表d={d}m×m,其中dij=p′i′,j'。

所述步骤c为:根据水印信息表与行列映射表之间元素的对应关系,通过f:bmp×d→t将wij∈bmpw映射到dij∈d下宿主载体t对应的i'行j'列中,并重复此步骤,直到所有行列映射表均完成映射,最终得到含水印载体t'={c+w}n×n,其中,“+”为字符串连接符。

所述步骤d为:首先按顺序扫描含水印文档t'={c+w}n×n,得到载体中的所有水印信号bmp'w={w'}n×n,其中,w′ij=(i',j',b),(i',j')∈[1,2,...,m]2;然后根据w′ij拥有的坐标行列信息(i',j')将水印信号b逆映射到水印图像对应的位置,得到多值水印信息集wm×m={wij=(i,j,b1,b2,...bn)}i,j∈[1,2,...,m]。

所述步骤e为:对(i,j)位上的水印信号wij=(i,j,b1,b2,...bn)进行取众数处理b'←maxfreq(b1,b2,...,bn),若众数不唯一,则该点信息提取失败,生成置乱的二值水印矩阵bmp'm×m。

所述步骤f为:通过用户密钥k对bmp'm×m进行k轮arnold逆置乱,还原出可识别的二值水印图像bmp',最终完成确权水印的重现。

其中,arnold逆置乱公式为:

基于置乱扩散的文本水印嵌入提取方案主要分为两大模块,分别为:嵌入水印模块和提取水印模块。在嵌入过程中,由水印图像生成的水印信息表通过由待嵌入文件生成的行列映射表,实现把水印信息多轮地、均匀地嵌入水印载体中。在提取过程中,通过扫描水印载体获取所有地不可见信息,解码后,实现把水印信息还原成确权水印图像。

下面结合说明书附图和实施例对本发明做进一步的说明。

实施例1:步骤一:水印嵌入,嵌入水印伪代码描述:

在步骤一中,输入待嵌入水印文档file、水印图像pic和图像进行arnold置乱的次数rounds,其中,水印文档file是csv格式,输出含水印信息的文档file_water。水印图像在picbrush(pic)中二值化,二值化后生成的图像根据置乱的次数在doarnold(sbmap,rounds)中进行arnold置乱,置乱后的图像在createpdt(arnoldbmap)中生成未进行编码的水印信息表pdt,pdt通过watercodingpdt(pdt)进行ascii不可见字符的编码,生成水印信息表wpdt。输入文件file,通过getdt(file)把文件的内容保存在内存中,命名为cdt,cdt可看作一张二维表。根据createdt(cdt),读取表的行数和列数,并按顺序列出坐标,以此生成嵌入位索引表qdt,通过scrambledt(qdt)进行所有行和所有列的随机置乱,生成索引置乱表hdt。在索引置乱表中以选取最多的原则,选取多个与水印信息表同型的矩阵,得到一组行列映射表sdt[]。循环依次读取行列映射表,每一次都把一张行列映射表存储在d中,读取d的每一个单元格的信息,把映射信息中的行号和列号分别存入r、c中,r、c组成一组坐标,根据映射坐标,依次把水印信息嵌入对应坐标的cdt中。由于行列映射表有n个,则嵌入步骤执行n次。最后,把内存中已含有水印信息的cdt表写入文件file_water,得到水印载体。

步骤二:水印提取,提取水印伪代码描述:

输入:file_water、rounds

输出:pic_water

wdt←getpdt(file_water);

ddt←rewatercodingpdt(wdt);

bmap_water_arnold←restorepic(ddt);

bmap_water←rearnold(bmap_water_arnold,rounds);

returnbmap_water.topic();

在步骤二中,输入水印载体file_water和嵌入时用户输入的图像置乱次数rounds,通过提取水印算法得到确权水印图像pic_water。输入file_water,getpdt(file_water)遍历水印文件获取所有嵌入的水印信息,以二位表的结构存入内存中得到wdt。把wdt传进rewatercodingpdt(wdt)进行解码,生成未编码的水印信息表ddt,其中,当同一个位置有多个值时,取众数,当有多个众数,该位置不进行处理。在restorepic(ddt)中,通过水印信息表还原图像,此时,还原后的图像是置乱的。将置乱的图像bmap_water_arnold和用户输入的置乱次数rounds,在rearnold(bmap_water_arnold)中进行逆置乱,最终,得到还原的确权水印图像pic_water。

运用c#编程语言将本发明所述的数据溯源算法进行实现。

步骤一中,生成的数据如下:

将选择的水印图像进行二值化后,得到如附图5所示的图像picbrush(pic)→sbmap:

将二值化图像进行arnold置乱,得到如附图6所示的图像,doarnold(sbmap,rounds)→arnoldbmap:

将置乱后的图像生成水印信息表,以坐标的方式输出,坐标中第一位数表示横坐标x,第二位数表示纵坐标y,第三位数表示此位置的像素点的颜色,如果是1表示黑色,如果是0表示白色,数据如下,createpdt(arnoldbmap)→pdt:

"(1960)(42160)(13420)(26171)(63320)(18610)(49381)(53220)(16130)(27140)(1180)(8121)(34560)(57250)(27310)(0330)(42210)(42520)(46600)(56350)(17101)(29190)(58490)(2150)(7111)(47411)(13300)(51620)(5270)(12630)(38150)(26400)(10481)(49261)(55550)(13511)(57450)(13430)(17501)(52470)(60240)(5180)(2210)(23581)(4490)(4460)(5740)(4101)(2361)(47390)(58200)(22290)(46591)(38230)(33340)(330)(60280)(52540)(3570)(4270)(29370)(6320)(46440)(28530)\n(1960)(42160)(13420)(26171)(63320)(18610)(49381)(53220)(16130)(27140)(1180)(8121)(34560)(57250)(27310).....”

下面是根据待嵌入文件生成的其中一张行列映射表,第一位数字是映射之后的横坐标,第二位数字是映射之后的纵坐标,

第一张行列映射表:decompsodt(hdt)→sdt[0]:

"(4630)(1131)(6134)(5945)(153)(1850)(438)(4162)(3961)(6140)(1351)(5219)(4246)(3236)(1855)(5059)(1919)(6053)(838)(493)(1961)(2163)(1728)(1555)(302)(6133)(5750)(5855)(4411)(1930)(204)(598)(415)(5735)(129)(6151)(2418)(4426)(4430)(504)(663)(277)(162)(6034)(2427)(5342)(5519)(2822)(5555)(2944)(2514)(1738)(403)(2020)(2823)(4825)(5929)(3113)(110)(821)(2936)(2230)(3513)(5148)\n(155)(314)(4633)(3152)(1355)(137)(3351)(1221)(558)(1960)(3320)(4250)(2644)(3926)(4851)(3233)(3313)(2910)....”

第二张行列映射表:decompsodt(hdt)→sdt[1]:

“(3656)(3133)(426)(2442)(570)(359)(1056)(812)(3835)(4755)(2815)(4928)(355)(3917)(1923)(504)(6150)(744)(5043)(2837)(732)(1435)(106)(5020)(944)(317)(456)(059)(324)(540)(1429)(3620)(05)(5311)(2057)(5425)(4141)(4018)(279)(014)(611)(3926)(1719)(3363)(1222)(2561)(4715)(2543)(3352)(110)(363)(2235)(2646)(1411)(5350)(2944)(561)(2840)(122)(4453)\n(1652)(4310)(4638)(4125)(3754)(5328)(313)(6344)(12)(2231)(1112)(5444)(1851)(38)(5241)(5952)(4711)(4339)(2814)(2836)(5223)(2428)(4319)(3126)(3448)(4860)(98)(5941)(2241)(3418)(6321)(739)(5332)(5911)(414)(4555)(4562)(112)(2139)(2222)(6260)(545)(527)...”

第三张行列映射表:decompsodt(hdt)→sdt[2]:

“(4243)(5650)(5725)(2020)(5635)(5111)(3323)(047)(832)(5834)\n(619)(1030)(2347)(3148)(113)(4918)(547)(6159)(3444)(2753)(2629)(1829)(3911)(5931)(1633)(412)(814)(429)(1549)(521)(2827)(3312)(2623)(2236)(525)(2747)(5912)(1316)(4131)(6363)(1249)(4222)(5228)(2462)(3945)(1136)(432)(1453)(5531)(3642)(3560)(2326)(00)(3237)(1815)(5853)(4742)(1018)(1723)(2937)(3325)(756)(5626)(3939)(1555)(140)(3416)(2946)(1542)(4220)(4029)(3060)(540)(3541)\n(2259)(2662)(3112)(4520)(5411)(310)(5050)(227)(4130)(4039)(2912)(2651)(5555)(3746)...”

第四张行列映射表:decompsodt(hdt)→sdt[3]:

“(2845)(2038)(213)(455)(3355)(4155)(5640)(3525)(3857)(429)(3512)(4917)(1021)(5641)(243)(5153)(11)(421)(6215)(2558)(5538)(572)(5211)(5731)(4156)(6039)(651)(2642)(6254)(1011)(4120)(4154)(574)(5235)(1231)(2150)(5037)(241)\n(495)(4824)(4248)(6311)(159)(4434)(07)(107)(1840)(2047)(322)(3246)(4136)(139)(4329)(3343)(3353)(2124)(298)(6152)(3120)(6139)(6243)(3252)(4944)(6045)(2022)(6130)(1113)(745)(1746)(4837)(1414)(3213)(1526)(6229)(427)(3910)(5835)(3217)(4856)(4528)(4342)(4754)(251)(4762)(5151)(1953)(2051)(1336)(3750)(581)(2813)(5253)...”

步骤二中提取水印生成的水印信息表,根据水印信息表,可直接还原成水印图像,此时还原出来的图像是经过arnold置乱的,rewatercodingpdt(wdt)→ddt:

"(1960)(42160)(13420)(26171)(63320)(18610)(49381)(53220)(16130)(27140)(1180)(8121)(34560)(57250)(27310)(0330)(42210)(42520)(46600)(56350)(17101)(29190)(58490)(2150)(7111)(47411)(13300)(51620)(5270)(12630)(38150)(26400)(10481)(49261)(55550)(13511)(57450)(13430)(17501)(52470)(60240)(5180)(2210)(23581)(4490)(4460)(5740)(4101)(2361)(47390)(58200)(22290)(46591)(38230)(33340)(330)(60280)(52540)(3570)(4270)(29370)(6320)(46440)(28530)\n(1960)(42160)(13420)(26171)(63320)(18610)(49381)(53220)(16130)(27140)(1180)(8121)(34560)(57250)(27310)..."

根据生成的水印信息表,还原出水印图像,即为附图6所示,此时的图像是经过arnold置乱的,restorepic(ddt)→bmap_water_arnold:

根据用户输入的在嵌入时候输入的arnold置乱次数rounds,对还原的图像进行arnold逆置乱,得到最终的确权水印图像,即为附图5所示,图像如下rearnold(bmap_water_arnold,rounds)→bmap_water:

本发明提出的方法解决了背景技术中存在的上述问题,具体表现在:

(1)基于ascii码中28、29、30、31的4个不可见字符对水印信息的编码,使得编码后的信息能够同时包含水印图像的二值水印信号和每个水印信号的位置信息,解决水印载体无法被嵌入大量信息的问题。

(2)提出基于置乱扩散的水印嵌入提取算法。基于随机置乱思想对文本载体的嵌入位索引表进行置乱,通过行列映射算法将水印信息映射到文档载体中,实现水印信息到文档载体的均匀扩散,大大提高了鲁棒性。

通过基于置乱扩散思想的嵌入提取方法,将水印信息通过置乱扩散的方式多轮地、均匀地嵌入水印载体,提高鲁棒性。采用水印信息的编码方式,通过ascii码中部分不可见字符的编码,将位置信息和水印信息编码成一个水印单元,实现嵌入大量水印信息。

本发明的主要参数说明如表1所示,行列扩散主要用表如表2所示。

表1主要参数表

表2行列扩散主要用例表

本发明未详述之处,均为本技术领域技术人员的公知技术。最后说明的是,以上实施例仅用以说明本发明的技术方案而非限制,尽管参照较佳实施例对本发明进行了详细说明,本领域的普通技术人员应当理解,可以对本发明的技术方案进行修改或者等同替换,而不脱离本发明技术方案的宗旨和范围,其均应涵盖在本发明的权利要求范围当中。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1