細線化された円、多角形、線分を認識するアルゴリズムを開発しました。
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プログラミングブック制作チーム著(毎日コミュニケーションズ)
By t-asami •
Java •