オルトプラスエンジニアの日常をお伝えします!

文字認識改善用の前処理について

こんにちは、オルトプラスベトナムのフーンです。

最近社内で OCR(Optical Character Recognition)に関連したプロジェクトで、実装を担当しました。本記事では OCR 用の入力改善方法を紹介します。

背景

OCR処理を実行したとき、時々認識精度が低いことがあります。色々な原因が考えられますが、主な理由は入力の品質が悪いことです。以下、私が使った入力の品質改善方法を紹介したいと思います。

文字認識の精度改善方法

1.      オリジナル画像の直立化

スキャンされた画像、または中央揃えでない撮影画像は、文字認識の精度に影響を与えます。そのため、ホモグラフィという変換方法を使用して画像を直立位置に回転します。

ホモグラフィとは、3x3の行列を変換し、変換後の画像に反映したい点に従ってオリジナル画像に写っている各ポイントを変換後の画像に射影するマトリックスです。

変換マトリックスは、以下の公式で計算されます。

f:id:hungh:20170112103044p:plain

したがって、f:id:hungh:20170112104802p:plain となります。

オリジナル画像の座標値を取得する方法

オリジナル画像から top-right、 bottom-right、 top-left、 bottom-leftの4つの座標値を取得します。

top-left: X値とY値を足した数が最小値である 座標値

bottom-right: X値とY値を足した数が最大値である 座標値

top-right: Y値からX値を引いた数が最小値である 座標値

bottom-left: Y値からX値を引いた数が最大値である 座標値

変換後の画像の座標値を取得する方法

変換後の画像は2Dの正方形または長方形である各ポイントの集合から構成されます。オリジナル画像の情報がなくならないように変換後の画像の座標値を最も適当となるように計算する必要があります。また変換後の画像の面積はオリジナル画像(srcArea)と同じ面積の方がよいと思います。

変換後の画像の縦幅の計算方法:

オリジナル画像の縦横比は仮のratio であり、画像の縦横の計算式は下記のとおりです。

dst_width =f:id:hungh:20170112103334p:plain ;

dst_height = ratio * dst_width;

つまり変換マトリックスに入れるための変換後の画像の4つの座標値を以下のように取得できます。

Point1(0,0), Point2(dst_width-1,0) , Point3(dst_width-1, dst_height-1) , Point4(0, dst_height-1) 

結果は、以下になります。

図1-1. オリジナル画像

f:id:hungh:20170112102622p:plain

図1-2. 変換後の画像

f:id:hungh:20170112102642p:plain

2.      文字ではなさそうところを排除し、ノイズを除きます。

John F. Cannyのアルゴリズムにより、エッジを検出します。

図2-1.

f:id:hungh:20170112102701p:plain

検出したエッジによりカバーの長方形の面積を計算して、不要なところを削除します。

図2-2. 削除後の画像

f:id:hungh:20170112102721p:plain

3.      バイナリ化

3.

f:id:hungh:20170112102738p:plain

おわりに

OCRソフトウェアを開発する場合、文字認識の改善には色々な方法があります。上記は、OCR入門者にも簡単な方法ですので、ぜひ試してみてください。