APP下载

基于纹理特征分类与合成的鲁棒无载体信息隐藏

2020-06-13司广文韩彦芳张志超

应用科学学报 2020年3期
关键词:纹理正确率秘密

司广文, 秦 川, 姚 恒, 韩彦芳, 张志超

上海理工大学光电信息与计算工程学院,上海200093

机密信息的安全传递是信息战及保密通信的核心任务.作为信息安全传递的重要方式,信息隐藏(information hiding)或称隐写(steganography)技术将机密信息伪装为不引人注意的普通信息而达到隐蔽传输或隐蔽存储的目的,对国家安全与信息安全具有重要意义[1].信息隐藏的研究在20 世纪90 年代受到重视并得到蓬勃发展.传统的信息隐藏方法主要是利用图像、音频、视频等载体信号的空间冗余来隐藏秘密信息,不可避免地把修改痕迹留在含密载体上,因此很难有效抵抗各类隐写分析算法的检测.为了有效抵抗各类隐写分析算法的检测,只能通过不修改载体进行信息隐藏,因此“无载体信息隐藏”这一概念应运而生.“无载体”并不是指不需要载体,与传统的信息隐藏相比,它强调的是不需要其他载体而是直接以秘密信息为驱动来生成或者获取含密载体[2].现有的无载体信息隐藏方法主要有文本无载体信息隐藏和图像无载体信息隐藏两类方法.由于图像本身包含大量的信息且使用最为广泛,因此常被当作理想的信息隐藏载体.图像无载体信息隐藏通过提取图像的特征序列并映射为二进制信息段来构建秘密信息与图像的映射关系[3].根据载体图像获取方式的不同,基于图像的无载体信息隐藏算法可分为基于载体图像选择和载体图像生成的无载体信息隐藏算法[4]两类.

基于载体图像选择的信息隐藏方案所利用的图像特征信息通常包括像素亮度值、颜色、纹理、边缘、轮廓等.此类方案采用恰当的特征描述方式,建立特征信息与需要隐藏的秘密信息之间的映射关系,从而进行秘密信息传递,代表性的工作如:利用亮度均值、图像尺度不变特征(scale-invariant feature transform, SIFT)等[5-7].文献[6]首先将载体图像均匀分块,利用不同图像块亮度均值的大小关系,构建哈希序列,映射秘密信息.通过哈希序列使秘密信息与图像形成对应关系,发送特定的图像完成秘密信息的传输.

基于载体图像生成的方案常以秘密信息为驱动生成含密图像,如文献[8-9]提出在纹理图像生成过程中进行数据的嵌入.该类方法首先在样本图像中选择若干彩色点,然后使用局部二值模式(local binary pattern, LBP)码映射二值数据和彩色点之间的关系,并根据秘密信息预先确定若干位置的彩色点,最后从样本图像中寻找合适内容,生成含密的大幅纹理图.随着纹理生成技术[10-11]的不断成熟和发展,利用形变函数生成水影画的方式引起了广泛的关注[12-13],文献[12]通过模拟水影画(又称湿拓画,marbling)来隐藏信息.该方法在白纸上书写待传递的信息,以相似的背景图案来填充空白部分,利用模拟marbling 的形变方法生成具有复杂纹理结构的数字图像.文献[13]首先构建不同的特征图形单元映射二进制数据,根据二进制秘密信息选取不同的图形单元,确定图形单元在白纸上的位置,生成含有隐写单元的图像;然后通过添加背景元素,利用形变操作生成含密纹理图像并发送,该方案实现了数据的大容量隐写.

文献[14]利用图像哈希算法将映射相同哈希码的图像作为同一类进而生成哈希图像库,然后根据秘密信息映射的哈希码,选取与载体图像块最相似的哈希图像块生成含密载体图像.文献[14]融合了上述两种方法,在载体选择的基础上生成了新的载体.

上述方法中,基于载体图像选择的方法鲁棒性强,但数据隐藏容量较低,因此不被广泛使用;基于载体图像生成的方法虽然数据隐藏容量高,但鲁棒性不强,不能有效地对抗高斯噪声、JPEG 压缩等攻击.为此,本文提出了基于纹理特征分类与合成的鲁棒无载体信息隐藏算法,融合上述两类方法的优点,在对抗各类攻击及数据隐藏容量方面优于文献[2,6-7]所提出算法,同时在一定程度上解决了文献[12-13]鲁棒性不强的问题.

1 基于纹理分类与合成的鲁棒无载体信息隐藏算法

1.1 算法总体框架

本文所提出的基于纹理图像分类与合成的鲁棒无载体信息隐藏算法框架如图1 所示.

在训练分类模型阶段要求秘密信息的接收方和发送方进行如下操作:首先对图像库内纹理图像进行统一处理,将每一幅纹理图像分割成规格一致的图像块(patch)作为一个类别(class);然后提取图像特征数据进行监督式分类训练;进一步通过迭代训练的方式生成稳定的图像分类模型并得到经过筛选后的图像库;最后对同一个class 下的不同patch 块,根据曼哈顿距离确定每一个patch 的位置信息.这样对于每一个patch 块都会对应唯一的二进制数据,构建接收和发送双方共享的映射字典.

图1 算法总体框架Figure 1 Framework of the proposed algorithm

在信息隐藏过程中,发送方将秘密信息分割为固定长度的秘密信息段,通过映射字典选取每段秘密信息对应的patch 块,利用公共密钥将patch 块组合为一张新的图像,随后通过形变操作生成含密纹理图像并通过公共信道发送给接收方.

在信息提取过程中,接收方通过公共信道获取含密纹理图像,然后根据公共密钥对纹理图像进行逆形变操作从而得到原始patch 块;随后利用分类模型得到每一个patch 块所属的class 类,并计算曼哈顿距离以确定每一个patch 块的位置信息;最终通过映射字典提取秘密信息.

1.2 特征分类及模型训练

在图像特征提取中使用空间金字塔匹配(spatial pyramid matching,SPM)算法提取图像的SIFT 特征.SPM 算法通过对图像进行多层级均匀划分的方式实现匹配、识别、分类[15],其原理如下:假设存在两个特征集合G、F,其中每个特征的维度是d维,将特征空间划分为不同的尺度q={0,1,2,··· ,Q}.当以尺度q来划分特征空间G、F的每一个维度时,k维的特征空间可以划分出K=2kq个网格.表示在分割尺度为q下的直方图特征:表示G特征在以尺度q划分下落在第r个网格中的特征点的数目;表示F特征落在第r个网格中的特征点的数目,则该尺度下匹配点总数的计算公式为

将缩写为R,定义权重为则两个特征集合G、F的SPM 的核为

本文使用支持向量机(support vector machine,SVM)对图像进行监督式分类训练.SVM是图像分类领域常用的分类方法,其基本原理是:在样本数据线性可分的情况下,直接寻找其最优的分类超平面,并使样本的分类间距尽可能大;在样本数据线性不可分的情况下,通过使用核函数将样本数据映射到高维空间,然后再寻找最优的分类超平面,从而达到分类的目的[16].核函数的选择是SVM 分类器性能的决定因素之一.本文所选择的核函数是应用最广泛的径向基函数(radial basis function,RBF),它带有两个参数:Ψ和Y,其中Ψ表示模型对误差的惩罚系数,Y反映了数据映射到高维特征空间后的分布.Ψ越大,模型越容易过拟合,Ψ越小,模型越容易欠拟合;Y越大,支持向量越多,Y值越小,支持向量越少,模型的泛化性变好.但若Y过小,模型实际上会退化为线性模型;若Y很大,理论上SVM 可以拟合任何非线性数据.

在训练中我们将每一个class 下、来自同一幅纹理图片的patch 作为同一个类.这样的分类不够精细,同时会造成类别的错误预判.但本文目的是对已知分类图像的精准预测,并不是对未知纹理图像分类的预测,因此模型可以达到极高的预测精度且泛化能力较强.为了提高鲁棒性,在训练模型过程中加入了经过高斯噪声、JPEG 压缩等处理的图像块.由于图像的SIFT 特征具有良好的稳健性,对平移、尺度缩放、旋转、仿射变换、遮挡,甚至亮度变化和噪声都有很好的抵抗能力[17],因此实验的鲁棒性很强,具体训练步骤如下:

步骤1准备训练图像集.首先对纹理图像库中的patch 块进行攻击.攻击方式从高斯噪声、JPEG 压缩或者椒盐噪声中任取一种,将被攻击过的patch 块加入到对应的class 中作为训练图像;测试图像集为训练图像集.

步骤2提取特征,训练模型.在SPM 框架下提取图像SIFT 特征作为特征数据,每一个class 作为一个类别,进行监督式分类训练.为剔除一部分数据并没有使用交叉检验和网格搜索的方法确定参数,而是根据经验首先将模型参数Ψ的初始值设置为200,Y的初始值设置为2,然后进行模型训练.

步骤3迭代训练模型.根据预测结果,删除类别预测中出现错误的class,只保留预测完全正确的class.同时根据最终图像库的大小调整参数,为了得到较理想的分类模型,参数调整过程中尽可能使惩罚系数Ψ调小而Y值调大,对模型进行迭代训练;

步骤4建立最终SPM 分类模型.根据最终所需要图像库的大小,选择class 数目,利用网格搜索选择参数使模型的分类正确率达到100%,选择Ψ尽可能小而参数Y尽可能大,建立最终分类模型,得到经过筛选后的图像库.

1.3 构建映射字典

构建映射字典的过程如图2 所示.假设经过筛选后图像库中有N组可区分纹理图像,表示为:C={C1,C2,··· ,CN},每个class 下包含M个patch 块,则分类标签为i的class 内第j个patch 块,表示所对应的二进制数据.

图2 构建映射字典Figure 2 Mapping dictionary construction

所对应的二进制数据的长度L为

也就是每一个可以映射长度为L的二进制数据.令n=lbN,m=lbM,则每一个patch 块所对应的二进制数据求解公式为

式中,dec2bin()表示将十进制数据转化为二进制运算,n和m为转化的位数.可以看出映射字典中的数据由两部分组成:一部分是不同类别的纹理图像所映射的秘密信息;另一部分是在同一类别下的纹理图像块中不同位置所映射的秘密信息.

1.4 信息隐藏

本文当中秘密信息隐藏的关键步骤是根据映射字典查找对应的图像块,具体步骤如下:

步骤1发送方首先将二进制秘密信息S以长度L进行分割,得S={s1,s2,··· ,sk},然后再将长度为L的秘密信息段sk分割为长度为n和m两段,得K为秘密信息段的数目.

步骤2对于每一个信息段根据两段二进制秘密信息和映射字典查找对应的即可找到对应分类标签为i的class 下的第j个patch 块,由此将所有秘密信息段所对应唯一的patch 块提取出来,根据公共密钥进行排序组成一幅新的图像.

步骤3对新图像进行形变操作,得到最终携带秘密信息的纹理图像,并发送给接收方.

由于本文所使用的图像块是纹理图像,因此通过简单的形变操作就可以达到一个较好的视觉效果.目前常用的形变函数有梳状变换、斜变换、正弦变换、圆形变换等,下面介绍本文用到的梳状形变函数及正弦变换函数.

梳状形变函数能够模仿直线梳子的效果在任意方向上穿过图像,若在平面当中有一点P(x,y),则经过梳状变换之后映射点P'(x',y')的计算过程为

式中:mod()为求余运算,α为最大位移量,λ用来控制梳状变换的尖锐程度,β用来控制两个梳齿波间距,d是点P(x,y)与任意方向直线Li之间的距离,B为直线Li上任意一点,v为直线Li单位法向量,

正弦形变函数能够使图像产生正弦变形的效果,若在平面当中有一点的坐标为P1(x1,y1),则经过正弦变换之后映射点的计算过程为

式中,w为正弦变换的波长,A为振幅,θ为相位,t为形变的偏移量.

发送方选取不同的形变参数,即可生成不同视觉效果的纹理图像.接收方需要在安全信道接收到含有形变参数的密钥,才可以对图像进行正确解密.发送方也可使用固定形变参数进行形变操作,接收方根据公共密钥即可对图像进行逆形变从而提取秘密信息.

1.5 信息提取

信息提取是本文的关键步骤.接收方需要与发送方共享图像库特征数据、class 类别信息、patch 位置信息及公共密钥,才能正确提取秘密信息,具体步骤如下.

步骤1接收方获取纹理图像后,首先根据公共密钥,对含密纹理图像进行逆形变操作,得到由patch 块组成的图像,然后依次提取K个patch 块,得到含密的、有顺序的patch 块图像集合.

步骤2使用与训练模型过程中相同的特征提取方法,提取K个patch 块图像特征,然后使用SPM分类模型对K个patch 块进行类别的预测.假设得到的类别信息C={C1,C2,··· ,Ck},查找映射字典,即可得到原始秘密信息S中类别信息所对应的秘密信息:.

步骤3对第k个patch 块位置信息进行判断时,首先根据类别的预测结果Ck,从图像特征库中提取对应class 内共M个patch 块的特征数据.通过计算曼哈顿距离,找到距离第k个patch 块最近的且位置信息为j的patch 块查找所有patch 块所对应的位置信息,即可得到原始秘密信息S中位置信息所对应的秘密信息:.

步骤4将步骤2 和3 中解密得到的对应合并,即可得到原始的秘密信息.

2 实验结果与比较

本文所有实验均在Windows 7 操作系统下使用Matlab2016a 仿真软件完成.分类模型采用的是LIBSVM 工具包提供的分类模型;实验当中图像库中图像来源于GitHub[18]以及百度图片网站;秘密信息为随机生成的二进制数据.

首先建立一个包含1 400 个类别22 400 个patch 块的纹理图像库,patch 块的尺寸均为100×100,经过3 次迭代训练.第1 次模型训练过程中参数Ψ取值为200,参数Y取值为2,得到预测完全正确的分组为858 组;第2 次模型训练,参数不变,得到预测完全正确的分组为661 组;第3 次模型训练参数不变,得到预测完全正确的分组为525 组,从中选择512 组class 作为最终信息隐藏载体,再次进行模型训练.最终利用网格搜索方法,得到当参数Ψ为200,Y为4 时,分类模型的预测正确率为100%,纹理库共包含512 类,每一类均有16 个patch 块,共计8 192 个patch 块.随后对隐藏容量与鲁棒性进行分析比较.

2.1 实验结果

在本文的实验条件下,每一个patch 块所携带二进制数据的长度L=lb(NM)=lb(512×16)=13 比特.在实验中随机产生1 300 比特二进制数据作为秘密信息,分割为100 段,每段包含13 比特.根据每段秘密信息对照映射字典查找patch 块,利用公共密钥组成一幅新的图像,然后进行形变操作获得含密纹理图像.

图3 是含密纹理图像生成及patch 组合图像恢复过程.发送端生成纹理图像过程中使用形变参数如下:梳状形变中α=70,λ=70,β=50.

图3(a)是通过映射字典获取的100 个patch 块组成的图像,尺寸为1 000×1 000,携带秘密信息1 300 比特.首先根据公共密钥将图3(a)分割,将尺寸为100×100 的patch 块分割为10 份10×100 的块,并拼接为10×1 000 的长方形块组合生成图3(b).图3(b)经过水平方向梳状形变后生成图3(c),图3(c)经过垂直方向梳状变换生成图3(d).

接收方获取含密纹理图像图3(e)后,首先根据公共密钥进行二次不同方向的梳状逆形变,得到图3(g);然后将图3(g)进行重新组合即可得到含密图像块图3(h);随后根据公共密钥按顺序提取patch 块,并对图像块特征进行分类预测,通过曼哈顿距离计算位置信息;最后查找映射字典恢复秘密信息,实验验证秘密信息提取误码率为0.

图3 含密纹理图像生成及恢复过程Figure 3 Generation of stego texture image and corresponding recovery procedure

相同的形变函数、不同的形变参数会生成不同的含密纹理图像,图4 为实验结果.实验使用与图3 相同的秘密信息,通过不同参数的梳状形变,获得了不同视觉效果的含密纹理图像.梳状形变参数为:α= 150,λ= 100,β= 100,梳状形变过程与图3 实验一致.可以看出图4(d)视觉效果与图3 (d)有明显的不同,且视觉效果良好,通过实验验证秘密信息提取误码率为0.相同的形变函数、不同的形变次数可以生成不同的纹理图像,图5 为实验结果.

图4 形变参数对含密纹理图像的影响Figure 4 Influence of deformation parameters on stego texture image

图5 形变次数对含密纹理图像的影响Figure 5 Influence of deformation number on stego texture image

实验中使用形变的方式为正弦形变,参数为:w=25,A=11,θ=π/3,t=π/2.其中图5(b)经过水平正弦变换得到图5(c),图5(c)经过垂直正弦变换得到图5(d),然后依次进行水平和垂直方向的正弦形变即可得到图5(h).显然得到的纹理图像5(d)到图5(h)均有不同且良好的视觉效果,通过实验验证秘密信息提取误码率为0.

多种形变函数可以生成不同且良好视觉效果的纹理图像,图6 为实验结果.实验中使用正弦形变和梳状形变两种不同变换方式,其参数如下:正弦形变参数w= 25,A= 15,θ=π/3,t= π/2,梳状形变参数α= 100,λ= 100,β= 80.图6(b)依次进行水平梳状形变、垂直方向梳状形变、水平方向正弦形变、垂直方向正弦形变即可获得图6(f),图6(f)的视觉效果良好,通过实验验证秘密信息提取误码率为0.

图6 多种形变函数生成的含密纹理图像Figure 6 Generation of stego texture image based on multiple deformation functions

大量类似的实验表明:本文所提出的信息隐藏算法能够100%提取秘密信息,且含密纹理图像生成方式多样,视觉效果均良好.

2.2 隐藏容量分析与比较

在数据隐藏容量方面,本文所提算法的隐藏容量与图像库的大小有直接关系,同时与最终发送纹理图片的尺寸也相关,即

式中,S为纹理图像传送秘密信息总长度,L为每个patch 块所携带的秘密信息的长度,Tw和Th分别表示生成纹理图像的宽和高,Pw和Ph分别为patch 块的宽和高.本文对patch进行了统一尺寸的处理.上述实验中每个patch 隐藏二进制数据长度为:L= lb(NM) =lb(512×16)=13 比特,生成纹理图像尺寸为1 000×1 000,能够携带秘密信息的长度为1 300比特.

实验首先对本文算法与文献[2,6-7]算法的隐藏容量进行对比,结果如表1 所示.本文算法和文献[2,6-7] 的隐藏容量均与图像库的大小有关,为公平起见,假定图像库大小均为2n+m幅.秘密信息为二进制数据,由表1可以得出本文最终发送的单幅图像数据隐藏容量要优于文献[2,6-7].本文对patch 块集合进行了形变操作,生成的含密纹理图像为(TwTh/(PwPh))个图像块的集合,使得最终发送纹理图像的数据隐藏容量得到提升.

文献[12-13]与本文算法数据隐藏容量与含密纹理图像的尺寸存在正比例关系,为确保公平性,假设最终发送纹理图像的尺寸均为800×800.实验结果如表2 所示.本文算法隐藏容量使用式(7)计算得出为832 比特(图像总数为2 ),要优于文献[12]的432 比特,在文献[13]采用稀疏比例取值为0.03∼0.30 时,单幅图像数据隐藏容量的取值范围为800∼8 000 比特,在当前实验条件下文献[13]所提算法的数据隐藏容量要优于本文算法.从理论上讲,在本文所提方案的框架下,随着图像库的升级算法的数据隐藏容量还可以进一步提高.

表1 不同算法隐藏容量的比较Table 1 Comparison of hiding capacity of different algorithms

表2 相同尺寸单幅图像数据隐藏容量的比较Table 2 Comparison of hidden data capacity of single image with the same size

2.3 鲁棒性分析与比较

使用椒盐噪声、高斯噪声、JPEG 压缩分别对含密图像进行攻击,然后进行数据提取.图7 为一组实验中纹理图像在不同攻击情况下恢复patch 图像的结果.其中图7(a)为含密patch图像,经过2 次梳状形变操作后得到含密纹理图像为图7(c);图7(c)被椒盐噪声、高斯噪声、JPEG 压缩攻击后对应得到图7(d)∼(f);图像逆形变过程中图7(d)∼(f)经过逆形变操作,对应得到图7(g)∼(i),然后分别进行秘密信息提取.

考虑到攻击后的纹理图像在恢复过程中可能会受到形变次数的影响,因此在实验中同一组秘密信息通过不同的形变次数再生成不同的含密纹理图像进行传送.然后将受到攻击的纹理图像分别进行秘密信息的提取,并对比分析实验结果.经过100 次重复实验,每次实验发送秘密信息为1 300 比特随机数据,获得含密图像尺寸为1 000×1 000.提取正确率(accuracy rate)通常定义为Cr= (Z/S)×100%,其中,Z为提取正确的秘密信息长度,S为秘密信息总长度.

实验条件设置:

实验12 次不同方向的梳状形变,形变参数α=70,λ=70,β=50;

实验22 次梳状形变,2 次正弦形变,正弦形变参数w=25,A=15,θ=π/3,t=π/2,梳状形变参数α=100,λ=100,β=80.

接收端收到的纹理图像后分别进行椒盐噪声、高斯噪声、JPEG 压缩攻击,然后进行秘密信息的提取,实验结果如图8 所示.

图7 纹理图像在不同攻击情况下恢复的patch 图像Figure 7 Restored patches under different attacks on stego texture image

图8(a)为椒盐噪声稠密度与提取正确率的关系图,可以看出在实验一条件下,含密纹理图像经过2 次形变,在实验2 条件下含密图像经过4 次形变,两组实验的结果基本保持一致,此时提取正确率与形变次数无关.当椒盐噪声稠密度达到0.05 时,平均的提取正确率保持在91%以上.

图8(b)为在均值为0 情况下高斯噪声方差与提取正确率的关系,可以看出实验1 的结果与实验2 的结果基本一致,3 条曲线基本重合,此时提取正确率与形变次数无关.噪声方差越大图片质量越低,在本文算法中当噪声方差为0.05 时,实验1 和实验2 的正确率均保持在82%以上,随着噪声方差的降低,在本文算法的提取正确率在稳定上升.

图8(c)为JPEG 压缩质量因子与提取正确率之间的关系,质量因子系数越大图片质量越高.实验中当质量因子取值在40∼100 时,实验2 的提取正确率要略好于实验1,且均能保持在85%以上;当质量因子取值在10∼40 时,增加形变次数会导致提取正确率明显下降,可以看出当质量因子达到10 的时候,实验1 的提取正确率为65%左右,实验2 的提取正确率为75%左右,两个实验结果的平均提取正确率保持在70%左右.

图8 提取正确率与各类攻击的关系Figure 8 Relationship between the correct extraction rate and various types of attacks

本文算法在一定程度上解决了文献[12-13]算法鲁棒性不强的问题.将本文实验结果与文献[2,7]算法进行比较可知,文献[2,7]所使用的框架为SIFT BOW 模型[19],属于非监督式分类模型,经过聚类训练后所得到的模型为线性模型,因此鲁棒性很强;本文采用的是监督式分类训练得到的模型为非线性系统,模型更为复杂,安全性更高,且本文提取图像特征的算法是对SIFT BOW 模型提取图像特征算法的升级,同时增加了被攻击过的训练样本,从而提高了算法的鲁棒性.表3 是本文算法与文献[7]算法在高斯噪声(均值为0,方差为0.01)和JPEG压缩(质量因子为75%)攻击时秘密信息提取正确率的比较.

表3 不同算法的提取正确率比较Table 3 Accuracy rates comparison of data extraction with different algorithms %

通过对比数据我们可以发现:在高斯噪声攻击下本文算法的提取正确率为92.5%,要优于文献[7]的91.0%;对JPEG 压缩攻击本文的鲁棒性也要优于文献[7],与理论分析结果一致.

3 结 语

本文提出的基于纹理特征分类与合成的鲁棒无载体信息隐藏算法,融合了基于载体图像选择与基于载体图像生成两类信息隐藏算法的优点,兼顾了鲁棒性与嵌入容量两个方面,在一定程度上解决了当前图像无载体信息隐藏算法存在的问题.本文主要利用纹理图像的类别及位置信息映射秘密信息,模型训练过程中增加了被攻击后的图像作为训练数据,提升了算法的鲁棒性;在patch 块处理过程中利用形变操作将多份秘密图像块合成为一幅新的、视觉效果良好的纹理图像,使得相同尺寸单张图像的数据隐藏容量有了较大的提高.实验和分析表明本文所提算法鲁棒性强,信息隐藏量大,生成的纹理图像视觉效果好.接下来的工作可以考虑增加图像库的类别,提升每一类图像的数量,从而进一步提高隐藏容量.同时可以使用基于深度学习的图像分类模型,进一步提高算法的鲁棒性.

猜你喜欢

纹理正确率秘密
门诊分诊服务态度与正确率对护患关系的影响
基于BM3D的复杂纹理区域图像去噪
使用纹理叠加添加艺术画特效
TEXTURE ON TEXTURE质地上的纹理
愿望树的秘密(二)
生意
品管圈活动在提高介入手术安全核查正确率中的应用
生意
消除凹凸纹理有妙招!
我心中的秘密