第6回CADセミナー@岐阜 演習9/特徴抽出処理
この演習では,ラベルづけされた画像からいくつかの特徴を抽出する手法を取り扱います.
ラベルごとにその特徴を抽出することは,ラベルの形状の判定などを行う上で非常に基本的な処理になります.
ラベルや領域の特徴のことを画像特徴や画像特徴量,もしくは単に特徴量と表現します.
特徴量には,面積や画素値の平均などといった非常に基本的なものから,領域の円形らしさを示す
円形度,領域内の濃度むらを示す画素値の標準偏差など数かぎりなく考えられます.
この演習では,まず,基本的な特徴として,重心,面積を求めます.
そして,次には領域の円形らしさを表現する円形度を求めます.
重心・面積を求めましょう
重心,面積は比較的簡単です.
を抽出する関数を作成し実行します.
コンパイルは今回Makefileを用意したので, 単純に
make と入力してください.
実行するには,
proc 入力ファイル名 画像の幅 画像の高さ 出力ファイル名
の順で入力してください.
なお,circle.rawという画像には半径50画素の円が1つかいてありますので,そちらで試してみるとよいでしょう.
proc circle.raw 512 512 out.raw
画像を開き,配列に保存して、処理した結果を出力ファイル名をつけて ラベル画像をハードディスク上に保存します。
プログラムのmain.cはこちら.
ラベリングの関数labeling.cはこちら.
膨張処理:dilation.cはこちら.
収縮処理:erosion.cはこちら.
重心と面積の関数:center_and_size.cはこちら.
重心は,領域内の座標の平均を計算すればよいわけですから,x座標,y座標をすべて加算して
足した数で割れば計算できます.
面積は,画像中では画素数で表現されますから,数えた数が面積になります.
実際の面積に換算するのならば,1画素が何[cmxcm]を計算してかければよいです.
円形度を求めましょう
次に円形度を求めましょう.
しかし,その前に円形度を定義しなくてはいけません.
いろいろな定義がありますが,計算しやすい方法として,以下のアルゴリズムがあります.
ラベル番号:labelnum の重心にラベルと同じ面積をもつ円があったと仮定します.
円形度をその円とラベル部分の共通に存在する面積の比率として定義します.
つまり
- ラベルの面積: s1
- ラベルとその面積と等価の円の共通部分の面積: U
とした場合,円形度は,U/S1で表すということです.
したがって,ラベル図形と円が完全に一致すれば値は1になり,円形から外れるほど値が小さくなります.
そのような計算を行うためには,前の重心の計算,ラベルの面積の算出が必要になり,
その結果をもとに,さらに追加の円形度の計算を行う関数を作成します.
以下がその例です.
コンパイルは,makeで結構です.
プログラムのmain.cはこちら.
ラベリングの関数labeling.cはこちら.
膨張処理:dilation.cはこちら.
収縮処理:erosion.cはこちら.
重心と面積の関数:center_and_size.cはこちら.
円形度の計算の関数:roundshape.cはこちら.
実行は,
proc chest.raw 512 512 out.raw
です.
なお,circle.rawという画像には半径50画素の円が1つかいてありますので,そちらで試してみるとよいでしょう.
実行例:proc circle.raw 512 512 out.raw
なお,円がかいてあるのですが,ディジタルで表現しているため完全に1になることは少ないです.
以上で,特徴抽出処理の演習を示しました.
まとめると,
- ラベル付けされたら領域が決まるので,面積が求めれる.
- 重心は画素の座標の平均である
- 面積は画素数である
- 面積に単位はないので,実際の面積に変換するにはサンプリング間隔の情報が必要である.
- 円形度はいろいろ定義できる.
- 円といっても点の集まりで表現するので,誤差はある
となります.
なお,ここであつかった特徴量は基本的なものであり,この他にもたくさんあります.