ページ 11

OCRの作り方について

Posted: 2012年10月07日(日) 19:05
by 隣のあの人
画像中の文字を検出し、テキストに書き込むソフトを作りたいです。
使用している言語はPHPですが、C言語もできるのでCの回答でもかまいません。

現在、GDライブラリを用いて画像の各座標のRGBを取得するところまでは完成しました。
そこから文字の色のついた部分を1とし、背景を0にしてあらかじめデータベースに保管してある
a-zA-Z0-9までの文字データと比較して文字を判別させようと思っているのですが、他の方法はありますでしょうか?
また、比較方法はどのようにしたらいいでしょうか?
完全一致だと同じフォント、同じサイズ、同じ座標に文字がないと不一致になるかと思います。
似ている文字(たとえば、数字の0とアルファベットのO)など誤字が発生するのは仕方ないとして、
文字データとの比較を出来る限りヒットさせたいのですが。。。

Re: OCRの作り方について

Posted: 2012年10月07日(日) 19:50
by non
「文字認識エンジン」で検索してみたらどうですか?

Re: OCRの作り方について

Posted: 2012年10月08日(月) 11:07
by バグ
一般的なOCRでしたら、パターンマッチング処理をあらかじめ登録されてあるフォントデータ全種類に対して行い、一致率の高い順番に2個取り出します。次に一致率がしきい値(たとえば100点満点で80点と以上ならOKみたいなユーザーが設定した値)が超えているかどうかを判別します。この時点で検出結果が1個になった場合はそれを採用、0個になった場合は未検出NGとします。もし、2個のままであれば、その2個の一致率の差分(安定度)を求めて、設定値以上の開きがあれば最も一致率の高い結果を採用して、そうでない場合はNGとします。

今回のようにあらかじめ比較する文字列が分かっているのであれば、OCVツールの方が高速だと思います。比較文字列に含まれている文字だけをパターンマッチング処理をしてその結果がしきい値を超えているかどうかだけで済みます。

パターンマッチングのアルゴリズムや、そこに至るまでのフィルタ処理なんかは画像処理について紹介しているサイトや書籍がすぐに見つかると思いますので、そちらを参考にしてみてください。

参考までに誤検出しやすい文字です。

I(大文字のアイ)、i(小文字のアイ)、1(数字の一)、l(小文字のエル)、7(数字の七)
B(ビー)、8(数字の八)
O(大文字のオー)、0(数字の零)