Java

[J-4] マージャン牌の認識(2)

前回の投稿で使った認識方法は単純であまりうまく行かなかったので、筒子(ピンズ)と索子(ソウズ)について、円と長方形に分解して、詳しく分析する方法を研究しました。画像を2値化して取り出したとき、円や長方形がひっついてしまう現象が起こります。これを手動で横2つ割、縦2つ割、横3つ割、斜め3つ割、4つ割、5つ割、8つ割などに分割します。その後、膨張・伸縮を繰り返し、図形の隙間をなくしてから、輪郭を取り出し、基本図形の認識を行います。 Javaソースプログラムのダウンロードはここをクリックしてください
そのまま認識できた例

そのまま認識できた例

縦2つ割の例

縦2つ割の例

横2つ割、4つ割の例

横2つ割、4つ割の例

[J-3] マージャン牌の認識(1)

一列に並んだ13枚のマージャン牌を認識するテストシステムを開発しました。
  1. 画像の選択
  2. 牌の切り出し(牌のサイズの割り出し)
  3. 画像の減色化(黒、緑、赤、白)
  4. 牌のリサイズ(標準牌を認識したい牌のサイズに合わせる)
  5. 認識率の計算(認識率は、牌と認識する牌のサイズをそろえて、画素の色を2値化し、同じ位置に同じ色がある画素の個数を全体の画素数で割った値をとする)
  6. 牌の認識(一番認識率が高い牌を第1候補とする)
牌の陰や角度によって、誤って認識される場合が大きく左右されることが分かりました。 Javaソースプログラムのダウンロードはここをクリックしてください
成功例

成功例

失敗例
失敗例

[J-2] 基本図形の認識

細線化された円、多角形、線分を認識するアルゴリズムを開発しました。 A.図形の点列 (1)画像データを2値化します。(0は背景、―1は図形のピクセル) (2)左から右に、上から下に走査して、最初の0でない点A(ピクセル)を見つけ, その点に図形のIDをつけます(IDは同じ図形では同じ自然数とします) (3)点Aから8方向をサーチしてつながっている次の点Bをみつけ、その点にIDを つけます。(すでにIDのついている点は除外します) (4)(3)を次の点がなくなるまで繰り返します。 (5)点列がただ1つのときは孤立した「点」を表します。 B.図形の重心と円 (1)図形の重心の座標Gを求め、さらにGとそれぞれの点Pとの距離dを計算します。 (2)dの平均d_aveと標準偏差d_stdを求め、比率rate=d_std/d_aveを計算します。 (3)rateが小さいほど円に近いので一定の値(ここでは0.05とした)以下であれば「円」 と認識します。この場合、「円」の中心の座標はG、半径はd_aveとします。 C.多角形 (1)「円」でないと認識した場合、「多角形」か「線分」ですが、その頂点はdが 極大となる点なので、極大点を見つけるには、連続する3点の重心の距離を d1、d2、d3とすると、d1<d2dかつd2>d3となる点を捜せばよろしい。 (2)(1)で見つけた点は図形がデジタルのため、頂点とならない場合があるので、 (1)で見つけた連続する2つの極大点を結び、16方向のベクトルに分類します。 (3)(2)の方向ベクトルで同じ方向が連続する場合は1つの方向とみなします。 (4)(3)で得られた異なる方向ベクトルの数が多角形の辺の数となります。 (5)点列が閉じている(最初の点と最後の点がつながっている)か調べて、閉じて いれば多角形、そうでなければ、折れ線です。また方向ベクトルが1つの場合 は線分です。 D.図形の記述 (1)図形の重心Gの位置により、左上、上、右上、左、中央、右、左下、下、右下の 9通りに分類します。 (2)d_aveの大きさにより、図形を大、中、小に分類します。 (3)(1)(2)で得られた情報をもとにして、どんな大きさの図形がどこにあるかを 文章で表現し、出力します。 Javaソースプログラムのダウンロードはここをクリックしてください 参考文献 (1)「ディジタル画像処理入門」 酒井 幸市著(コロナ社) (2)「OpenCVプログラミングブック第2版」 奈良先端科学技術大学院大学 OpenCVプログラミングブック制作チーム著(毎日コミュニケーションズ)
7個の円

7個の円

6個の基本図形
6個の基本図形
10個の基本図形
10個の基本図形