文字抽出アルゴリズム”SWT”について


画像中から文字を認識するアルゴリズム(SWT:Stroke Width Transform)がmicrosoftから提案されている。

“detecting text in natural scenes with stroke width transform”

この画像処理について簡単に説明する。

 

・SWT処理のアルゴリズム

Swtは元の画像を文字幅画像(各画素がその画素にあった文字の幅を示す画像)に変換する処理である。

文字列は基本的に文字列の幅が一定であるという特徴を持つのでそれを利用する。
(論文最初のページ(a)→ (b))

以下の手続きで算出する。

1. 元の画像にケニーのEDGE検出。
2. EDGEの線上のピクセルpに対してその法線方向にEDGEがないかさがす、もしあったらその点をqとし、そこでも法線を計算。p,qでの法線が逆方向であればそれは文字の要素と判断
3. pq間の距離lを計算し、pqの間の画像値を全てlにする。
4. もしみつからなかったら無視
(実際にはその他にも例外処理多数)

この処理でSWT画像ができあがる。

次にこのSWT画像から1文字の文字領域を抽出する必要がある。

 

・1つの文字を抽出
(論文最初のページ(b)→ (c))

1. SWTの画素値が同じであれば(または近い値であれば)おなじ領域とする。このグルーピングは古い方法(Connected component algoryhtm)でOKでSWTの比が3を超えなければグルーピングする。
2. これを行うと多数の領域(connected component)に分割できる
3. これ以降、以下connected componentをいらないやつは削除していく
4. ルール1,かくconnected component内のピクセル値の分散を計算する。分散が大きすぎるものは削除 これで自然な情景は消せる。枝とか葉を消せる
5. このときの閾値はあるconnenced componentの平均の半分くらい
6. ルール2,縦横比が1:10以上だと消す。文字以外だと細長いのが出やすいから!
7. ルール3、高さが10-300pxの範囲外であれば消す!

これで一文字の英字を抽出することができる。

以降、英単語のつながりを判別し1単語単位での推定を行う。

 

・文字 をグループ化して単語のライン画像を得る

1. 各文字(3の手順で推定されたもの)のswt平均も高さも幅もほぼ同じ値になる→一文字一文字がアルファベットだから
(例えば、ポストの横に車の車輪があってもIOとは読まない。なぜならポストは車輪よりだいぶ大きいから。)
3. ここで2つの文字の組を考えて例外を除外していく。

①文字の高さの比が2を超えるもの。

文字の高さの比は2を超えることはない。これはマックスで大文字小文字だから (ex.Aとa)
② 2つの文字の間隔が文字の幅が広い方の3倍を超えたもの。
③候補同士の平均画素値(色)は比較があまりにも違うもの。

近い色であれば同じ文字構成要素とする。
4. これらのパラメータはテスト画像群でチューニングする。
5. ここで3の規則で2つの文字が組合わさったペアがたくさんできる。
6. 次にペアをチェーンでくっつけていく。
7. 最初は2文字のペアが一つのチェーンになっててそれがたくさんある。
8. チェーンを共有してる画素があれば同じチェーンとする。
9. 他につなげるチェーンがなくなれば終了

ここでチェーンとなっているものが文字列となる。以下は判定した例

swt

(a)の画像が(c)のswt画像に変換され(d)の赤枠の文字が抽出される。

このとき木の枝等は認識されない。

・感想
この方法はあくまでも英語向けの方法である。

英語はほとんどが一筆書きできることから同一コンポーネントはひとつの文字と判別できるが、漢字は異なる。漢字独自のチューニングが必要かもしれない。

また、日本語は明朝体など文字幅が一定でないフォントが存在するので、このほうほうがうまくいかないフォントがありそうだ。

The following two tabs change content below.
miyamoto
IoT/ DIY / music / 日本語ラップ
miyamoto

About miyamoto

IoT/ DIY / music / 日本語ラップ

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

Post Navigation