2015年9月23日水曜日

第23回 2値画像処理の基本で学ぶ!

この記事は参考記事を援用して、筆者の考えも交えつつ、記述しています。

前回は2値化の手法について代表例を紹介しました。
画像を2値化することによって元画像のさまざまな特徴の抽出や特徴量の計算もしくは計測が可能になります。今回も引き続き、2値化についてふれつつ、画像処理方法や解析・計測するための基本的な方法について説明します。

2値化の連結性


2値画像は画素値を2つの値(例えば、1と0)で表現するため、同じ画素値の画素が群集をつくったりする様子などを観察でき、この状態を定義するために「連結」という概念が用いられます。

一般的に、2値画像上の任意の画素(i,j)に対して、その周辺を埋める(i+x, j+y) における適当な整数の対(xとy)によって配置される画素の集合を“近傍”と言います。

二次元のデジタル画像では、その任意の画素(i,j)の1画素分の上下左右を最近傍とした4近傍と、対角方向の画素も含める8近傍が使用されます。
次の図に示すとおり、任意画素(i,j)の4近傍は、画素(i+1,j)、(j,j+1)、(i-1,j)および (i, j-1)であり、8近傍では、これらに(i+1,j+1)、(i-1,j+1)、(i+1,j-1)、および(i-1, j-1)が加わります。

(参考記事より引用)

また、8近傍を上図のx0からx8のように反時計方向に回るような画素の位置で表記することもあります。
この2値画像中で互いに連結している画素の集合を1つのクラスにまとめると、2値画像の、例えば、いくつかの画素値0を持つクラスと画素値1を持つクラスができ、この各々のクラスを“連結成分”と言います。

連結成分の特徴量


2値画像の中で、画素値1の連結を「4連結」でクラス分けする場合と「8連結」でクラス分けする場合で連結性は異なります。画素値1について4連結で連結成分を抽出した場合、抽出されなかった画素値0の連結成分を観察すると、8連結で考えなければ矛盾が生じるような連結構成になっています。また、その逆で、画素値1について8連結で連結成分を抽出すれば、画素値0の連結成分は、4連結で説明しなければ矛盾が生じるような連結構成です。

画素値0の連結成分について、その周辺の画素が1つも連結しない場合は、これを“孔(ホール)”と言います。

画素値1の連結成分が孔を含まないときに、これを単連結成分、孔を1つでも含むとき、多重連結成分と言います。

次の図に、これらの説明図を示します。図中aは,4連結の場合で、成分数が5つ、孔はなし、図中b は8連結の場合で、成分数が3、孔の数が3です。また、成分数から孔の数を引いた数を“オイラー数(示性数)”と言い、2値画像の特徴量計算などに使用されます。
例えば。孔がない粒子は、オイラー数が成分数と等しいため、成分数の推定が可能となります。

(参考記事より引用)

連結数と特徴点について


2値画像において、ある画素の値を変更しても画像全体の連結性が保持されることを“消去可能”と言います。これを調べる際、“連結数”を用いると簡単に画素の消去可能性がわかります。

連結数は注目する画素の8近傍において、連続する画素を1つの成分とみなし、その成分数を数えることによって求められます。
この場合、4連結と8連結はいずれも0〜4の値をとります。次の図に、連結数とその連結数から分類される特徴点を示します。図のように、3×3マトリックスの中央の画素に注目し、その周辺の8近傍の画素が連結している成分数が連結数であり、連結数0が内部点、連結数1が端点、連結数2が連結点、連結数3が分岐点、連結数4が交差点となります。

(参考記事より引用)

収縮と膨張処理


注目画素の近傍を一回り剥ぎ取るような処理を“収縮(エロージョン)”と言います。この処理は、成分の形状によっては複数の成分に分割されるために、前述したような消去可能な処理とは異なります。また、逆に、注目画素に近傍画素を一回り加えるような処理を“膨張(ダイレージョン)”と言います。

これらの処理は数学的にはミンコフスキーの和と差として定義されています。

この処理は、孔がある場合,それを埋める効果があります。また、この処理も、非連結成分を連結して1つの成分に統合することがあるため、連結性を保持しない処理です。

ダイレーションやエロージョンは構造要素よりも小さな凹凸を画像から取り除く効果があります。しかし、実際にそれらが単独で用いられることは少ないです。これは、ダイレーションを行えば図形は拡大し、エロージョンを行うと縮小し、いずれの処理も処理の前後で画像のサイズが基本的に変わってしまうからです。

このため、両者を組み合わせ、大体の大きさが変わらないような処理が多くの場合に用いられます。それがオープニングとクロージングです。

同じ回数だけ膨張して収縮する処理を“クロージング”と言い、この組み合わせ処理によって小さな孔を除くことができます。またその逆で、同じ回数だけ収縮して膨張する処理を“オープニング”と言います。
どちらの処理でも、画像の小さな孤立成分を除くことができます。

以下、ImageJによる各処理結果を示します。
メニューのProcess/Binaryのプルダウンメニューに、2値化画像の各画像処理(Erode, Dilate, Open, Close)が並んでいます。

元画像

2値化
(図中の黄色枠を切り出す)

狭窄部のみ切り出し

エロージョン

ダイレージョン

オープニング

クロージング

収縮ではノイズ除去効果、膨張では穴埋め効果が得られているのが観察できます。実際には、オープニングとクロージングにおける収縮と膨張の回数は画像の質を考慮して設定しなければなりません。
オープニング処理は、外側に突き出した突起が削られて滑らかになり、図形の辺縁を滑らかにする一種の平滑化処理です。だだし、内側からの平滑化ですので、入江のような部分はそのまま残ります。また、狭い部分は図形の分離が起こります。孤立した小さな領域は消滅することから雑音除去の目的で利用することもできます。
クロージング処理はオープニング処理同様に平滑化された図形が得られます。入江のような部分や小さな穴がふさがれる効果があります。

次回も引き続き、2値画像処理について話を進めていきます。

参考記事:「山本修司:ImageJで学ぶ実践医用・バイオ画像処理.INNERVISION(21・10) 2006, p75-77」

参考文献:
  • 田村秀行:2値画像の連結性と距離.2値画像処理,コンピュータ画像処理,東京,オーム社, 143一147,2002.
  • 小畑秀文:モルフォロジー,東京,コロナ社,p43,1996.


5 件のコメント:

  1. 3次元の画像を扱っているのですが、膨張処理を3次元的に行う方法はありませんでしょうか?
    教えて頂きたいです

    返信削除
    返信
    1. 1つの例ですが、先に2値化したスタック画像を作ってから実行します。
      スタック画像は、複数のイメージを開いた状態で、Image>Stacks>Images to Stackで作ります。
      的を射た回答になっていなかったらすみません。

      削除
  2. よりダイナミックに解析したいということでしたら、ITK-SNAPなどから紐解いていくのも面白いかもしれません。http://www.itksnap.org/pmwiki/pmwiki.php

    返信削除
  3. スタック画像で行ってもxy平面に広がるだけで
    ITK-SNAPというのは初めて知りました。勉強になりました。
    http://imagej.net/3D_Binary_Filtersというプラグインもあるみたいなのですが、どうやって入れたらいいのかわからなくて
    もしいつか機会がありましたらこのHPのプラグインの入れ方について記事について触れていただけると嬉しいです

    返信削除
    返信
    1. http://imagej.net/3D_Binary_FiltersというプラグインはデフォルトでFijiに入っているようです。Plugin>Process>Erode3D,
      Dilate 3D あたりかと思います。記事のリクエストありがとうございます。お約束はできませんが、機会があれば作成させていただきます。

      削除