玩式草子─ソフトウェアとたわむれる日々

第81回「お講」文書をディジタル化する[その2]

ここしばらく急いで紹介した方がいい話題が続いたためずいぶん間が空いてしまったものの、今回は去年の夏ごろ取りあげた古文書をディジタル化するという話題の「その2」をお送りします。

この話題を取りあげた背景や「お講」については「その1」の回を見ていただくこととして、今回は古文書を読みやすくするために、スキャナで取り込んだ画像データをどのように加工したかを中心に紹介します。

画像ファイルの加工と印刷

「その1」で紹介したように、手元に伝わっている「お講」文書は半紙大の紙を長尺にそって2つ折りにして綴じ、横向きに使って表裏に縦書きで書き込まれています。スキャンは表裏それぞれに行ったものの、まとめて見れた方が便利だろうと表裏を合わせて1枚の画像ファイルにしています。

図1 ⁠お講」文書をスキャンした例
図1 「お講」文書をスキャンした例

細部まで見れるようにスキャン時の解像度は300dpiにしたので、合成した画像ファイルはおよそ4100×3100ピクセル、フルカラーのPNG形式で保存すると、1枚の画像ファイルが20MB弱程度です。当初はこの画像ファイルをディスプレイに表示して、

  • 「最初は『文政四』文政は年号だから、次の丸いのは『年』だろうな」
  • 「その次は巳年の『巳』「極月』は12月のことかな」
  • 「⁠⁠伊勢田御年貢』の行は読めるけど、その間にある2文字くらいは何だろう?」
  • 「その次は『免○四?』…」

とやってたものの、縦書きでフリーフォマットに書かれている上、読める所の方が少ない文書なので、このままだとテキストファイルに書き起こすことは難しそうです。そのため、読み取れる部分をいったん紙に清書してみることにしました。

紙に清書するなら画像ファイルも印刷しておくと直接比較できて便利でしょう。そう考えて画像ファイルを印刷してみたものの、スキャンしたままのフルカラーの画像では変色した紙の色が邪魔になる上、インクもバカになりません。そのため、印刷用にはフルカラーの画像ファイルを白黒の2階調に変換してみることにしました。

変換するのが数枚程度ならgimp等の画像編集ソフトを使うのが簡単でしょうが、数十枚規模になると一々手作業でやるのは大変です。そこでnetpbmを使って一括処理することにしました。

netpbmはこの連載でも取りあげたことがある汎用的な画像変換ツールで、単機能なコマンドをパイプで組み合わせて複雑な作業を実現する、いわゆる「UNIX哲学」に基づいて設計されています。

フルカラーのPNGファイルを白黒にする場合、pngtopnmでいったんPNM形式にしてからpnmtopgmでグレースケールに変換すればよさそうです。出力結果は元と同じPNG形式にすることにすれば、こんなコマンドラインで変換できます。

$ pngtopnm color.png | pnmtopgm | pnmtopng > gray.png

こうして変換した結果を見ると、確かに白黒にはなったものの、全体的にくすんだ感じで文字があまり明瞭ではありません。もう少し全体を明るく、コントラストを強調したいところです。

netpbmには画像の明るさを変えるためのppmbrightenコントラストを調整するppmnormグレースケールを白黒2値のデータにするpamditherbwpamthresholdなど、さまざまなコマンドが用意されています。これらのコマンドをどう組み合わせるのがいいか、いくつか試してみたところ、いったんグレースケールに変換してからpamthresholdで白黒2値の形式にするのが一番よさそうだったので、以下のようなコマンドラインで画像を白黒にしてから印刷することにしました。

$ pngtopnm color.png | pnmtopgm | pamthreshold -simple -threshold 0.4 | pnmtopng > gray.png

変換した結果を1枚の画像にまとめるとこんな感じになります。白黒2値の画像では元画像にあった資料の質感は無くなっているものの、印刷するにはこれぐらいメリハリがあるほうがよさそうです。

図2 元のカラー画像とグレースケール化、白黒2値化した各画像
図2 元のカラー画像とグレースケール化、白黒2値化した各画像

これから先はアナログな作業で、⁠くずし字解読辞典』などを参考にそれぞれの文字を読み解き、読めない文字は○にして紙に拾っていきます。この文書の場合、伊勢講のための年貢米を誰がどれだけ負担したかの記録のようで、⁠何升何合」といった数字の部分はなんとか読めるものの、その下にある人名らしい部分ほとんど読めませんでした。

図3 ⁠お講文書」を書き起こした例
図3 「お講文書」を書き起こした例

ある程度内容を持った文書なら前後の文脈から読めない文字を推測することも可能なものの、今回扱っている文書はまとまった意味を持たないメモ書き程度の内容なので、人名のような固有名詞を読み解くのは難しそうです。

画像ファイルのラベリング

前節のような方法でスキャンした画像ファイルを印刷し、1枚ずつ読める部分を解読していったところ、印刷結果だとシミか文字かわからないところがあり、元画像に戻って細部を確認しようとしてハタと困ってしまいました。

というのも、前節のようにスキャンした画像ファイルを白黒に変換して印刷しただけでは、紙に出力した結果と元の画像ファイルが関連付けられていないので、出力結果から画像ファイルを探すのが大変だからです。

本来、このような作業では、画像化する時点で元の資料にラベリングしておくべきだったものの、ラベルをつけて再スキャンするのも大変なので、ファイル名を画像に埋めこんでラベル代りにすることにしました。このような作業にもnetpbmは役に立ちます。

netpbmで画像にラベルを描き込むには、pamlabelコマンドを使ってPPM形式の画像ファイルに直接文字列を書き込んだり、pbmtextコマンドを使って文字列をPBM形式の画像ファイルに生成してからpamcompコマンドで合成する方法などがあります。しかしながら、ビットマップフォント時代に作られたこれらのコマンドは最近のベクター形式のフォントをレンダリングする機能が無いため、これらのコマンドで描き込んでみると文字がずいぶん貧弱になってしまいます。そのため、フォントのレンダリングにghostscriptを使うpbmtextpsコマンドを使うことにしました。pbmtextpsはpbmtext同様、指定した文字列をPBM形式のファイルに出力するコマンドなものの、ghostscriptを使ってフォントをレンダリングするため最近のベクター形式のフォントも正しく表示できます。

pbmtextpsを使ってラベルを貼る場合、ラベル部分は別途PBM形式の画像ファイルとして生成することになるので、こういうスクリプトを用意して処理することにしました。

 1  #! /bin/sh
 2  
 3  infile=$1
 4  outfile=$2
 5  
 6  pngtopnm $infile | ppmtopgm > __temp.pgm
 7  pbmtextps -fontsize 30 $infile > __title.pbm
 8  pamcomp -align=center -valign=top -yoff=30 __title.pbm __temp.pgm __overlay.pgm
 9  pamthreshold -simple -threshold 0.4 __overlay.pgm | pnmtopng > $outfile
10  rm -f __title.pbm __temp.pgm __overlay.pgm

このスクリプトでは引数として変換元のファイルと変換先のファイルを指定します。3~4行目でそれらを$infileと$outfileにコピーした上で、6行目でPNG形式な$infileをPGM形式に変換して__temp.pgmに出力、7行目で変換元のファイル名($infile)を画像化して __title.pbm というファイルに出力し、8行目で2つの一時ファイルを合成し、合成したグレースケールのファイルをpamthresholdで白黒の2値に変換してからPNG形式の$outfileに書き出します。

このあたりはX Window Systemのフォント設定にも依存しそうなものの、手元の環境では両者で作ったラベルに下図のような差が生じました。上がpbmtextpsで作ったラベル、下がpamlabelで作ったラベルの例です。このあたりは文字の読解には関係ないものの、一手間かけておく方が後々のためになりそうです。

図4 pbmtextpsとpamlabelで作ったラベルの違い
図4 pbmtextpsとpamlabelで作ったラベルの違い

くずし字読解支援システム

今まで紹介してきたように、古文書をスキャンして画像化し、画像ファイルとして整理したり、印刷に適した形に変換する、といった作業にはコンピュータの力を借りることができます。

しかしながら、そこに書かれた文字を読み取るのは、くずし方のパターンや書き順、筆の流れ等から文字を推定し、前後の文脈からその読み方でいいかを判断する高度な知的作業になります。

手元ではあれこれ資料を見ながら、1字ずつ「この形はこれだろうか、あれだろうか?」と首を捻っているものの、同じ文字でもくずし方が複数ある上、⁠これはどれにも似てないなぁ」という文字も多く、なかなか読解は進みません。

最近ではインターネット上でもくずし字関連の資料が多数公開されており、たとえば東京大学史料編纂所が整理した「電子くずし字字典」や奈良文化財研究所が整理した「木簡字典(木簡画像データベース⁠⁠」を使えば、ある文字(たとえば「年⁠⁠)が、過去の資料でどのように書かれていたかを検索することができます。この例を見ると、今回紹介した資料にある丸く書かれた「年」の字は、他にも類例があることがわかります。

図5 ⁠電子くずし字字典」「年」を調べた結果
図5 「電子くずし字字典」で「年」を調べた結果

これらの検索システムは、読みの候補がある程度絞れている際の確認には便利なものの、そもそも何と読むのか分からないくずし字にはあまり役に立たないなぁ…… と思っていたところ、2016年3月に東大史料編纂所と奈良文化財研究所の共同研究の成果としてくずし字の画像から似た文字を検索する「木簡・くずし字解読システム-MOJIZO-」が公開されました。

このシステムは、手元の文書画像から読めない文字を切り出して、ウェブサイトの検索ボックスに貼りつけると、⁠電子くずし字字典」「木簡字典」からそれに似た形の文字を見つけだしてくれるそうです。

検索できる画像ファイルは1枚4MB以下のPNGやJPG形式、背景の無い白黒画像で、ノイズや文字のかすれを修正すればより検索精度があがるそうなので、gimpを使って切り出した文字画像を加工処理し、さっそく試してみました。

図6 読めない文字を切り出し、加工修正
図6 読めない文字を切り出し、加工修正

試してみたのは図2の6行目、⁠四升八合九勺」出した人の名前らしい「九●○」「○」の部分で、検索結果を見ると「呂」「ゑ」が近いようです。文脈等が無い上、固有名詞(人名)なので確認はできませんが、⁠●」の部分は「兵」のようにも見えるので、この3文字で「九兵ゑ(きゅうべぇ⁠⁠」と読むのかも知れません。

図7 MOJIZOで読めない文字を画像検索
図7 MOJIZOで読めない文字を画像検索

MOJIZOシステムは、全く読めない文字のヒントを得るには有効なものの、今回試した範囲ではあまり納得の行く解析結果は得られませんでした。その原因は、調べようとしている文書が江戸時代後半に書かれているのに対し、データベースに登録されているのは江戸時代以前の古い文書が多いため、文字のくずし方等が時代と共に多少変わってきたせいかも知れません。⁠MOJIZO」はまだβ版とのことなので、今後のバージョンアップに期待したいところです。


今回、地元に伝わる古文書を記録として保存するために画像化し、読める範囲で読み解いてみたものの、形の定まった活字で文字を学んできた人間にとって、同じ文字を表わすのに複数の表記が存在する「くずし字」はずいぶんやっかいな文字です。

私たちはひらがなやカタカナ、漢字のそれぞれ1字が1つの音や意味を示すように学んできたのに対し、⁠くずし字」では複数の文字を連ねた単語(たとえば人名)が1つのまとまりとして表記され、その単語を知っている当時の人々にとっては自明な表記でも、それを知らない我々は1文字ごとに分解することすらできなくなっています。

いまさら国語の時間に「くずし字」を教えるわけにはいかないものの、⁠くずし字」で書かれた膨大な文献群は、平安時代以来1000年以上に渡って蓄積されてきた、断絶させるにはあまりにもったいない文化伝統です。

最近は画像認識や検索技術が進歩し、今回紹介したMOJIZO以外にも、くずし字をOCRで解読するシステムを開発している企業があるようです。このようなツールが発達し、コンピュータの力を借りて「くずし字」を簡単に読み解けるようになる日が来ることを期待しています。

おすすめ記事

記事・ニュース一覧