画像解析の課題

課題内容
 数字の1から9を認識するプログラムを書け!
(keyword : 画像解析の課題)  

目次

 もう時間が無い!三週間の課題時間を与えられましたが何もしていません。  取りあえず、あと2日しかない。 どうする私!
 ○JAVAのApplet上で文字を書けるようにする
 ○端を認識する
 ○リスト化する
 ○曲がっているところ。急な方向転換。ほぼ真直ぐを認識する。
 ○おのおののパターン表を記憶する 〜
 ○実際に動かしてみる 〜 いろいろ 試すとうまくいく事があります。
 ○提出案件      〜 私の限界です。とても眠いです
 ○感想        〜 嘆き
 ○詳細        〜 アルゴリズムの解説

 リファレンスは私の頭の中とJAVAドクでした

プログラムの中身

 
 Applet上でドラックしながらマウスを動かすことで数字を入力することが出来ます。
 
 書いた数字が 1から9までのどの数字であるかを、リストボックス上で指定したアト。
 "学習"と書かれたボタンを押すと、アプレット上に書かれた数字を覚えます。
 
 以後 "答える"ボタンを押すと、アプレット上に書かれた数字がどの数字であるかを
 返します。
 
 学習回数を増やせば増やすほど、頭が良くなります。
 
  (
 注意 4などの特殊な文字を除いて一筆書きで書かれることをお勧めします。
    一筆でかかれたと思われるところを青く変化するようになって降ります。
    出来る限り青く変化するようにしてください。
    学習の効率が上がります
	
 )
 (
  お知らせ
      下から書いても、 端っこに書いても 斜めから書いても関係ないように
      設計されています。
  )

○JAVAのApplet上で文字を書けるようにする

   文字を書くソフトを作成します。本プロセスは数値入力を
  効率かつ効果的に行うために作成しました。
   
   ペイントソフトのペンツールのようにマウスの軌跡を画面
  上に描画します。
   
   本プログラムはJavaを用いています。javaではMouseMotionListenerを用いて
  マウスが移動した時のマウスの位置を知ることが出来ます。
   しかし、MouseMotionListenerが返すタイミングでは、移動した軌跡を捉えることが
  出来ません。うまく文字を描くことが困難わけです。

   そこで、点と点の間に線をひき、間を保管することにしました。
       いろいろ考えられますが    私が用いた方法はArrayImageのdrawLineに書かれています。 あまり良くないですが    

○端を認識する


 
 文字の始まりと終りを認識します。
 数字の2の場合赤いまるでかかれたところを端と命名しました。

 
 
 

ここまでの成果
ソース
アプレット
実況
この課題を2日で終わらせることは不可能なのでしょうか。それとも可能なのでしょうか。
答えは可能です。難しい内容を含ませてはいないからです。
しかーし、日記を書いたり、ホ−ムページを編集したりと現実逃避している時点で怪しいかな。

○リスト化する


 端を認識することが出来るようになりましたので。
 端から端までの位置を記憶します。 
 
 そして、それらは、次の章ではベクトルの変化に応じて
 角張っている。曲がっている 。ほぼ真直ぐとうの
 パターン情報へと変換していきます。
 
( 交点の存在があるので、うまく位置をリスト化するにもベクトル情報必要になります・)

ベクトル情報の無いもの
  temp = nominateNext();
  if(temp == null){System.out.println("earch lost");return;}
  while(temp != null && temp.size()!= 0)
        {
             root.add(temp.get(0));
             temp = nominateNext();
           }
 
○ベクトルについて。
  
  点と点の間を密にとると、ベクトルの変化がはげしくなります。
  点と点の間はそこそこある方が良いというわけです。
  しかも。それは 大きさに依存します。
  かくして
  
  数字の大きさ * u となりますが、 数字の多きかさを無視したバージョンを
  今回は用います 。
  
  5点先くらいがベストかも知れません。
  

○リスト化する ○曲がっているところ。急な方向転換。ほぼ真直ぐを認識する。

 端が見を見つけることが出来ましたので、端から端までの
 移動ベクトルを取っていきます。
 
 急な変化があったときは角張っている。 少しずつなら曲がっている。 ほぼ変化が見られないのであれば真直ぐである。
 という感じ。
これまでの成果
これまでの成果
ソースなど

○おのおのパターンについて記憶する

 
 まずはリストの数を比較する。
 次はリストの曲がり具合を比較する
 次はリストの真っ直ぐの数を比較する 
 統計量から比較する

 という具合に 対象を絞る計算を繰り返す。
 残ったものを出力する。
 
作りかけ 

作りかけ 少しだけ学習する
作りかけ 角っているかどうかを調べる機能を追加
作りかけ 真直ぐ、曲がるを追加
提出用  角張っている数を調べる

○完成しませんでしたが

 


提出用 さらに、角張っているところからのベクトルのXORを追加

アプレットです。 JDK1.5対応です。 機能を確認できます
ソース

感想

 
 最終課題を見下しすぎていた。 もっと早くから手を伝いれば、
 3週間頂いて結局一夜漬けでした

 一夜漬けの限界を感じた最終課題でした。
 
  今はまだこの程度だけど 仕方がない。
  



アルゴレズム詳細解説

 



 
実際に行ったこて
  
  端を認識する
  ↓
    端から端までの位置情報を記録する
  ↓
  端から端までのベクトル情報を記録する
  ↓
  ベクトル情報から角度を計算する
  ↓
  角度から曲がっているのか、角張っているのか 真っ直ぐなのかを調べる
  ↓
  

  →学習ボタンを押される
   ↓
   端から端までのデータと どの数字かのデータを保存する
   ↓
   
  →答えるボタンを押すと
   ↓
   端の数が同じものをピックアップ
   ↓
   角張っている数が同じものをピックアップ
   ↓
   真っ直ぐかどうかをピックアップ
   ↓
   曲がっているかどうかをピックアップ
   ↓
   残ったもので数が多いものを残す
  
     
クラスの説明
  
  Mametan   :    端から端までの位置情報とベクトル情報を探索保持する
  Pattern     :    端を探す
   Data        :    Mametanと数字を関連ずけて保持する
    DataBase    :    Dataをたくさん保持する 検索したりする
  ArrayImage  :    画像を保持する
    ExeInput    :    プログラムの本体。
  
 
まあこの程度なですね 私は 納得しました。  
自己組織化マップを用いた学習
  
  時間があればまとめておこうとおもう
  

テレワークならECナビ Yahoo 楽天 LINEがデータ消費ゼロで月額500円〜!
無料ホームページ 無料のクレジットカード 海外格安航空券 海外旅行保険が無料! 海外ホテル