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

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

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

最近社内で 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入門者にも簡単な方法ですので、ぜひ試してみてください。

IntelliJ IDEAでsnippetを活用する

※この記事はAltPlus Advent Calendar 2016の25日目の記事です。 こんにちは、開発部のコイです。オルトプラスに働いています。 IntelliJ IDEAでのsnippetを活用する方法を紹介します。

背景

繰り返し同じコードパターンを書いたら、時間がかかっているので、どのように解決できるかを探してみて、snippet活用の方法を見つけました。 最近チームでIntelliJ IDEAで使っているので、IntelliJ IDEAでの方法を紹介します。

snippetとは

snippet(英語: snippet)とは、「断片」という意味である。情報処理の分野ではよく使う短いプログラムコードを統合開発環境から呼び出す機能の事である。 また、呼び出される短いコードの事をsnippetと呼ぶ場合もある。ja.wikipedia.org

言い換えれば、snippetはテンプレートコードに似ている。コードテンプレート化して、そのあと再利用できるものです。 mainとif/elseなどのsnippetを用意してくれるEditorが多いと思います。

またEditorでは任意でsnippetを登録することができます。 開発中にsnippetを登録して、どんどん増えていくと開発速度が上がるのではないでしょうか?

ItenlliJ IDEAでsnippetを活用する

登録してみる

例:仮に下記のパターンを繰り返し書かないとき、snippetを登録してみます。

for (var i = 0, l = users.length; i < l; i++) {
    var v = users[i];
    // some code here
}

for (var i = 0, l = books.length; i < l; i++) {
    var v = books[i];
    // some code here
}

https://www.jetbrains.com/help/idea/2016.3/creating-and-editing-live-templates.html

登録できたら下記のように使えるようになります。 js-forのsnippetです。 for.gif

snippetを共有する方法

snippetを共有する方法は2つあります。

  • SnippetをExportする
  • Snippetを手動でコピーする

参考:https://www.jetbrains.com/help/idea/2016.3/sharing-live-templates.html

Vim-snippetsをIntelliJ IDEAのフォマットに変換する

Vim-snippetsのCommuinityが強いので、たくさん良いSnippetが用意されています。 なので、Vim-snippetsをIntelliJ IDEAsnippet化してみました。 下記の例を御覧ください。

  • jq-ajaxのsnippet

ajax.gif

  • bootstrapのsnippet

bootstrap.gif

詳しい使い方はこれを見intellij-snippetsてください。

まとめ

自分で開発するときに、自分のsnippetをもっと活用してみてください!

GWT を使ってみて感じたこと

※この記事は「AltPlus Advent Calendar 2016」の24日目の記事です。

こんにちは、オルトプラスのミーです。
日本語を勉強中です。わかりにくいところがあるかもしれませんが、よろしくお願いします。

今日は「Google Web Toolkit (以下、GWT)」というフレームワークについて書こうと思います。

大学時代にGWTを半年ほど使っていました。詳しくはわかりませんが、使ってみた感想を書きます。

https://qiita-image-store.s3.amazonaws.com/0/147307/e0cce5df-4655-7377-e24e-c4648170e244.jpeg

GWTとは

http://www.gwtproject.org/overview.html

GWT is a development toolkit for building and optimizing complex browser-based applications. Its goal is to enable productive development of high-performance web applications without the developer having to be an expert in browser quirks, XMLHttpRequest, and JavaScript. GWT is used by many products at Google, including AdWords, AdSense, Flights, Hotel Finder, Offers, Wallet, Blogger. It’s open source, completely free, and used by thousands of developers around the world.

詳細は上記ページを参考にしていただければわかると思いますが、簡単に言うとJavaを使って、あまりウェブサイトの開発知識がなくても(Javascriptとか)、ウェブサイトを作れるようにサポートしてくれるフレームワークです。

 

GWTを使う理由は何ですか?

自分の考えですが、以下の理由があります。

1. Javaでウェブ開発してみたい

自分のイメージですが、簡単なウェブページを開発する場合、PHPのようなオブジェクト指向的でない書き方のできる言語を使っても大丈夫です。リクエストを受けてページを返すのに十分で、オブジェクトをあまり導入しなくてもいいかもしれません。

私は大学時代にはウェブ開発より、ミニゲームの開発をする機会が多くありました。ミニゲームの世界では、何でもオブジェクトなので、オブジェクト指向言語のJavaを使っていました。それを基にしてウェブ開発する時にもJavaでしてみたかったのです。ウェブはミニゲームのように、なんでもオブジェクト化できれば面白いなと思いました。

 

2. Googleのプロダクトと連携しやすい

https://qiita-image-store.s3.amazonaws.com/0/147307/69980abf-12e1-267f-8051-f1b7a3b73e97.jpeg

https://cloud.google.com/appengine/docs?hl=ja

GWTの開発言語はJavaなので、開発アプリはJavaを使ういろいろなGoogleのプロダクトを導入しやすいと思います。
大学時代の自分のプロジェクトではGoogle App Engineを使いました。
Googleのプロダクトを使ってアプリを開発したい場合、Google Mapsによる地図アプリ開発などはGWTを使うといいかもしれません。


次に、GWTを使ってみたいと思っている方は、以下のところに気をつけてください。

  • プログラマー入門の人にとってちょっと学びにくい

一つ目の理由は、GWTはJavaを使っています。Javaのsyntaxルールは少なくなくて、GWTもそのルールを守らないといけません。サーバーとクライアントでやり取りするデータのタイプを定義しないといけません。具体的にタイプ定義するとコードがわかりやすくなりますが、プログラマー入門の人にとって、ページを表示できるようになるまで普通より手間がかかるかもしれません。

2つ目の理由は、開発ツールが複雑ということです。Javaの開発では、重い開発環境のEclipseなどを使わないといけないでしょう。LaravelとPHPなら、エディタのsublime, atomなら軽くてよいと思います。入門者にとって、普通より開発環境を理解する時間がかかると思います。

 

  • サポートコミュニティーがまだ多くない

開発していた時に、デバッグや困る時にGoogleで検索してみましたが、結果の件数がまだちょっと少ないと思いました。

 

おわりに

GWTを使ってみて感じたことは以上になります。
次回は大学時代にミニゲーム開発で使っていたフレームワークの「Libgdx」を紹介したいと思います。