【Lua】ラベリング処理の補正処理でハマる……泣【アルゴリズム】

20170228053055

ラベリング処理のルックアップテーブル(LookUp Table)の処理にハマる……。ちなみにハマるとはいっても、熱中の意味ではなくドツボのほう。まあ、どうにかしようと時間を費やしているのだから熱中という意味も多少はあるかもしれない。

しかし、簡単な?画像のラベリングまではできたのだけど、複雑な実写等になると、単純な処理しかさせていないためにルックアップテーブルによる補正が上手くいかない。素直にOpenCvの借りたほうが楽そうだけど、自力で書きたい。

 

ちなみにラベリング処理とは、画像の画素を解析していって、領域ごとにラベルを貼り付ける処理のこと。上の画像であれば、黒い部分が閾値以下の部分で非表示、それ以外の繋がっている領域ごとにラベリングされていて、同じ領域と処理された部分が同じ色で表示されている。

それで何ができるのかというと、色分けができたり、ラベル番号を指定してやって特定の番号、特定の範囲にあるラベル番号だけを表示させたり非表示にさせたり、効果をかけたり重心を見つけたり、座標を取得したり……と色々とできるようになる

 

ちなみに上の画像に関して言えば一見、上手く行っているように見えるけれど、よく見ると上手く行っていない部分があるのがわかる。画像中央下部の紫の領域と左側にある薄い黄色の一部が繋がっているにも関わらず、別の領域と判定されてしまっている。

原因はたぶん『√』っぽい部分の領域の処理(繋がりが欠けている)。あるいは、ルックアップテーブルの補正処理の仕方なんだけど、なんとも悩ましい。

まあ、コード自体はまだ試作ということで、Lua言語でスクリプトとして書いているので処理が重い。常用するならC言語でDLLにする必要もあるので、配布という形でここに来てくれている方にお目見えするのはまだまだ先になるはず……。

ラベリング処理の習熟(進行)具合

20170228052458

↓ ↓ ↓

20170228052434

上の方の画像は、Scene1に配置した図形オブジェクト(円)に、さつきさんのランダム配置を追加し、Scene1にアルファチャンネルを設定したシーンオブジェクト。これにラベリングを施したのが下の方の画像。

左上からラスタスキャンしているので、より上にあり、より左にある図形ほどラベル番号が若くなる。(ただ、くっついていなくても、一部は同じ領域と判定されているものもある。※)

※ 円の輪郭を滑らかに見せるために厳密に言えば、輪郭部分は100% → 0%の透明度が設定されている。最初、この部分を忘れていて、何故、くっついていない円と円が同じ領域にラベリングされるのか(・ω・ )モニュ?とした……。

 

とりあえずはこの程度の画像ならギリギリ……といった感じ。この不完全なラベリング処理でやっていることは……

  1. 画素のない部分を、ラベル番号0として初期化する。
  2. 画素があったらその位置を起点として4方向(左上、上、右上、左)を検索。
  3. 4方向にラベルの貼られた画素がなければ新たにラベルを振る。
  4. 4方向に既にラベルの貼られた画素があったら、4方向のうちで最も小さいラベル番号を引き継ぎ、それぞれの現在のラベル番号に対応したルックアップテーブル、検索先の画素のラベル番号と比較して、小さい方のラベル番号を残す。※
  5. 現在の画素に引き継いだラベル番号を記録する。
  6. 1から5までを画像の最後まで繰り返し。
  7. 画像の最初から割り振ったラベル番号と、ルックアップテーブルの同じ番号を比較して同じ番号のルックアップテーブルに入っているラベル番号を画素に入れる。※
  8. ラベル番号を適当に色相に変換して、obj.putpixelで描画してやる。
  9. 7から8までを画像の最後まで繰り返し。
  10. 終了。

 

※ 3と4の部分はラベル番号の割り振りで、記録のの精度を高めるとしたらココ。苦手な処理(隣接する領域が繋がらない部分)をどうにかするために、何らかの処理を追加するべきか?

※ 7がルックアップテーブルの補正部分。番号を整えたり入れ子でループさせたり、恐らくは他にも色々と補正処理をさせて精度を高める……はず。

関連記事
スポンサーサイト

0 Comments

Post a comment