弓彦周 ,李猛 ,王健 ,黄卫星 *
(1.中国科学院自动化研究所,北京100190; 2.中科君胜(深圳)智能数据科技发展有限公司,广东深圳518000)
中国书法作为一门古老的汉字书写艺术,是中国文化的基本组成要素之一,随着计算机技术的发展,越来越多的学者开始利用计算机进行书法艺术的仿真,目前研究的方向主要集中在毛笔建模、笔触生成以及笔迹扩散等方面。
在毛笔建模方面,主要有基于经验的建模方法和基于物理模型的建模方法。2003 年,宓晓峰等[1]提出了一种基于经验的虚拟毛笔模型,这种模型的特点是计算简单、便于实时操作,缺点是对书法的各种笔法无法准确还原。在基于物理模型的建模方面,2002 年,YEH 等[2]构建了一种用弯曲弹簧作为骨架的毛笔模型,其笔毛由一簇弯曲弹簧相连的粒子组成,被布置在骨架模型的8 个方向,用粒子系统模拟笔头骨架的变化。2003 年,CHU 等[3]提出一种三维虚拟毛笔模型,通过在笔头脊线上设置不同密度的节点,可较好地还原毛笔的各种形态。孙美君[4]将基于经验模型的建模方法和基于物理模型的建模方法相结合,实现毛笔模型的构建,该模型计算简单、实时性较高。
其他建模方法,如张振庭[5]提出的基于三角网格的虚拟毛笔模型,张俊松等[6]结合实际书法经验,利用统计方法构建的参数化笔触模型,此模型可模拟不同类别的笔头形状,能较好地生成不同风格书体的书写动画。
在笔触生成方面,主要分为基于经验和基于笔墨机理2 种方式,在基于经验的笔触生成方式中,具代表性的是宓晓峰等[1]提出的雨滴模型,以笔画的最终呈现形态反推笔触生成,最终使用“雨滴”模型及“雨滴”的变种模型实现较为逼真的书法笔迹。在基于笔墨机理的笔触生成方式中,STRASSMANN[7]赋予每根笔毛墨水量、位置等信息,当笔毛与纸面接触并在纸面上运动时,笔毛信息亦随之变化。CHU 等[3]通过将毛笔纹理投影到纸面的方式生成最终笔迹。总体来说,使用基于笔墨机理的方式生成的笔迹,表现力更强,更符合书法笔触生成规则。
综上,为了提高数字书法笔迹的真实性,现有的研究主要集中在基于物理模型的毛笔建模和基于笔墨机理的笔触生成上,但此类方法复杂度较高。本文旨在构建一套可以在电子屏幕上实时创作书法作品的系统,考虑物理建模会增加计算量,因此,在毛笔建模和笔触生成阶段,系统主要基于经验和规则模型进行判断,使得在满足实时性的同时,取得较好的呈现效果。
下文安排如下,第1 节探讨在电子屏幕上书写时轨迹平滑的问题,第2 节讨论笔迹呈现,第3 节讨论笔迹修饰,第4 节介绍系统试验,第5 节是结论和展望。
使用真实的干毛笔在电子设备上进行创作时有一个突出的问题,即在慢速书写时,系统采集到的初始轨迹点总是存在较大的噪声,如图1 所示,其中,图1(a)为干毛笔沿钢尺运动时采集到的点,图1(b)为固定的圆形笔尖沿钢尺运动时采集到的点(用来模拟硬笔),轨迹点噪声都采用红外触摸框采集,可以发现,使用干毛笔较使用硬笔更容易产生噪声。
图1 使用干毛笔和硬笔生成轨迹点的噪声对比Fig.1 Track points generated by dry brush and hard pen
产生图1(a)所示现象的原因是毛笔没有蘸墨水,笔毛之间没有黏附力,很容易分叉,使得毛笔在行进过程中笔毛与屏幕表面的接触形状不断发生微小变化,从而产生噪声,此外,由于电子屏幕与笔之间的摩擦力小,书写者在运笔过程中的轻微晃动及采集系统的噪声等都会导致轨迹点抖动。而硬笔在行进过程中与屏幕表面接触部分变化不大,噪声相对较小。本文通过卡尔曼滤波算法[8]解决此问题。
首先,设置卡尔曼滤波(KF)参数,同文献[9],然后,将其与具有代表性的滑动平均滤波算法(MAF)和一阶滞后滤波算法(FOLF)做对比,结果如图2 所示,其中Original 是使用干毛笔划过触摸框时采集的初始轨迹点。由图2 可知,平滑效果依次为KF>MAF>FOLF。
当毛笔在电子屏幕上的移动速度大于1.5~3.0 pixel/ms 时,使用卡尔曼滤波会导致终点与初始点偏差较大,尤其是当笔迹方向变化较剧烈时,偏差更大。图3 为当平均速度大于2 pixel/ms 时初始轨迹点和真实轨迹点的对比图。产生图3 所示结果的原因是在书法创作中,毛笔的行进速度时快时慢,且易随机变换运笔方向,从而导致滤波系统不能准确获取系统的真实状态变量,为此,本文在笔刷快速移动时暂不使用卡尔曼滤波。
图2 不同滤波算法的对比Fig.2 Comparison of different filtering algorithms
当毛笔在电子屏幕上快速移动时,由于系统采集速率的问题,会出现较为明显的折线,如图4(a)所示。
为避免出现此现象,需要对初始轨迹点进行插值处理,常用的插值方法有圆弧插值[12]、B 样条曲线插值等。圆弧插值只保证插值点处连续,但不保证其可导,所以会出现较为明显的过渡点,如图4(b)所示。
图4 快速书写时和采用圆弧插值生成的轨迹Fig.4 Polyline generated by fast brush and circular interpolation
常用的B 样条曲线插值有二次B 样条曲线插值和三次B 样条曲线插值,更高阶的插值意味着需要更多的控制点。考虑笔迹点生成的实时性,本文采用二次B 样条曲线进行插值,二次B 样条曲线可以保证过渡点处可导且连续,普通的二次B 样条曲线公式为
将式(1)应用到图5(a)中,图中p1,p2,p3分别为 3个控制点,可以看到,当t从0 到1 变化时,生成如图5 所示的曲线,二次B 样条曲线经过首末两点。
如果直接用普通的二次B 样条曲线对轨迹点插值,则会导致插值曲线和初始轨迹相差太大。基于此,本文采用改进的二次B 样条曲线插值,如图5(b)所示,其中p1,p2和p3是连续的 3 个初始轨迹点,p12为p1和p2的中点,p23为p2和p3的中点,插值曲线由p12,p2和p23确定,这样就使得最终的插值曲线更加接近初始轨迹。
图5 二次B 样条曲线插值Fig.5 Quadratic B spline curve
使用改进的二次B 样条曲线插值生成的轨迹和线性插值生成的轨迹如图6 所示。
图6 改进的二次B 样条曲线插值和线性插值生成的轨迹Fig.6 Image generated by improved quadratic spline curve and line interpolation
笔迹呈现主要探讨毛笔在电子屏幕上书写时笔触形态的还原。利用平滑后的轨迹数据(轨迹点坐标、速度和长宽值),识别当前的行笔方式,然后在行笔方式库中选取最佳笔触,通过与基础笔触对比,经修正和融合,生成最终的笔迹,笔迹生成流程如图7所示。
图7 笔迹生成流程Fig.7 Flow of stroke generation
毛笔的行笔方式虽然多种多样,但不外乎基本的“提、按、顿、挫”。基于在电子屏幕上实际的书写数据,本文选择了对书法效果有较大影响的行笔方式:按笔、行笔和提笔,其所对应笔迹的运笔过程分别为由细到粗、均匀行笔、由粗到细,并建立了与这3 种行笔方式对应的笔触数据库,如图8(a)所示。此外,为了提高最终笔迹图像的质量,提前将笔触进行矢量化处理,如图8(b)所示,将左边的真实笔触矢量化后,生成右边的光滑笔触。
图8 笔触形态Fig.8 Stroke form
为了提高毛笔行笔识别的鲁棒性和准确性,本文通过一个简单的循环神经网络[10]进行行笔方式识别。对于待识别的轨迹点,选取其前15 个点和后4个点共计20 组轨迹数据。每组数据从5 个维度,包括轨迹点位置(x,y)、轨迹点长宽值(h,w)和速度v,进行人工标注和训练。为了更详细地定位毛笔的运行状态,以便从行笔方式库中选取合适的笔触,在分类模型中增加了回归分析,用于判断按笔、提笔的行进程度。
根据实时行笔识别结果,首先选取3 种基础笔触形态,分别对应3 种行笔方式,如图9 所示,其中每个基础笔触主要由基础笔触的构成元素组成。
图9 基础笔触形态Fig.9 Basic stroke form
系统在行笔方式库中选出合适的笔触(下称“真实笔触”),对基础笔触进行修正,如图10 所示,首先将基础笔触和真实笔触的重心对齐,从中心向外以固定角度间隔作射线,角度间隔设定为n,共360/n条射线,在本文中,n的默认值为3。每条射线与基础笔触和真实笔触相交,取对应两交点的中点作为新笔触的边界点,这种方式可以基于行笔状态修正基础笔触的形状和大小,使其更加真实。
图10 笔触修正Fig.10 Stroke correction
在获取笔触后,计算相邻笔触间的最小凸包络面[1],生成最终笔迹。
在完成笔迹呈现后,已基本完成书法的主要笔画形态,为了更完整地表达书法的各种笔法,模拟毛笔中的干笔飞白是一项必不可少的工作。本文主要采用基于规则的纹理映射方法,如图11 所示,采集真实的毛笔飞白笔画建立纹理规则库。一般可以按照行笔和运笔方向进行纹理分类。实际测试发现,将纹理分成直纹理和收尾纹理已可满足大部分场景需求。直纹理又可分为中锋纹理和侧锋纹理,内部每个纹理都以墨量和速度作为参数,在检索过程中,会匹配最接近当前墨量和速度的纹理图片。
图11 纹理规则库Fig.11 Texture rule base
现有的纹理映射方法有矩形法、四边形法和曲底边四边形法[11],其中,曲底边四边形法能更好地还原笔迹信息,所以本文选择曲底边四边形法。
在使用纹理映射过程中,有时会出现无法用一张纹理完全覆盖一个笔画的现象,此时需要对纹理进行拼接,但纹理拼接时在衔接处会不自然,如图12(c)所示。
图12 具有明显过渡的纹理拼接Fig.12 Image stitching with gap
为解决此问题,提出了一种改进的纹理拼接方法——枯笔纹理法,其原理如图13 所示。对待拼接的A 纹理和B 纹理,首先,在A 纹理末尾的x方向上提取长度为L1的纹理,生成A1 纹理,将A1 纹理沿纹理末端的y方向镜像翻转,生成A2 纹理,然后,按下式计算A2 纹理的alpha 通道:
其中,alphafinal表示最终的透明通道值,alphainit表示最初的透明通道值,x表示横坐标值,L1表示A2 纹理的总长度。
用式(2)将 A2 纹理转换成 A3 纹理,将 A3 纹理和B 纹理在x=0 的位置对齐,进行图像融合,融合算式为融合后生成B1 纹理,将A 纹理和B1 纹理进行拼接和二值化处理,最终生成C 纹理。将图12 中的A 纹理和B 纹理用该方法进行拼接,生成如图12(d)所示的纹理,纹理中几乎看不到拼接的痕迹。
图13 改进的纹理拼接方法Fig.13 Texture stitching with improved method
用枯笔纹理法生成的作品如图14 所示。
图14 枯笔纹理法生成的作品Fig.14 Image generated by half-dry stroke
本文拟构建一套实时数字书法体验系统,时间性能为本系统最关注的指标之一。系统试验环境参数为:Intel(R) Core(TM) i5-4460 CPU @3.2GHz,8GRAM Win7 64 位,Adobe Animate CC 2018。
测试3 种笔迹生成方式的延时,结果如表1 所示。方式1 不使用笔触修正,即在笔触生成阶段直接使用基础笔触,延时为2 ms;方式2 增加了笔触修正,延时达到了4 ms;方式3 在方式2 的基础上增加了纹理映射操作,延时为5 ms。
表1 笔迹生成方式Table 1 Different stroke generation methods
图15 为采用3 种方式生成的隶书笔迹效果对比,可以看到,方式1 和方式2 生成的隶书笔迹相差不大,主要原因是笔触修正对行笔中的起笔、折笔、修笔等细节修正效果明显,使得笔触更加自然,由于隶书笔迹较为圆润,不需要太丰富的细节变化,因此,在隶书书写过程中,使用笔触修正效果不明显。
图15 3 种方式生成的隶书笔迹Fig.15 The official script generated by three methods
图16 为采用3 种方式生成的行书笔迹,通过对比发现,方式2 的起笔比方式1 的更自然,主要原因在于笔触修正可以让笔迹更符合书写规律,而且经纹理映射后(见图16(c)),笔迹更具飘逸感。
以上分析说明,对于书写细节变化不大的书体,如篆书、隶书等,可以直接使用方式1 生成笔迹,在书写细节较为丰富的书法字时,如行书、楷书、草书等,建议采用方式2 生成笔迹,如果需要表现飞白效果,则宜采用方式3。
图16 3 种方式生成的行书笔迹Fig.16 The cursive handwriting generated by three methods
提出了一种较为完整的数字书法生成方法,并对数字书法在实际应用中的几个关键问题:笔迹平滑、笔迹呈现、笔迹修饰等进行了探讨,在笔迹修饰部分提出了一种枯笔纹理拼接方法。
本文中的笔迹呈现主要是基于经验和规则,今后将研究基于毛笔建模的笔迹生成方式,以更好地展现各种书法技法。此外,本文没有考虑墨水混合及扩散的情况,今后将做进一步研究。