唐代の拓本画像から、 各文字部分の矩形領域を切り出すことを考えよう。 拓本画像は白黒2値のPBMで与えられるものとする。
とりあえず、 武器となりそうな手法としては、 大津のしきい値選定法[1]とSondhiの自己相関関数[2]が、 簡単で良さそうだ。 大津のしきい値選定法は、 フタコブラクダ型の関数が与えられたときに、 フタコブラクダの間の谷の値をわりと正確に求められる。 Sondhiの自己相関関数は、 与えられた関数の基本周波数を、 わりと簡単に求められる。
まずは、 拓本画像のうち、 実際に拓本が写っている部分を取り出そう。 方法としては、 拓本画像の垂直射影分布と水平射影分布をとって、 それぞれの値をさらにヒストグラム化する。 このヒストグラムをグッと睨んでみると、 拓本が写っている部分と写っていない部分で、 フタコブラクダ型の関数になっているように見えるので、 大津のしきい値選定法で写っている部分を取り出せばOKだ。
次に、 行間隔を求めよう。 拓本が写っている部分の垂直射影分布をとって、 そこからSondhiの自己相関関数を0から順に調べていって、 最初に極大値を取ったところが、 行間隔の平均値だとみなせるはずである。
次に各行の幅を、 右端から順に求めていこう。 拓本が写っている部分の右端から、 行間隔の2倍の幅を左向きに取り、 その部分を白黒反転して垂直射影分布を求めれば、 フタコブラクダ型の関数になっているように見えるはずである。 そこで、 大津のしきい値選定法を使えば、 右端の行の幅がわかる。 これを順次繰り返していけば、 各行の幅が順々に決まっていくはずだ。
さらに1行1行から、 縦に並んだ文字の間隔を求めよう。 1行分の水平射影分布をとって、 Sondhiの自己相関関数をかければ、 文字間隔の平均値を求めることができるはずだ。
最後に1行1行から、 各文字を切り出そう。 行頭から2文字分の領域を取り出し、 白黒反転して水平射影分布を求めれば、 フタコブラクダ型の関数になっているはずだから、 大津のしきい値選定法で何とかなるはずである。
このやり方に基づいて作ったCプログラムを、 ここに置いておく。 出力はttext-kanbun[3]のCSV形式である。 行の切り出しは、 だいたいOKなようだが、 文字の切り出しが大きな雑音に弱いようだ。 文字切り出しを各行独立におこなうのではなく、 隣の行の情報も参照した方がいいのかもしれない。
参考文献
[1] | 大津展之: 判別および最小2乗規準に基づく自動しきい値選定法, 電子通信学会論文誌, Vol.J-63D, No.4 (1980年4月), pp.349-356 |
[2] | Man Mohan Sondhi: "New Methods of Pitch Extraction", IEEE Transactions on Audio and Electroacoustics, Vol.AU-16, No.2 (June 1968), pp.262-266. |
[3] | 安岡孝一: 透明テキスト付き画像作成ツールの開発, 東洋学へのコンピュータ利用, 第15回研究セミナー (2004年3月), pp.9-16. |