アクセスカウンタ

<<  2013年4月のブログ記事  >>  zoom RSS

トップへ


画像認証と遊ぼう! 第4回「しがらみを切り離せ編」

2013/04/29 21:49
 今回は前回の処理の続きだにょ。

画像

 前回はここまでやってみたけど、この段階では文字が繋がったりしてるので(この画像では比較的ちゃんと読めてるけど)OCRでは誤認識しやすいところにょ。
 そこで、今回はこれを切り離してみようと思うにょ。

 もちろん、ペイント等を使って手作業でバラせばそれはそれで良いのだけど、ここでは論理的に文字図形の構造と戦うのが目的なので、画像処理技術を用いた手順で行うにょ。

 まず、連結箇所を小さくするため、「収縮処理」を行うにょ。

 今回のパラメータはこんな感じ。何ステップも繰り返すほど収縮はしないけど、最大限に痩せさせる設定だにょ。

画像

 実行すればこうなるにょ。当然ながら、これくらいで連結が無くなったりはしないにょ。

画像


 ここから文字要素の骨組みだけを抽出するために「細線化処理」を行うにょ。

画像

 パラメータはこうにょ。

画像

 実行すればこうなるにょ。文字の連結部分が横線になってるにょ。

画像


 文字要素としてはヒゲのように突き出てる部分が不要なので、「細線先端の短縮処理」を使って除去するにょ。

画像

 パラメータとしてはこんなところにょ。あまり大きな値を入れると、本来の文字の先端部分までごっそりと削られてしまうにょ。

画像

 実行すればこうなるにょ。

画像


 連結部分の横線を除去するために「孤立水平線の削除処理」を使うにょ。

画像

 これは、横方向に一本しか線が伸びてないものは文字の要素としては不要なので除去しようというものにょ。対象が数字の時にしか使えないにょ。
 パラメータはこうにょ。

画像

 実行すればこうなるにょ。文字の連結部分がうまく切れたにょ。

画像

 連結部分の残滓がヒゲのように残ってるので、もう一度「細線先端の短縮処理」を行なっておくにょ。

画像


 このままだと文字の並びがチグハグなので、「連結パターンの分割処理」を行なって整頓するにょ。

画像

 これは画像パターンを与えられた個数に分割し、分割した個々のパターンを並べ直すという処理にょ。あらかじめ個数分に分割されてるものはその分割を利用するけど、分割されてないパターンは、強制的に等間隔で分割してしまうものにょ。

 パラメータは、分割個数とパターンの色にょ。

画像

 実行すればこのようにきれいに並ぶにょ。

画像


 相手が手書き文字を認識できるようなOCRならこのままでもいいけど、活字OCRだと線文字のままでは心許ないので、「膨張処理」を使って肉付けするにょ。

画像

 実行すればこうなるにょ。OCRがゴシック体に対応していたら、このくらいで大丈夫だろうかにょ。

画像

 これをOCRに掛けるとこうなるにょ。

画像

 相変わらず先頭の「7」は「ア」になってるけど、似たような字体の文字がある場合は日本語文字を優先するというのは、日本語OCRのデフォルトの動作としては仕方がないかにょ。
 ちなみに真ん中は英字の「O」のように見えるけど、ちゃんと数字の「0」になってるにょ。

 しかたがないので「読取革命Lite」の設定で認識対象を「数字」「半角文字」に指定して読み込ませてみるにょ。

画像

 このように文字種を指定すればきちんと半角数字で認識してくれるにょ。

記事へブログ気持玉 / トラックバック / コメント


画像認証と遊ぼう! 第3回「傾きを正せ編」

2013/04/28 19:52
 この連載で用いている画像処理の技術検証用ツールはメインサイトの方に置いてあるので、自分でも試してみたいという人はこちらからダウンロードしてくれにょ。

 今回の画像を読み込んで見るにょ。

画像

 これは、とある携帯用掲示板サイトで使われてる画像認証の画像だにょ。
 これをこのままPanasonic製OCRソフト「読取革命Lite」に読み込ませてみるにょ。文字認識以前に対象の文字画像を認識できていないにょ。

画像


 まず、このままだと画像処理の途中で文字イメージが潰れる恐れがあるので、最初に拡大しておくにょ。処理選択で「画像の拡大縮小」を選ぶにょ。

画像

 パラメータを設定するにょ。

画像

 水平方向、垂直方向の拡大率を設定するにょ。言うまでもなく1.0より大きければ拡大され、小さければ縮小されるにょ。ここでは縦横ともに4倍に拡大するにょ。「補間画素を二値化する」というのは二値画像を拡大縮小した場合、補間処理で中間色が割り当てられる画素を二値化するというオプションにょ。今は二値化画像でもないのでオプションは外しておくにょ。
 ちなみに画素補間は(この機能に限らず全般的に)バイキュービック法で行ってるにょ。ソースにはバイリニア法の処理も入ってるけど、いちいちパラメータで選択するとかも煩雑になるので、バイキュービック法で固定してるにょ。

 拡大すればこうなるにょ。

画像


 例によってこれを二値化するにょ。前回使った「分析判別法」の方が楽だし、それで二値化出来ないわけではないけど、今回の画像では閾値の微妙な違いで二値化後の文字の形状が変動するので、ここは「固定閾値」で行うにょ。

画像

 画像のオレンジの部分の輝度値(Y値)が130なので、ここでは閾値として160を設定するにょ。

 実行すればこうなるにょ。

画像


 一般の文字画像とは白黒が逆転してるので、「白黒反転」で反転するにょ。

画像

 パラメータは以下のとおりにょ。

画像

 ここで自動判定のオプションがあるのは、画像上の白黒それぞれの画素の割合から反転の必要性を判定して反転処理を行うというものにょ。今は判別の必要なく無条件に反転したいので、このオプションは外しておいて構わないにょ。
 自動判定を行う場合は、目的とする本来の文字色である黒を指定しておくにょ。ここが白になってると反転処理は行われないにょ。

 実行するとこうなるにょ。

画像

 これをOCRに掛けてみるにょ。

画像

 これではまだ文字認識出来ないにょ。


 どうもOCRソフトでは文字列の画像ではなく、単に斜めに傾いた画像パターンとしか認識されてない様子にょ。
 そこで、この画像の傾きを直すにょ。

 処理選択で「画像パターンの水平化処理」を選ぶにょ。

画像

 パラメータは水平化する図形色の選択にょ。こういう白か黒かという選択のある処理は処理対象として二値化画像を前提にしてるにょ。

画像

 実行すればこうなるにょ。

画像

 これをOCRに掛けてみるにょ。

画像

 どうにか文字認識されるようにはなったけど、先頭の「7」が「ア」になってたりするにょ。

 この段階では文字画像が繋がってたりして、OCRには過酷かと思えるので、次回はここからもう少し処理を進めてみるにょ。
記事へブログ気持玉 / トラックバック / コメント


画像認証と遊ぼう! 第2回「邪魔者の始末編」

2013/04/25 14:51
 今回から実践編にょ。

 この連載で用いている画像処理の技術検証用ツールはメインサイトの方に置いてあるので、自分でも試してみたいという人はこちらからダウンロードしてくれにょ。
 ただし、使用説明とかは無いから、この連載記事がその代わりだと考えるにょ。もっとも、ここでは使わない機能とかもいっぱいあるとは思うけどにょ。

 今回の画像を読み込んで見るにょ。

画像

 これは、とある大手プロバイダの運営するブログサイトで使われてる画像認証の画像だにょ。
 ま、これをこのまま前回と同じPanasonic製OCRソフト「読取革命Lite」に読み込ませてみるにょ。人目にはどう読んだらこういう結果になるのだろうかというところだけど、そこが画像認証の存在意義なのだから仕方がないにょ。

画像


 まず最初に前回やった「二値化処理(分析判別法)」を行なっておくにょ。

画像

 ま、今回は二値化しただけでちゃんとOCRで読めたりなんかはしないにょ。

画像


 ここで目立つのは画像に付いてる外枠なので、これを取っ払ってみるにょ。こんなものはペイントなりその他の画像編集ソフトでも構わないけど、いちいちソフト間でデータのやり取りとかするのも面倒なので、ここではこのツールに付いてる「画像の切り出し」機能を使うにょ。
 これは表示されてる画像から一部を切り出す機能にょ。

画像

 処理選択で「画像の切り出し」を選んだらパラメータを設定するにょ。デフォルトでは表示画像をそのまま切り出すような値が設定されてるにょ。

画像

 ここでは除去する外枠は幅1ドットなので、これ以外の領域を切り出すように領域の始点(左端と上端)とサイズ(横幅と高さ)を指定するにょ。また、処理の前後で画像のサイズや文字の表示位置が変わらないように、枠の部分を余白に置き換えるように、左右及び上下の余白を1ドットずつ入れておくにょ。

 実行すれば外枠が取れてこんな感じになるにょ。

画像

 これをOCRに読み込ませてみても、まだダメだにょ。

画像


 こうなると問題なのは文字の周囲に散らばってるゴミのような小さな点々だにょ。こういう細かいものを除去する方法はいくつかあるけど、文字の大きさが十分に大きいので、「収縮処理」で除去することにするにょ。

画像

 パラメータは2つ設定するにょ。

画像

 処理ステップ数は処理を何回繰り返すかの値。点々は小さいのでそんなに収縮を繰り返す必要はないから、ここは1回で十分にょ。周辺画素数の閾値というのは、画像上のある黒い画素(ドット)に対して、その周囲8画素のうちの何個が白なら白に変えるかという値にょ。値が小さいほど画像は急激にやせ細るにょ。

 実行すればこんな感じで点々が消えるにょ。

画像


 これで十分な感じもするけど、文字によっては収縮によってバランスが変化してしまうことがあるので、今度は「膨張処理」によって元に戻すにょ。

画像

 パラメータは同様にょ。実のところ「収縮処理」と「膨張処理」は黒の画素を白に変える処理か、逆に白の画素を黒に変える処理かの違いにすぎないにょ。

画像

 実行すればこんな感じにょ。

画像


 もっとも、収縮した画像を膨張させても完全に元に戻るわけじゃなく、文字の幅やバランスが戻る程度という感じにょ。
 そこで、もう少し元の画像に近付けるために、「収縮処理」を行う前の画像と画素ごとの論理積をとって、「膨張処理」で太りすぎた部分を排除しておくにょ。

画像

 パラメータとしては「収縮処理」の前の画像ファイル(もちろん、事前に保存しておくことが必要)と、論理処理の開始位置、論理処理の対象色にょ。今は元の画像も論理積を掛ける画像も同じ大きさで、文字の位置も同じなので、始点は(0, 0)のままでいいにょ。処理対象である文字は黒なので、対象色は黒だにょ。

画像

 結果はこんな感じにょ。「収縮処理」で痩せすぎた部分までは戻らないけど、大体は元の雰囲気に戻ってるかにょ。

画像

 これをOCRで読み込んでみるとこんな感じにょ。

画像

 「9」だけ全角だったりはするけど、ちゃんと文字が認識されるようになってるにょ。

 今回はここまでにょ。
 これくらいまでなら一般的な定番の画像処理技術で何とかなったりはしてるのだけど、もっと頭を使わないとなんともならない画像認証は多いにょ。そんなものもボチボチと扱っていく予定にょ。
記事へブログ気持玉 / トラックバック / コメント


画像認証と遊ぼう! 第1回「灰色の基礎編」

2013/04/17 22:11
 まずは画像認証の料理に用いるソフトにょ。「Visual C++ 2008 Express Edition」を用いて作った画像処理の技術検証用のツールだにょ。画像処理そのものは機能グループごとにクラスモジュール化されていて、それをフォームアプリのGUIから呼び出して処理結果の表示等を行ってるにょ。

 開発及び動作確認はWindows XPの32bit環境で行ってるにょ。この検証用ツールの実行ファイルはあすかの個人サイトからダウンロードできるので、興味ある人は記事の確認などを行なってくれにょ。
(個人サイトのサイドメニューの「あすか研究所」に本連載の記事一覧と画像ツールのダウンロードがあるにょ)

 ただし、ソースファイルは無償では配布しないので、欲しい人があれば実行ファイルのアーカイブに同梱のテキストを参照に申し込んでくれにょ。

画像


 ということで、普通に起動させた画面にょ。動作には.NET Framework 3.5SP1の環境が必要だにょ。ま、普通にWindows Updateとかしてたら入ってると思うけど、入ってない場合は各自でインストールしてくれにょ。
 このツール自体はインストール不要なので、アーカイブを解凍してエクスプローラからクリックするなりして起動してみてくれにょ。実行ファイル名が「Test.exe」とかいうのは、わざわざ名前を考える程のものではないからだけど、他と紛らわしいとかいう場合は好きにリネームでもしてくれにょ。

 さて、今回の画像認証ネタの画像を読み込むにょ。

画像


 一番上のテキストボックスにフルパスのファイル名を入力するか、その右の「参照」ボタンを押してファイルダイアログを開いてファイルを指定するかしてから、「表示」というボタンを押せば、目的の画像が読み込まれて表示されるにょ。
 あるいは、エクスプローラ等から直接ファイルをドラッグ&ドロップで検証用ツールのウインドウ内に放り込んでも同じにょ。

 画像を読み込んだらその右の方にいろいろと情報が表示されるけど、「Width」が横幅のドット数、「Height」が高さのドット数という他は、.NET Framework を用いた画像プログラミングに有用な情報というだけで、プログラミングとかしないなら気にしなくていいにょ。

 表示された画像上でマウスを左クリックすると、右側の「PixcelColor」の枠内にそのドットのピクセル値が表示されるにょ。
 今回読み込んだのは明暗の2階調のグレー画像だけど、図で表示されてるのは文字の部分の濃いグレーの値にょ。デフォルトでは「RGB」で表示されてて、グレーだから各成分の値は同じになってるにょ。

画像


 画像処理を行う場合はRGB値よりも輝度値を知りたい場合が多いので、そういう場合はラジオボタンの「YUV」を選択すると、3つの値の左端に256階調の輝度値(Y)が表示されるにょ。

画像


 同様に文字以外の薄いグレーの部分をクリックした時の値にょ。

画像


 ここでグレーの画像を、OCRで読みやすい白黒のくっきりした画像に変換するために二値化の処理を行うにょ。ここでは画像表示部分の下にある処理選択のコンボボックス(ドロップダウンリスト)から「二値化(固定閾値)」を選択するにょ。

画像


 そして入力パラメータとして閾値を設定するにょ。ここではデフォルト値のままだけど、上で見た明暗2箇所の輝度値の間の値なら何でもいいにょ。

画像


 それから「実行」ボタンを押せば、くっきりとした二値化画像に変換されるにょ。

画像


 変換結果の画像は画像形式を選択して「保存」ボタンを押せば、保存用のファイルダイアログを開いて保存することが出来るにょ。

画像


 上では「二値化(固定閾値)」の処理を用いて自分で閾値を指定して二値化したけど、例のような明暗の明確な画像なら「二値化(判別分析法)」を用いれば、パラメータの設定をしなくても自動的に閾値を判断して処理することが出来るにょ。

画像


 変換した結果をOCRで読ませてみるにょ。使っているのはCanonのプリンタ複合機に付属していた「読取革命Lite」とかいうPanasonic製のソフトにょ。「4」だけ半角で後が全角だとか、文字間にスペースが入ってるという細かいとこを除けば、こんなところかにょ。

画像


 もっとも、今回のような明暗の明確な画像だとこのOCRソフトでもちゃんと読めたりするので、わざわざ二値化処理を行ったりする必要がなかったりするにょ。

画像


 今回は基礎編ということで極簡単なものを扱ってみたけど、次回からは実践編で、そのままではOCRソフトが読み取れないような画像を扱うことにするにょ。

記事へブログ気持玉 / トラックバック / コメント


画像認証と遊ぼう! 第0回「プロローグ」

2013/04/17 21:37
 画像処理というのはいろいろなところで使われていて、指紋や網膜を使った生体認証とか、あるいは一眼レフカメラで人の顔に自動的にフォーカスを合わせるとか、あるいは笑顔の瞬間に自動的にシャッターを切るとか、あるいは自動車が接近物を自動検知したりとか、昨今は高度なものが実用化されたりしてるにょ。

 ま、そんな高度なものじゃなくても、デジカメで取った写真を漫画風のベタ絵に変換したり、歪んで撮影した書類をきちんとまっすぐに補正したりとかいうようなスマホのアプリでやってる程度のものは、実はそんな技術的に大したことやってる訳じゃなくて、アイデアもののレベルだったりするけど、そんなふうに日常的に欠かせない技術になってるものだにょ。

 さて、ウェブサイトの登録ページとかに使われてる画像認証というのは、ソフトが自動アクセスして機械的に登録するのを避け、人間がちゃんとその手で登録するようにさせるというのを目的にしているにょ。
 初期のものは単純に「画像に書かれた文字ならソフトが自動的に読めたりはしないだろう」ってだけのものだったのだけど、OCR技術の発達で、単純に文字を画像化しただけなら簡単に読み取れるようになってしまったにょ。そこで現在の画像認証は単にOCRのソフトを通しただけじゃ読み取れないというのを目指してるにょ。
 もっとも、そこはそのサイト登録の重要さとか、運営者の思想によって様々だったりするにょ。

 ここではそんな画像認証を画像処理を使って読み取れるようにしてみようという暇潰しの不定期連載企画だにょ。
 とは言え、技術的にどんな画像認証でも読めるってわけじゃないので、そのへんは勘弁して欲しいにょ。

 この連載では基本的に文字の読み取りそのものは既成のOCRソフトを利用するのを前提で、画像認証の文字をOCRで読める形にしてみることを目標とするけど、OCRソフトも得手不得手があったりするから、独自の簡易OCRを用いる場合もあるにょ。

 次回からは独自の画像処理の技術検証用ツールを用いて、画像認証の料理の仕方を紹介していくにょ。
記事へブログ気持玉 / トラックバック / コメント


<<  2013年4月のブログ記事  >> 

トップへ

TweetsWind
結城あすかの毎日電波思考 (あすか日記) 2013年4月のブログ記事/BIGLOBEウェブリブログ
文字サイズ:       閉じる