弓彥周 ,李猛 ,王健 ,黃衛星 *
(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
提出了一種較為完整的數字書法生成方法,并對數字書法在實際應用中的幾個關鍵問題:筆跡平滑、筆跡呈現、筆跡修飾等進行了探討,在筆跡修飾部分提出了一種枯筆紋理拼接方法。
本文中的筆跡呈現主要是基于經驗和規則,今后將研究基于毛筆建模的筆跡生成方式,以更好地展現各種書法技法。此外,本文沒有考慮墨水混合及擴散的情況,今后將做進一步研究。