李 娜,劉 冰,高 峰,張星移
(1.安陽師范學院計算機與信息工程學院,河南安陽455000;2.安陽工學院,河南安陽455000;3.甲骨文信息處理教育部重點實驗室,河南安陽455000;4.河南省甲骨文信息處理重點實驗室,河南安陽455000)
甲骨埋藏于地下3000多年,時間久遠,絕大多數(shù)甲骨都已經(jīng)被腐蝕,再加上后來在出土過程中由于各種原因造成表面磨損、斷裂,大大降低了原始甲骨的研究價值。又因為多數(shù)出土的甲骨會受到風化腐蝕,所以在后期研究過程中甲骨學者盡可能不使用原始甲骨,通常以甲骨片作為原型經(jīng)過“墨拓”得到甲骨拓片。由于拓片中會保留大量的骨縫、裂痕等干擾信息,甲骨學者會對原始甲骨或者拓片進行手工摹寫,得到清晰、沒有干擾信息的甲骨摹本作為材料進行研究。甲骨發(fā)掘存世的有十五萬四千片[1],對于每一片進行手工摹寫來說,數(shù)量是非常龐大的,而且由于人為因素的存在,手工摹寫會大大降低摹本與原始甲骨片之間的精準程度。這樣的情況很大程度制約了甲骨文研究的進程。在實踐過程中,具有字形清晰的拓片摹本才是適宜于進行甲骨文研究的材料。本系統(tǒng)利用計算機圖像處理技術自動生成甲骨摹本,很大程度上加快了摹本生成速度,而且大大提高摹本的輪廓和字形的精準程度,生成便于處理、保存的摹本電子圖像數(shù)據(jù)。摹本電子圖像數(shù)據(jù)相對于手工描寫數(shù)據(jù)更加科學、規(guī)范,生成的標準統(tǒng)一,有利于實現(xiàn)甲骨文摹本信息共享,更加便于甲骨文的文獻資源的研究和利用。
目前針對甲骨文拓片已有相當多的研究,在甲骨文字形特征提取方面,如郭磊提出的行文工整的甲骨拓片文字特征提取算法研究[2];在甲骨文拓片圖像降噪方面,如王旖旎提出的基于極值檢測算法在甲骨拓片圖像雙邊濾波方法的應用[3];在甲骨文拓片圖像目標定位方面,如史小松等人提出的甲骨拓片圖像的目標自動定位算法[4]。以上這些研究的主要目的是為了研究甲骨拓片上的文字而對拓片進行的各種圖像處理。
本文提出的基于Python的甲骨文摹本半自動生成系統(tǒng)是利用圖像處理技術來完成傳統(tǒng)手工繪制甲骨文摹本的工作,高效、精準、規(guī)范的生成甲骨文摹本數(shù)字化數(shù)據(jù),便于后續(xù)的甲骨文研究工作的開展及面向應用方面的推廣。
基于Python的甲骨文摹本半自動生成系統(tǒng)大致可以分為以下5個功能模塊:獲取甲骨文拓片圖像;提取拓片圖像的外緣邊框;文字定位;調(diào)整大小放置文字;保存生成的摹本。該系統(tǒng)通過上述這5部分來實現(xiàn)由拓片得到與之相對應的摹本。系統(tǒng)的功能模塊整體設計圖如圖1所示。下面分別針對每一功能模塊實現(xiàn)時的關鍵技術進行詳細分析。

圖1 系統(tǒng)功能模塊設計圖
通過Python PyQt5模塊的相關可視化方法,引導用戶將原始拓片圖像文件導入,完成系統(tǒng)的圖片輸入功能,同時建立一個用于處理甲骨拓片圖像的緩存區(qū),用于隨時調(diào)入調(diào)出實時的甲骨拓片圖像的處理記錄。這樣保存每一步圖像處理的中間結(jié)果,便于用戶靈活調(diào)整、對比甲骨拓片圖像處理前后的變化,從而選擇保存最佳處理完成的結(jié)果圖像數(shù)據(jù)。
該模塊是本系統(tǒng)的核心功能模塊之一,其功能是處理目標拓片從而得到其外緣輪廓。此模塊采用了多個圖像處理算法,技術上借助了Python-Opencv模塊的相應方法實現(xiàn)。
3.2.1 采用均值濾波對原始拓片圖像進行預處理
首先,采用均值濾波算法對原始拓片圖像進行預處理。對于每個中心像素而言,其取相鄰像素的平均值作為新的像素值[5],從而達到去除圖像中存在的顆粒噪點的效果,實現(xiàn)圖像的初步模糊平滑處理,減少噪點或者失真點。如圖2所示,(a)圖是原始拓片圖像,(b)圖為采用均值濾波預處理后的圖像,通過多次實驗測試表明,采用5×5的內(nèi)核大小可以使甲骨文拓片圖像得到最佳的處理效果。
3.2.2 采用泛洪填充算法分割圖像主體與背景
由于甲骨文拓片圖像自身具有內(nèi)部顏色和外部背景差異明顯的共性特點,經(jīng)過模糊處理后,圖像內(nèi)外不同像素的差異就能很好地消除。所以,采用泛洪填充算法把主體與背景進行分離,從而達到消除背景的目的。數(shù)值上我們把重繪區(qū)設置為白色(255,255,255),也就是白色背景,與拓片主體區(qū)域分割開來。泛洪填充算法的參數(shù)中Scalar的負差和正差分別采用(2,2,2)和(3,3,3),其效果如圖2中的(c)圖所示。


圖2 預處理圖像
3.2.3 泛洪填充算法在特殊甲骨拓片圖像上的不可靠性
本系統(tǒng)采用泛洪填充算法有一個需要特殊處理的情況,就是對于有一類甲骨拓片圖像,如圖3中的(a)圖所示,存在有比較明顯的人工刻畫痕跡或是骨頭本身帶有的生物裂紋,這種裂痕明顯,具有貫穿性,與背景色相近且連通,泛洪填充算法應用于具有這些特征的圖像后,會錯誤識別主體,部分主體被填充為背景色,如圖3中的(b)圖所示。在后期進行灰度圖轉(zhuǎn)化和開閉運算的時候,由于錯誤識別主體,導致圖像中的主體邊緣繪制錯誤,如圖3中的(c)圖所示。


圖3 泛洪填充算法處理圖
泛洪填充算法雖然在填充拓片主體內(nèi)部有著不錯的表現(xiàn),但對于帶有貫穿性裂痕的甲骨拓片圖像并不適用,這一步可通過軟件接口讓用戶選擇,跳過泛洪填充算法,直接進行后續(xù)的處理,得到正確的邊緣輪廓。
3.2.4 灰度圖與開閉運算算法
利用泛洪填充算法分割背景后就得到一個比較孤立的甲骨文拓片圖像,這時拓片主體內(nèi)部還保留有甲骨文刻痕和很多細節(jié)痕跡信息。然后,采用轉(zhuǎn)化灰度圖的方法來得到一個顏色差異不大的拓片實體圖像,讓原始圖像中的不同顏色的像素都轉(zhuǎn)化為白到黑的像素,也就是灰色,但因為拓片中心本來就是以黑色為主的,所以從視覺上觀察,生成的灰度圖與前圖并沒有很明顯的變化。
得到灰度圖后我們采用開閉運算來對圖像進行中心的細節(jié)合并。開閉運算的特點就是彌合小裂縫,而拓片主體的位置和形狀不變,所以這樣可以把甲骨文字體和其他刻痕完全去掉,把實體內(nèi)部的細節(jié)抹去。這樣處理過的甲骨文拓片,除了基本的輪廓外,中心部分的圖像信息已經(jīng)被很好消除了,如圖3中的(d)圖所示。
3.2.5 采用二值化將圖像最大簡化
采用二值化處理是進一步簡化圖像的一個操作,去除拓片圖像中與邊緣輪廓無關的信息,減少數(shù)據(jù)量,有利于拓片邊緣輪廓的提取等后續(xù)處理。
二值化處理中的閾值threshold并沒有統(tǒng)一的標準,因為不同的拓片圖像處理后會出現(xiàn)不同的中間效果。本系統(tǒng)通過多組數(shù)據(jù)實驗測試發(fā)現(xiàn),采用泛洪填充算法時,threshold的閾值設置為200左右,可以得到最佳的邊緣輪廓效果;不采用泛洪填充算法時,threshold的閾值設置為100~150,可以得到最佳的邊緣輪廓效果,對比效果如圖4所示。系統(tǒng)在實體軟件窗口也給用戶提供了相關的閾值調(diào)整接口。

圖4 不采用泛洪填充算法時,不同二值化閾值對于邊緣提取的效果比對
3.2.6 采用findCounters函數(shù)檢索、drawCounters函數(shù)繪制拓片輪廓
輪廓檢索時用到OpenCV中的cv2.findCounters()函數(shù)來實現(xiàn),該函數(shù)有效的參數(shù)表為(image,mode,method),其中,image為我們處理的圖像文件,這里使用的是二值化處理后的圖像。mode為輪廓提取模式,采用的是CV_RETR_TREE方式,構(gòu)建一個嵌套式的輪廓存儲,方便后續(xù)直接獲取輪廓到白板中的操作。method為輪廓逼近方法,采用的是CV_CHAIN_APPROX_SIMPLE逼近法,這種逼近方法主要采取的是壓縮橫向和縱向以及對角線以達到僅保留線段端點的特點,比如一般的非方形矩形就只會壓縮四個點。最終,本函數(shù)會返回兩個值,第一個值contours是以點列組成輪廓線,也就是最終需要使用到的輪廓值,而第二個值hierarchy是從拓片圖像中提取出的輪廓的拓撲信息,采用二維數(shù)組的方式存儲,包含各個輪廓的子父關系以及上下輪廓的關系。
最終的甲骨文摹本邊緣圖像是一個黑邊框白底的圖像。為了還原摹本的外貌,需要重新把拓撲輪廓以黑色存儲于白底圖像中,作為最終采用摹寫域的標準圖像,也是后期操作中需要把甲骨字形存放的區(qū)域。
實際中,需要處理的圖像中的甲骨文拓片大小形態(tài)各異,在系統(tǒng)的界面布局中展現(xiàn)出來時,為了方便用戶的觀察、操作,就需要動態(tài)調(diào)整顯示圖像的大小,使每一張圖像都以適中的尺寸大小展示出來,最后,保存的圖像的大小還要和原圖一致,確保清晰度不降低,并且選中的甲骨文字大小也要和原拓片中的甲骨字大小一致。對于以上需求,不能簡單采用圖像的滿填充方式,否則,會出現(xiàn)圖像的壓縮和變形,降低圖像質(zhì)量,極大程度影響用戶的使用體驗。
本系統(tǒng)采用了比例尺對圖像進行動態(tài)大小控制。利用一個規(guī)范的比例尺把圖片按照我們需求的長寬展示出來,所有操作都按照如此的長寬標準來操作,操作全部完成后只需要再經(jīng)過這個比例尺的反向處理即可還原。比例尺的設計就要充分利用圖片的長寬比規(guī)范以及實時結(jié)合現(xiàn)階段大多計算機屏幕大小要求。本系統(tǒng)展示不支持根據(jù)分辨率來動態(tài)設置,默認按照現(xiàn)在的主流屏幕大小1920×1080的長寬度來設定,甲骨文拓片圖像的長寬度以讀入的每一張圖像的實際值來設定,定義寬為w,長為h。確定了分辨率后,我們要保證圖片穩(wěn)定在一個顯示范圍內(nèi)。為了保證這個穩(wěn)定的范圍有普遍性,進行如下規(guī)定:
在圖像過小或者過大的時候要通過比例尺進行動態(tài)調(diào)整。
比例尺默認值需要為1,當大小合適的時候,比例尺操作不會影響大小。
在比例尺的控制下,必須有個標準范圍。
采用長寬中較大的值用來判定是否達到需要使用比例尺的上限,即橫向圖以寬度定比例,豎圖以高度定比例。
通過上面的四個要求,確定圖像的最大長寬范圍都是800,但是不可能所有圖像都是標準的正方形。下面是最大值的映射關系公式:

這樣的關系僅僅是最大的映射關系,不需要給所有圖像加上這樣的映射,規(guī)定只有在長寬不在某個范圍內(nèi)時再使用上式的映射關系,超過這個范圍定義為圖太大,小于這個范圍是圖太小。所以可以得到比例尺如下的數(shù)學定義:
在某個二維定義域R2={(w,h)|w,h∈R}中,存在這樣一個定義域δ,滿足?(w,h)有δ={(w,h)|w∈(700,800)或h∈(600,650)},那么當前如果存在一個點β(w,h),有如下情況:

利用比例尺公式(2)推導后,便可以很快得到Ratio值,顯示給用戶的拓片圖像的長寬只需要加上一個Ratio比例尺系數(shù)即可在軟件中動態(tài)顯示。文字區(qū)域確定后,如果要存儲到原圖中去的話,也只需要除以Ratio系數(shù)值就可以還原為原始圖像中文字的區(qū)域大小。
本系統(tǒng)中,甲骨字定位是通過拓片域與摹本域的物理映射來實現(xiàn)的,把拓片上框選的文字位置通過映射準確定位到摹本區(qū)。其實現(xiàn)的基礎是在靜態(tài)GUI界面中加入了3.3中使用到的比例尺和“偽鼠標范圍框選”功能來讓靜態(tài)的數(shù)據(jù)可以在各種參數(shù)的實時監(jiān)控下邊實現(xiàn)的“動態(tài)”。
“偽鼠標范圍框選”是利用了GUI中固定的外邊框的靜態(tài)元素與鼠標實時監(jiān)控參數(shù)的動態(tài)特性搭配完成的,實現(xiàn)了一種讓原本不動的靜態(tài)外邊框元素移動起來,營造一種“選擇框體”的效果。實際上是一種基于布局的硬空間規(guī)律的物理硬映射,因為拓片與摹本的寬度和高完全相同,所以這種映射是可行的。
如圖5所示,B表示拓片域?qū)挘仄蚝湍懹蜷g距用A表示,域中的小矩形空間表示選擇的區(qū)域,則自然可以計算的兩個域中的圈選小矩形區(qū)域距離為A+B。因為在比例尺的調(diào)整下,A與B都是確定的,所以可以通過加減計算完成映射。

圖5 拓片域與摹本域的物理映射關系圖
如圖6示例所示,通過軟件本身的圖形接口,提供給用戶自定義的摹本保存操作,方便用戶對于完成摹本圖像的存儲管理。

圖6 生成摹本圖像
本系統(tǒng)主要解決甲骨文摹本自動生成問題,實驗表明本系統(tǒng)可以實現(xiàn)由拓片生成與之相對應的摹本,其中的甲骨字定位和調(diào)用甲骨文輸入法部分還需人工選擇完成。基于Python的甲骨文摹本半自動生成系統(tǒng)較手工畫制摹本的方法更加規(guī)范,結(jié)果更加科學、準確。由于時間和知識水平的限制,目前僅對相關內(nèi)容進行了初步的研究,本系統(tǒng)還存在著不足,在以后的工作中還有待進一步的優(yōu)化和完善,包括以下內(nèi)容:
目前該系統(tǒng)是半自動生成拓片摹本,可以嘗試實現(xiàn)自動化摹本生成系統(tǒng),使得在摹本生成的過程中進一步減少人員參與和參與時間,增強系統(tǒng)的普適性,提高其工作效率。
當拓片中文字方向不與界面水平方向垂直且拓片上文字較為密集時,當前系統(tǒng)中確定文字位置的選框可能會與輪廓或相鄰選框相重合,可以嘗試控制矩形選框使其可以旋轉(zhuǎn)一定的角度,進一步提高摹本的準確性。