アクセスカウンタ

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

トップへ


田舎の優等生は自分が井の中の蛙であることを知れにょ

2013/05/18 18:13
 Aさんは田舎の1クラスしかない小さな学校の委員長だったにょ。
 ある日、クラスのBくんが宿題のプリントを忘れたといって騒ぎになったにょ。Bくんは最初からプリントなんて見てないと喚くけど、クラス一斉に配られてたのはみんな知ってるにょ。それどころか、Bくん自身がプリントをゴミ箱に捨ててたのを見た人がいたけど、Bくんは乱暴者なので怖くて指摘できないにょ。

 Aさんはその様子を見て「私が配り忘れたの。ごめんなさい」と言って謝り、先生からもう1枚プリントを貰ってきてBくんに渡したにょ。Bくんは宿題が嫌でプリントを捨てたのだけど、騒ぎが大きくなって自分の過ちを認めることが出来なくなってたので、助かったにょ。

 それを見ていた他の生徒や先生も、さすがは委員長だとAさんをほめたにょ。Aさんはそれ以来、何か揉め事があると、自分が悪かったと謝ることで解決するようになったにょ。田舎の小さな学校なので、そんなに新記憶な事件もなく、みんなAさんを信頼していたので、それで万事がうまくいってたにょ。

 やがてAさんは都会の大きな学校に転校したにょ。Aさんはこれまでの経験を活かそうと、その学校でも委員長になったけど、大きな学校なので他にもたくさんのクラスがあったにょ。
 ある日、同じクラスのCくんが別のクラスのDくんと揉め事になってたにょ。話を聞くと、Dくんは前日、買ったばかりの携帯電話を自習室に置き忘れたのだけど、今朝来たら携帯電話が壊れていたにょ。調べれば昨日、Dくんが帰った後で自習室を使ったのはCくんだけだから、携帯電話はCくんが壊したのだというにょ。

 Cくんは携帯電話なんか知らないと否定するけど、自習室には1人でいたのでそれを証言してくれる人はいないにょ。そもそもその学校では携帯電話を所持することは校則違反だったのだけど、それを守らない人も少なくなく、半ば先生たちも授業中にいじらないならと見て見ぬふりをしていたにょ。だからCくんが携帯を持ってきたのが悪いと言っても、誰もそのことでCくんの味方になってくれそうにはなかったにょ。それどころか、Cくんが自分の罪を逃れようと責任転嫁をしてるのだと言われるようになったにょ。

 Cくんは真面目で地味な生徒だったのに比べ、Dくんは有力者の息子で学校でも取り巻きを引き連れていて、どう見てもCくんには分が悪かったにょ。それでも身に覚えのないCくんは必死に潔白を訴えるけど、その声を聞いてくれる人はもうほとんどいなかったにょ。

 その様子を見たAさんはCくんに言ったにょ。
「あなたの言い分はわかるけど、とりあえずあなたが謝れば、この騒ぎは収まるわ。Dくんだって校則違反の携帯電話を弁償しろとまでは言わないわよ。ほとぼりが収まったら、みんなあなたが壊してないってわかってくれる」

 CくんはAさんの忠告にしたがって、身に覚えはないけどDくんの携帯電話を壊してしまったかもしれないと謝ったにょ。
 さすがにDくんもAさんの言ったとおり、校則違反で持ち込んだ携帯電話を弁償しろとまでは言わなかったけど、それ以来、その学校ではCくんはずっと犯罪者扱いされ、内申書にも「こっそり他人の物を壊す傾向がある」とまで書かれてしまい、志望校には進学できなく、その後の人生でも何かと過去の事件で責められることが続いたにょ。

 Aさんにはその後、いつまでも犯罪者扱いされてるCくんが何度か相談に来たけど、そのたびに「誠心誠意謝っていれば、そのうちみんなCくんのことをわかってくれる」と言い続けるだけだったにょ。
 やがてAさんとCくんは別々のクラスになって話をすることもなくなったけど、Aさんはこれで良い解決だったとずっと信じていたにょ。


 Aさんは謝れば何でもうまくいくと思ってたみたいだけど、それは田舎の小さな学校での些細な出来事ぐらいなら当てはまるのかは知らないけど、もっと深刻な出来事には通用しないなんて考えたことも無いんだろうにょ。
 結局、Aさんの言うことに従ったCくんは、それで人生を台無しにされてしまったのだけど、そのことを知ったらどう思うんだろうかにょ?
 Cくんはけっして身の覚えのないことで謝ったりはせず、最後まで身の潔白を訴え続けなければいけなかったのは確かだろうにょ。


 ……ということで、Aさんみたいな田舎の優等生がご団体さんではびこってる、この国の将来はどうなるのだろうかにょ?
 そりゃ、自分たちは優等生気取りで自己満足に浸れるのかもしれないけど、その代わりに他人だけでなく自分たちの祖先や子孫たちにまで汚名を被せてるだけだという自覚など、まったく無いんだろうにょ。
記事へブログ気持玉 / トラックバック / コメント


画像認証と遊ぼう! 第8回「文字で呪え編」

2013/05/16 11:42
 前回は数字の「0」の画像からOCR辞書を作成したところで終わったにょ。
 ここから今回は他の数字を登録していくにょ。

 「0」の時と同様に「1」の画像パターンを作成するにょ。

画像


 次に処理選択から「OCR辞書の追加登録」を選択するにょ。

画像

 パラメーターはこうにょ。

画像

 「処理画像ファイル名」のところには、追加登録先の辞書ファイルのファイル名を入力するにょ。
 「登録文字」は「1」なので「1」と設定するにょ。

 実行すれば、処理結果が「処理の成否」に出るにょ。

画像

 こうやって、残りの「2」〜「9」も登録していくにょ。


 OCR辞書が完成したら、登録内容をチェックしてみるにょ。

 処理選択から「OCR辞書の種類」を選択するにょ。

画像

 辞書のファイル名を指定して実行すれば、右下の「数値結果」のところに「数」と表示されるにょ。

 処理選択から「OCR辞書の登録数」を選択するにょ。

画像

 辞書のファイル名を指定して実行すれば、右下の「数値結果」のところに「10」と表示されるにょ。これが「10」じゃないと、何か登録漏れがあるか、余計に登録してることになるにょ。

 処理選択から「OCR辞書のフォーマット」を選択するにょ。

画像

 辞書のファイル名を指定して実行すれば、登録されてる文字パターンの画像フォーマット情報が表示されるにょ。
 「数値結果」に表示されるのはビットマップのピクセル深度にょ。ここでは画像処理の結果で作られた32bitARGBの画像が登録されてるので、「32」と表示されてるにょ。

 処理選択から「OCR辞書の名前」を選択するにょ。

画像

 辞書のファイル名を指定して実行すれば、右下の「数値結果」のところに新規登録時に設定した名前が表示されるにょ。

 処理選択から「OCR辞書のイメージ」を選択するにょ。

画像

 辞書のファイル名と何番目に登録されてるかのインデックス値を指定して実行すれば、登録されてる画像パターンが表示されるにょ。また、右下の「数値結果」にその画像パターンに対応する文字が表示されるにょ。
(見てわかるように、画像パターンはマッチング精度を上げるために登録時にサイズ領域いっぱいにパターンを拡大して登録されてるにょ)


 辞書の登録内容が確認できたら、いよいよ実際の文字認識を行うにょ。

 まず、前々回『読取革命Lite』で失敗した処理結果画像を読み込んでみるにょ。

画像


 処理選択から「OCR文字列認識」を選択するにょ。

画像

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

画像

 「処理画像ファイル名」のところには、作成した辞書ファイルを指定するにょ。

 「マッチング閾値」は、マッチング結果がこれ以上の場合はそれが正解だと判断して認識処理を終了する値をパーセントで指定するにょ。これに達するものがない場合はマッチング結果が一番大きかったものを正解とするにょ。
 当然ながら、値が小さいほど処理が軽いけど精度は低く、値が大きければ精度は高いけど認識に時間がかかるにょ。

 「回転単位角度」は傾いた文字を認識するために画像パターンを回転させる単位の角度だにょ。
 「回転ステップ数」は左右にそれぞれ何回まで回転させるかという数にょ。
 単位角度が小さくステップ数が多いほど精度の高いマッチングを行えるけど、処理に時間がかかるにょ。

 実行すれば右下の「数値結果」のところに認識結果が表示されるにょ。

画像

 ここでは正しく「6681」と認識されたにょ。

 ちなみにその前の回の処理結果画像にょ。

画像

 これも正しく「5946」と認識されたにょ。

画像

 ついでに前回「0」を取り出した画像にょ。

画像

 これも正しく「5054」と認識されたにょ。

画像


 このように画像処理ツールで最初からやるのは手間がかかるけど、このツールの開発に用いたライブラリを使って、前々回までの認証画像の加工処理と、この文字認識処理を一括して行うようなソフトを作れば、元の認証画像からダイレクトに文字認識結果を取り出すようなものを作ることも出来るにょ。

 試しにコンソールアプリで作ってみた例にょ。パラメータに未加工の元画像を与えるだけで、画面処理を行うことなく一連の画像加工や文字認識を内部で行い、結果だけを文字列として吐き出してるにょ。

画像


 ここで用いてる認識処理だと英数字以外の複雑な文字を十分扱えるまでにはなっていないけど、そのレベルの範囲内でいろいろと応用的に使うことも出来るだろうにょ。例えば英数字を独自の創作文字のフォントに置き換えて作った暗号文を翻訳するのに使ったりとか……

 とりあえず文字認識処理まで一通りやったので、反応も無いことだし、この連載は今回で終わることにするにょ。
記事へブログ気持玉 / トラックバック / コメント


画像認証と遊ぼう! 第7回「辞書で殴れ編」

2013/05/15 23:13
 前回は、文字のフォントデザインによっては活字OCRソフトとの相性でうまく認識できないものがあるというところで終わったにょ。

 そこで、今回は文字認識そのものを既製のOCRソフトを使わずに自分でやってみるというところにょ。とはいえ、市販のOCRソフトのように手間隙かけて高度な認識アルゴリズムを組み込んだりなんてことは出来ないので、ここではパターンマッチングを用いた簡易OCR機能を使うにょ。

 この方法で認識できるのは、文字のデザインが一定であり、十分に特徴的なものであり、英数字等の簡単な文字しか使われていないものだけにょ。前回、前々回と扱ってきた老舗ブログサイトの画像認証は基本的に数字のみで、文字デザインも1種類だけなので、十分にこの条件に見合ってるにょ。


 文字認識機能そのものは、これまで使ってきた画像処理の技術検証用ツールに組み込まれているので、ここではその機能で用いる文字認識のためのOCR辞書の作成を行なっていくにょ。

 件のサイトの画像認証では「0」〜「9」の数字がすべて用いられているので、この10個の数字の文字パターンを登録した辞書を作る必要があるにょ。
 登録の順番はどうでもいいのだけど、とりあえず「0」から始めるにょ。

 まず、「0」を含んだ画像認証の画像を用意するにょ。

画像

 これを前回、前々回で行ったのと同様の処理を行うと、こうなるにょ。

画像


 ここから「0」の画像だけを取り出すにょ。
 例によってPhotoshopとかペイント等を用いて手作業でやっても良いのだけど、それでは芸がないので、この画像処理ツールだけでやっていくにょ。
 最初に処理選択で「領域検出(カラーラベリング)」を選ぶにょ。

画像

 パラメータは検出対象の色が白か黒か選ぶだけにょ。

画像

 実行すれば、個々のパターンごとに色分けされるにょ。

画像

 この色分けは左側のパターンから順番に行われるにょ。


 次に処理選択で「画像選択(カラーラベル)」を選ぶにょ。

画像

 これは先に「領域検出(カラーラベリング)」を行った画像から、任意の画像を選択して取り出す処理にょ。

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

画像

 設定するのは、左から何番目のパターンを選択するのかと、選択したパターンを白か黒かどちらで塗り潰すかにょ。「白」を選択した場合は黒地に白の画像になるにょ。

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

画像

 選択した「0」のパターン以外が消え去った感じにょ。


 このままじゃバランスが悪くて落ち着かないので、「画像パターンの整頓処理」を行なっておくにょ。

画像


 次にこの「0」の傾きを直すにょ。
 処理選択で「画像の回転」を選ぶにょ。

画像

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

画像

 「回転角度」は自分で適当に感覚で見繕って設定するにょ。左方向が正、右方向が負にょ。
 「回転中心座標」は画像の左上を原点にした回転の中心座標。デフォルトでは画像全体の中心に設定されてるにょ。先に「画像パターンの整頓処理」を行った時に文字パターンはセンタリング処理が行われているので、基本的にはこのままでいいにょ。
 「補間画素を二値化する」は回転処理後にバイキュービック法による画素補間を行なっているので、中間色を廃して二値画像にしたい場合にチェックするにょ。当然ながら、元画像が二値画像以外だと意味が無いにょ。
 「背景色」は回転によって元画像に存在しない座標の画素が現れた場合、白と黒のどちらに塗り潰すかという設定。例えば横長の画像を90度回転させた場合、左右に来るのは存在しないはずの元画像の天辺より上だったり底辺より下だったりするので、それを何色にするかということにょ。

 実行すればこうにょ。

画像

 これで文字が直立したにょ。角度が間違ってた場合は「取消」を押せばやり直せるにょ。


 辞書に登録するパターンはサイズを統一しておく必要があるので、ここでは48×48のサイズにしておくにょ。
 ここでは画像全体の中央部の48×48の領域を「画像の切り出し」を用いて取り出してみるにょ。

画像


 これで辞書に登録する「0」のパターン画像が完成したので、辞書そのものを作成するにょ。他の数字は後から追加登録するにょ。

 処理選択から「OCR辞書の新規作成」を選択するにょ。

画像

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

画像

 「処理画像ファイル名」のところには、作成する辞書ファイルのファイル名を入力するにょ。拡張子は何でもいいけど、ここではオーソドックスに「dic」を使ってるにょ。
 「登録文字」は表示されてる画像パターンが意味する文字のことにょ。ここでは数字の「0」なので「0」と入力するにょ。
 「辞書の種類」は辞書が扱う文字種を区別するための数字にょ。ソースのライブラリを使って開発する場合は色々と使い道があるだろうけど、この画像処理ツール上では数字が「1」、英大文字が「2」、英小文字が「4」、記号が「8」ということにしてあるにょ。
 「辞書の名前」は複数の辞書を使い分けたりする場合の識別子にょ。別にファイル名と同じ必要はないにょ。
 「横幅」「高さ」は辞書に登録する画像のサイズにょ。表示されてる画像と合致しない場合は自動的に拡大縮小して登録されるにょ。

 実行すればまず警告のダイアログが出るので、OKを押すにょ。

画像

 結果は右下の処理結果のコーナーの「処理の成否」に出るにょ。「OK」なら無事に作成されたにょ。

画像


 長くなったので、続きは次回にょ。
記事へブログ気持玉 / トラックバック / コメント


画像認証と遊ぼう! 第6回「あの影を断て編」

2013/05/11 11:39
 ……ということで、前回の続きで同じ老舗ブログサイトの別の画像認証を読み込ませてみるにょ。

画像

 見た目には前回の画像と変わらないにょ。まずこれを前回同様に「統計フィルタリング処理(グレイ)」を使って、統計上位2つの領域を抽出するにょ。

画像


 これでどう違うかはっきりしたにょ。前回の画像とは文字と影の立場が入れ替わってるということにょ。つまり、ここの画像認証では文字の領域の大きさと影の領域の大きさの大小が一定でないということにょ。

 ま、こうやって人の目で見ながらやってると一目瞭然なんだけど、これをソフトだけで判断するにはそれなりの手段が必要だにょ。それはここでの目的では無いので割愛するけど、リクエストでもあれば記事に書いてもいいにょ。

 さて、この場合はどうやるかというのが今回の内容だにょ。

 まず、いま抽出した画像を使って、元の素材画像に「二値画像による論理マスク」の処理を実行するにょ。
 本来なら先に二値化しておくものだけど、例によって手抜きにょ。

画像


 ここでもう一度、「統計フィルタリング処理(グレイ)」を使って、統計上位2つの領域を抽出するにょ。

画像

 マスク処理によって最初の画像の上位3位以下の画素が全部白になり最大勢力になってるので、元々2位だった文字色の部分が3位に落ちて、そこだけ白くなってるにょ。

 これを「白黒反転」すればこうなるにょ。

画像


 後は前回同様に、「極小領域削除処理」で点々を除去するにょ。

画像

 そして「膨張処理」にょ。

画像

 最後に「画像パターンの整頓処理」で並べ直すにょ。

画像


 これをOCRに読み込ませればこうなるにょ。

画像

 ……ん? 「669 1」?
 全角スペースが入ってるのはともかく、「8」を「9」と認識されては失敗だにょ。

 実のところ、このブログサイトの画像処理の文字デザインとの相性か、「読取革命Lite」での認識成功率は高くないにょ。
 そこで、次回は「読取革命Lite」等のOCRソフトを使わずに文字認識を行なってみる予定にょ。
記事へブログ気持玉 / トラックバック / コメント


画像認証と遊ぼう! 第5回「網を掻い潜れ編」

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

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

画像

 これは、とある老舗のブログサイトで使われてる画像認証の画像だにょ。
 これをこのままPanasonic製OCRソフト「読取革命Lite」に読み込ませてみるにょ。

画像

 当然ながら文字認識以前に対象の文字画像を認識できていないにょ。
(上と画像形式が異なってるのは、「読取革命Lite」ではGIF画像を読めないので変換してるだけにょ)


 ま、何から手を付けようかという素材なんだけど、一見してこのまま二値化しても意味ないことはわかるだろうにょ。色の配分によってはうまくピンポイントで閾値を見つけ出せれば奇跡的に数字が取り出せるかもしれないけど、ここの画像認証一般には使えないにょ。
 取り除く必用があるのは、網目のような背景と、散らばってる点々、それに数字の影の部分だにょ。

 ここの画像認証をいくつか見てみて気付くのは、数字の色と影の色と網目の目の部分の色は、画像によって色は違うけど、それぞれ一色で統一されてるってことにょ。網目の網はグラデーションだし、点々は色がまばらで数もそんなに多くないにょ。したがって、画像上の画素値を調べれば、数字の色と影の色と網目の目の部分の色がその他の部分の色より圧倒的に多く使われてるってことだにょ。

 処理選択から「統計フィルタリング処理(グレイ)」を選ぶにょ。

画像

 これは画像をグレイスケール化した上で画素統計を取り、条件に合わない画素を除去する処理にょ。
 パラメータを設定するにょ。

画像

 「抽出するパターン数」は統計結果から上位何個の画素領域を残すかということにょ。どうみても最大は背景の網目の目の部分になり、文字と影のいずれかが2番目と3番目になるので、それを切り分けるために2番目まで残すことにするにょ。
 「横幅の上限/下限」「高さの上限/下限」は抽出対象の画素領域の大きさだにょ。デフォルトでは上限値が画像サイズの半分になってるので、これだと網目も文字も引っ掛からないから画像サイズいっぱいに広げておくにょ。

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

画像

 右下の数値結果の部分に抽出した画素パターンの個数が出るにょ。統計結果で得られた数が設定した抽出数に足りない場合は、その数が表示されるにょ。
 これで網目の目の部分と文字の影の部分が抽出されたにょ。


 これを文字部分の抽出用のマスキングに用いるために「白黒反転」をしておくにょ。

画像

 ま、本来なら先に二値化しておく必要があるけど、白の部分以外は黒と勝手に判断してくれるので、手を抜いてるにょ。

 反転した画像は一旦保存しておくにょ。


 今度は文字部分まで含めた部分を抽出するために、素材の画像に再び「統計フィルタリング処理(グレイ)」を実行するにょ。
 今度は文字部分も含めるから「抽出するパターン数」は3個にょ。

 実行すればこうにょ。

画像


 次に処理選択から「二値画像による論理マスク」を選択するにょ。

画像

 パラメータにはさっき保存した反転画像を指定するにょ。

画像

 実行すればこうにょ。

画像

 とりあえず二値化するにょ。

画像


 うまく文字の部分が抽出出来たけど、文字と同じ画素値だった点々が残ってるので、これを除去するにょ。

 以前の回では「縮小処理」を使って背景のゴミを取ったけど、今回の文字には細い部分があるので縮小した場合に文字が切れる恐れがあるにょ。
 そこで今回は「極小領域削除処理」を用いるにょ。

画像

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

画像

 これは「削除領域の輪郭線長」で指定した長さ以下の輪郭線の長さをもつパターンをすべて削除する処理にょ。
 実行すればこうなるにょ。

画像


 このままだと文字が細くて心許ないので「膨張処理」で膨らませておくにょ。

画像


 最後に、文字の配置が乱れているので「画像パターンの整頓処理」で整頓しておくにょ。

画像

 パラメータは「パターン図形の色」だけにょ。

画像

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

画像


 これをOCRに読み込ませればこうなるにょ。

画像

 数字が全角だったり、1000の区切りでコンマが入ったりするのは気持ち悪いので、前回同様に認識対象を「数字」「半角」にしてから読み込ませるにょ。

画像


 こんな感じで、この画像認証も無事に読むことができたにょ。

 ……と終わりたいところだけど、ここの画像認証には見た目は同じような画像なのに、上記方法では解決できないものがあるので、次回はそれについて書いてみるにょ。

(などとたいそうに書いてるけど、どういう場合に読めないかというのは記事をきちんと読んだら想像がつくかと思うにょ)
記事へブログ気持玉 / トラックバック / コメント


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

トップへ

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