文字認識ソフトウェアの作成
４年 B 組 上田樹

指導教員 米田隆恒

１．要約
私は、看板などで読めない漢字を見つけたとき、読みが分からなければ意味を調べるのも困難であると感じた。そこで、日本語に限らず、それらの文字を全て写真に撮るだけで認識することができれば、外国など読めない文字が使われている場所へも、もっと気楽に行くことができるようになって、便利であると考えた。
市販の文字認識ソフトもあるが、文字の状態によっては読めないことがある。そこで、
Visual Basic を用いて、様々な状態の文字の写真に対応できる文字認識ソフトを自分で開発することにした。
キーワード

文字認識、エッジ、HLS、細線化、輪郭追跡、学習機能

２．研究の背景と目的

３．研究内容看板などで読めない漢字や知らない言語

文字の特徴点を抽出し、それらをつないの文字などを見つけたとき、そのたびに意でいくことができれば、文字を線の集まり味を調べるのは大変である。そこで、そのとして読み取ることができると考えた。そような場合でも全て、写真に撮るだけで文のために、前処理として文字の領域の抽出、字を認識することができればよいと考えた。 また文字の頂点の認識のために線の中心部携帯電話などに付属している文字認識ソフの抽出を行った。

トは、文字の並びや大きさによっては読めない、文字のバランスが悪いと読めない、

3.1 文字の抽出

斜めだと読めない、言語によっては読めな

昨年度の研究では、写真から文字を検出いなど、読みとれる条件が限られている。

する手段として閾値を決め、その値を境にまた、私は昨年度までもこの研究を行って輝度情報を２つに分けて写真を白と黒のみいたが、背景に模様等があると正しく文字の画像にする２値化を行っていた。しかし、を認識することができなかった。そこで、文字部分だけを正確に２値化で抽出するた

これらの問題を解消し、より多くの場合にめには、文字と背景で輝度の差があること対応できる文字認識ソフトの開発を行うこが最低条件であり、図１の写真のように写とにした。っている影の色が、文字に使われている色より暗い場合、背景部分の画素の全てが背景色に含まれるような閾値にすると文字部輝度の値の差をエッジ値とし、その値から分の色も含まれてしまうため、図２のようエッジの強さを検出する。に正しく抽出することが不可能となってしまず横方向のエッジ値は、調べたい画素まった。また、本来の目的である看板からの周辺画素の輝度の値に以下の値をかける。の認識では、背景に複雑な模様が映っていこの値の和は、その画素の右側の方が明るる場合も予想される。そこで、それらの場ければ正、暗ければ負になり、また輝度の合でも正しく動作するような文字の抽出方差が大きいほど絶対値が大きくなる。そこ

法を考案した。

で、この値を右向きのエッジ値とする。
-101-202-101

縦方向のエッジも同様に、周辺画素に以下の値をかけることで計算できる。

図１

影のほうが文字よりも暗い写真-1-2-1000121

この値から、縦横それぞれのエッジの向き、強さを計算できる。例として、図１の写真についてそれぞれの画素のエッジ値を求め、各画素の RGB 値にそれぞれエッジの強さをあてはめた画像を作成したところ、図３、図４のような画像が得られた。

図２

図１の２値化結果(1) エッジの検出
画像内で色が変わる部分の画素では、周辺画素との色の差が大きくなる。これを利用して、まず文字と背景との境目を求める。
画像内での色の変わり目の画素をエッジという。文字と背景では普通、輝度が異なるため、今回は各画素について周辺画素の

図３

横方向のエッジの強さ

の大きさは、図のように、周辺画素の輝度の差が大きいほど大きくなる。
こうして得られるデータを、エッジの角度を色相、エッジの強さを彩度として可視化すると、図６のようになった。

図４

縦方向のエッジの強さ(2) エッジの方向の検出
先ほど得た値を横方向のベクトルと縦方向のベクトルと考えると、その合成ベクト
ルから各画素のエッジの向きと大きさが分

図６

エッジベクトルの角度と強さかるのではないかと考えた。
(3) エッジ間の距離検出
エッジの角度を計算したとき、文字の線の部分を挟む２つのエッジの向きはほぼ逆方向になるため、ある２つのエッジについて角度が真逆で、かつそのエッジの角度が２点を繋いだときの角度と一致するような位置関係のエッジ同士をつないで、その間の画素を記録すれば、線の部分を抽出できると考えた。
図５ エッジベクトル

検出したエッジの強さが一定以上のとき、一般的に文字は背景より暗いため、そのエ

まずこのベクトルの角度は、x 成分と yッジの向きと反対向きに直線を引き、重な成分が分かっているため、tan の逆関数にった画素をたどって対応する線の端を探す。

よって求めることができる。またこのベク

直線は（エッジの Y 成分）÷（エッジの X

トルの大きさは３平方の定理から計算する成分）を比例定数 a とする１次関数と考え、ことができる。こうして得られるベクトル|a|≦1 のとき（傾きが 45 度以下のとき）は、たとえば図５のような右上に向けてひは(X、a・X)となる点を X を１ずつ変化さかれた直線の画像の中では、図のように、せて、|a|>1 のとき（傾きが 45 度以上のその画素から見て明るい側に線の向きと垂とき）は(Y/a、Y)となる点を Y を１ずつ変直な角度をとる。また、得られるベクトル化させてその画素に注目していく。注目画

素について、(注目画素のエッジの強さ)×

この得られた値にはノイズが多いため、cos(注目画素と初めの画素のエッジの角度平滑化を行う。平滑化の際、ただ単純に画の差)を調べ、その値を足していく。この像をぼかすだけでは、本当に線である部分値の和について、本来注目画素が線から背の値も大きく変わってしまう。そこで、抽景に移った時に０になるはずだが、判断基出したエッジの強さを利用して、本来の輪準がそれだけだと、線を挟んだ両側で影な郭をできるだけ保持しながら平滑化を行う

どによって背景色が異なっている場合正し方法を考えた。

く処理することができない。そこで、このエッジが強い画素は元の画像では別の線和が始めのエッジの強さの半分より小さくの部分との境目になっていると考えられる。

なる、または(その値)≦ －１×(始めのエそこで、注目画素とその周辺画素について、ッジの強さ)のとき、初めの点からその点エッジが強い画素ほど平滑化後の値への影までを文字の線の内側であるとし、内側の響が小さくなるようにすれば、２つの線のそれぞれの画素についてエッジの強さを記

間にエッジの強い部分が間にあればその両録していくようにしたところ処理が安定し側の値が混ざらず、輪郭が保たれると考えた。すると文字である部分ほど値が大きくた。そのため、注目画素とその周辺画素になる。そこで、各画素について、その値をついて、それぞれのエッジの強さをかけた最大値で割ったものをその画素が文字であ重み付き平均を計算する。画素(x,y)の得らる割合とした。

れた文字である割合の値を f(x,y)、エッジ

しかし、この方法では文字のほうが明るの強さをその画像内でのエッジの強さの最い色である場合に対応できない。また、背大値で割り 0.0～1.0 までの値にしたもの

景に模様がある場合、背景に文字よりも明を g(x,y)とすると、平滑化後の(x,y)の値はるい色も暗い色も存在する場合がある。そ∑ ∑ f ( x + i, y + j ){1.0 − g ( x + i, y + j )}こで、検出したエッジに対して逆の向きだけではなく同じ向きにも同様の処理を行うことにした。その結果を、文字である割合

1

1i = −1 j = −1

11

∑ ∑{1.0 − g ( x + i, y + j )}i = −1 j = −1

を輝度として可視化したものが図７である。となる。この処理を先ほどの抽出結果で行ったところ、図８のようになった。

図７ある画素が文字である割合

うにした。この方法で、街中などの背景が複雑な写真で文字である割合を計算したところ、次の図 10 のようになった。

図８平滑化後の画像

ただし、このままでは線同士の間も線とされてしまっている。そこで、エッジ同士を繋ぐとき、その距離を記録するようにした。
先ほどの画像でそれぞれのエッジ同士の距離を求め、疑似カラーで可視化すると、図９のようになった

写真の引用元

街画ガイド(http://komekami.sakura.ne.jp/archives/567/p8236268 ）

図 10 街中の写真からの文字部分の検出
このように、複雑な背景である写真の中からでも、文字の大まかな位置を認識することができるようになった。
図９それぞれの線の幅(4) HLS モデル上の座標の計算

このように、線の部分と線同士の間の部分に、明確に差がでた。

写真の中で、文字と背景では色に偏りがあることが多い。エッジからの線の抽出だ

この記録した距離について、文字の部分

けでは「線」と「線と同じ幅の模様」を区と背景の部分では、文字の部分のほうが距別することができない。そこで、各画素の離の値が小さいことが多い。そこで、文字色の情報についても考慮することにした。

である割合を計算する際、（1.0―記録した色の違いを正確に数値化するために、各画距離/距離の最大値/10）をかけ、線の距離素の色の HLS モデル上の座標を計算する。

が短いほど文字である割合が大きくなるよ

HLS とは、色情報を双六角錐にモデル化されたもので、H が色相、L が明度、S が正の X 軸から反時計回りに 240°であるか彩度を表している。

ら、
x =R−

𝐺 𝐵
−2 2

√3√3𝐺−
𝐵22と計算できる。また、モデル内の高さ Z にy=ついて、R,G,B の最大値を Imax、最小値を Imin とすると、である。

Z=L=

𝐼𝑚𝑎𝑥 + 𝐼𝑚𝑖𝑛2

２つの色の違いは、このモデル上での距離と考えられるので、数値化することがで
図 11 HLS モデル
調べたい画素の赤の値を R、緑の値を G、青の値を B とおき、それぞれの値を 255で割って範囲を 0～1.0 に変換する。
X、Y 座標について、図 12 のように双６角錐を上から見て考える。

きるようになった。
(5) クラスタリング
データを自動的に分類する手法をクラスタリング、同じものと分類された部分をクラスタ、それぞれのクラスタの中心をクラスタ中心という。検出したデータを基に、どの部分が背景でどの部分が文字かを分けるため、k-means++法を参考にクラスタリングを行った。
まず、文字と背景の２つのクラスタ中心を作る。クラスタ中心の初期値は、1 つ目をデータからランダムに選ぶ。それぞれのデータ点 x に関して、最も近いクラスタ中心との距離D(𝑥)（この場合は１つめのクラスタ中心からの距離）を計算し、その値が最も大きいものを２つめのクラスタ中心とした。クラスタ数を３つ以上にする場合も

図 12 真上から見た HLS モデル
R の方向を X 軸とすると G の方向は正のX 軸から反時計回りに 120°、B の方向は同様に、距離D(𝑥)が最大である点を新しいクラスタ中心としていく。
次に、各データ点に、クラスタ中心が最も近いクラスタを割り振っていき、割り振ったデータを基に各クラスタの中心を計算する。そして、もう一度各データ点にクラこのように、四角形と文字とでそれぞれスタを割り振っていく。これを全てのクラクラスタの端にあたる画素の数スタの割り当てが変化しなくなるまで行う。

クラスタ内の総画素数

先ほどの写真についてクラスタ数を２個とを求めたとき、図形と文字とで明確な差がしてクラスタリングを行ったところ、図生じた。そこで、各クラスタについてこの13 のようになった。

値を求め、その平均よりも値が大きいクラスタを「文字のクラスタ」とした。

3.2 細線化
文字の形を認識する際、線に太さがあると認識しづらい。そこで、文字の中心１画素以外を除去する細線化を行った。今回は、田村の方法（参考文献４）を基に、文字の認識に最適な細線化方法を考案した。
図 13 クラスタリング結果(6) 文字のクラスタの特定割り振ったクラスタについて、どのクラスタが文字であるかを特定する。
一般的に文字の形は図形より複雑である。
その為、そのクラスタと他のクラスタとの境目に当たる画素数を調べれば、文字と背景で違いが現れ、見分けることができるのではないかと考えた。

文字の画素を１、背景の画素を０とおく。
この時、例えば注目画素が 1 でその右が０の時、その画素は線の右の端であると考えられる。上、左、下も同様に線の端であるので、そのような画素を除去(０に)していくと、線が細くなっていく。しかし、それだけでは線が途切れてしまう。そこで、図15、図 16 のように、除去しないパターンに相当する場合は除去を行わないようにした。その結果が図 17 である。

そこで、簡単な図形と文字とで実際に比較を行った。その結果が図 14 である。

図 15（左） 除去パターン１
図 16（右） 除去パターン２
図 14 端の画素の数の違い

図 17 細線化結果

図 19 細線化結果

図 17 をみると、線が本来無いはずの場また、歪みについて、細線化のパターン所に飛び出てしまっているところがある。

が「上または右」が０の場合と「下またはまた、線の交点付近が大きく歪んでおり、左」が０の場合という２パターンのみであこのままでは処理が困難である。

ったが、「上または左」「下または右」が０

線が飛び出ているところを処理前の画像であるというパターンも考えられる。そこ

データで確認すると、飛び出ている線の端で、その２パターンを追加すれば、除去しの部分が１画素分の突起になっていて、そていく向きの偏りが減り、歪みが軽減されこが線の端であるとされてしまっているこると考えた。そこで、除去パターン１、２とが分かった。そこで、図 18 のような４を参考に、図 20、図 21 の除去パターン３，パターンに相当する場合は、除去しないパ４を作成した。この処理の結果が図 22 でターンにあてはまっていても強制的に除去ある。

するようにした。その結果が図 19 である。
このように、飛び出ている線を大幅に減らすことができた。

図 18 強制除去するパターン

図 20（左）除去パターン３

図 21（右）除去パターン４

図 23 進む方向
進む方向に、図 23 のように番号をふる。
図 22 細線化結果
このように、線の歪みを大幅に軽減することができた。

3.3 線の座標抽出細線化した画像データから、どこからどこに線が引かれているかを抽出する。そのためには、線の端、交点、角を認識すればよいと考えた。
細線化したデータにおいて、ある画素が１で、隣り合う１の画素が１つだけの場合、その画素は線の画素と考えられる。また、ある画素が１で、隣り合う１の画素が３つ以上ある場合、その画素で線が交わってい輪郭を辿る際、例えばひとつ前に下に進んでいた場合、次の画素は今の注目画素の左上や左になることはない。なぜなら、下に進んだ時点で、すでに左と左下（今の注目画素から見て左上と左）はすでにチェックされ除外されているということなので、下に進んだ後も選ばれることはない。一般化
すると、ひとつ前の向きから時計回りに３つ分の向きに進むことはない。この性質を利用し、輪郭を検索するときの１つ前の向きを Vold、次の向きの検索の初めの向きを Vnew とすると、Vnew = (Vold + 6)𝑚𝑜𝑑 8となる Vnew から向きの検索を始めれば効率が良い。このように開始地点に戻るまで輪郭を辿る。

ると考えられる。そこで、まずこの２種類の特徴点を抽出する。
次に、抽出した特徴点を結んでいく。この際、線の角の抽出も行いたいので、輪郭追跡を行った。輪郭追跡では、文字のクラスタと他のクラスタとの境界部分を、反時計回りに一周する。
輪郭追跡の開始位置は、特徴点を結んでいきやすいよう、線の端の中の一つから行う。線の端が存在しない場合はそのクラス

図 24 輪郭追跡

タ内でもっとも上にある画素から行う。
辿っていく際、最後に通った特徴点からひとつ前までの角度を計算し、次に進む向きとの差が一定値以上のとき、その画素を線線が２重になっている部分を除去する際、の角とする。角も特徴点であるため、その線の角の位置は通る向きによって変わるこ

画素から次の特徴点までで計算する角度は、 とがあり、完全に同じ線になるとは限らなその画素からの角度となる。

い。そこで、線一本一本の座標を確認していき、類似した直線がないかを探す。２本の直線について、角度がほぼ同じで、かつそれぞれの対応する点との距離の和が一定値以下の場合、その２本の線を同じ線だとみなし、対応する点同士の中央を結んだ線を新しい線とし、元の２本の線を除去する
この際に、線の座標が変わった場合、もともと繋がっていた他の線と離れてしまう場

図 25 線の角の認識合がある。そこで、座標を変更する際、ほかの線がその座標を使用していれば、そのこうして抽出した３種類の特徴点を、輪郭追跡の際に通った順に結んでいく。これで、画像から線を抽出できた。

座標も新しい線に合わせるようにした。
また、分かれている線について、２つの線が頂点で接しており、かつ角度の差が一定値以下の場合は、接していないほうの２つの点から新しい線をつくり、もとの２本の線を除去することで１本にまとめた。

図 26 線の抽出
しかし、この段階では、一周しているため２回通る場所ができ、図のように抽出した

図 27 線情報の調整

線が２重になってしまうことがある。また、交点によって本来 1 つの線であるべき線が２つの線に分けられてしまっている部分がある。
そこで、これらの線の調整を行う。

3.4 文字の判定登録された文字データと照合するために、読み取った文字の大きさ、縦横比を、次のようにして登録されたデータのものに合わせる。読み取った文字の大きさについ

て、抽出した線の頂点のなかから最も上にもし同じことが機械でもできれば、読み取ある点、右にある点、左にある点、下にあれない文字を減らし、また読み間違いも減る点をもとめる。すると、左上の頂点がり精度を上げることができると考えた。推（最も左の点の x、最も上の点の y）、右下測のために、まず単語のデータベースを作の頂点が（最も右の点の x、最も下の点のり、言葉を大量に登録する。読み取った文y）である長方形に、文字がちょうどおさ字を、その登録された全ての単語と比較し、まる。この長方形の横幅を文字の幅、この一致度を調べた。読み取った単語には、間長方形の高さを文字の高さとする。読み取違った文字が含まれている可能性があるた

った線の頂点のｘ座標にそれぞれめ、登録された単語の側から相当する文字登録された文字データの幅をかけ、y読み取った文字の幅を探していく。また、言葉の最初の文字とぞれ座標にそれ登録された文字データの高さをか ければ 、 大
読み取った文字の高さきさ、縦横比が同じになる。

最後の文字は言葉を判別するうえで重要であると考えた。そこで、単語の初めの文字と最後の文字は一致しているときに４pt、次に、文字の判定のために文字の形の一それ以外の文字は場所も同じで２pt、何文致度を求める。文字の形の一致度は、各座字目かがずれていてもその文字が存在すれ標の絶対位置だけではなく、線の角度や相ば １ pt と し 、 文 字 の 一 致 度 は対的な位置の違いなどを含め、字に癖があ「ったり字のバランスがある程度崩れていても認識できるようにした。読み取った線にポイントの合計」とした。さらに文全てあっていたときの合計字数の違いについて、文字数の一致度を文
１ついて、登録された文字データのすべての字数の差に反比例するように、線に対して｛1.0―(角度の差)/360｝×（対とした。単語の一致度を文字の一致度と文応する頂点間の距離の合計）/(判定用デー

字数の一致度の積とすると、単語の一致度

タを囲む長方形の対角線の長さ)×(その線は完全に同じ単語のときに 1 となる割合との長さ)を求める。全ての線でこの値を計なる。この値が最大になる単語が、本来そ算し、その和を、読み取った線の長さの和こに書かれていた単語であると考え校正をで割れば、線の一致度の合計が出せる。ま行うことで、正しく読み取れていない文字

た、頂点同士の位置関係について、ある点が混じっていても、自然な読み取りができより右か左か、上か下か、という関係が同るようになった。

(文字数の差 )+1

じである点を数え、(一致した点の情報の数)/(全ての組み合わせ)を求める。これを3.6.学習機能

先ほどの線の一致度にかけると、完全に同文字を認識していく中で、自動的に精度じ形のときを１とする一致度が求まる。

を上げていく「学習機能」が実現すれば、文字の登録効率が非常によくなると考えた。

3.5.推測判定時、形の一致度が８割以上の場合や、人は文中に読めない文字があっても、前読み取りに失敗した文字を推測したときに後の文字から推測して読むことができる。

文字数が完全一致かつ単語の一致度が 8 割

以上の場合は、読み取った文字を「その文(3) C#と VB.NET の入門サイト字」としてデータベースに追加するように「http://jeanne.wankuma.com/」

した。また、形の一致度が８割以上でかつ(4) 画像処理ソリューション使われている線の数が同じである場合、そ「http://imagingsolution.blog107.fc2.com/の登録された文字データの各座標を、読みblog-entry-151.html」

取った文字の座標に、一致度に応じて近づ(5) 村上研究室けるようにした。これで、認識の際にある「http://ipr20.cs.ehime-程度の精度で読み取れていれば、使っていu.ac.jp/column/gazo_syori/index.html」

るだけで自動的に精度が上がっていくよう(6) イメージングソリューションになった。

「http://imagingsolution.net/」

画像処理(7) 無作為研究所「http://www.faicha.com/」

４．まとめと今後の課題
今回の研究で、文字を線として認識し、判定することができた。しかし、今の段階

６．謝辞

では文字が斜めになっている場合に正しく今回の研究を行うにあたり、顧問の米田判定することができない。そこで、今後は隆恒先生には多大なご指導を賜りました。

判定時に、それぞれの最も長い線の向きがまた、サイエンス研究会の先輩方にも多く同じになるように回転させてから判定するの助言をいただきました。この場を借りて、などして、写真が斜めに撮られていても認深く御礼申し上げます。

識できるようにしたい。
また、背景に影や模様が入っているような場合でも、文字の大体の場所の抽出ができるようになった。しかし、実際に背景が複雑な写真のクラスタリングを行おうとすると、様々な模様と区別するため多くのクラスタ中心が必要になる。そこで今後、最適なクラスタ数を計算する方法を考案し、より精度のよいクラスタリングを行えるようにしたいと考えている。

５．参考文献(1) Visual Basic

中学校「 http://homepage1.nifty.com/rucio/main/main.htm」(2) DOBON.NET「http://dobon.net/index.html」