はじめに
この記事は、scikit-imageライブラリを使用して2値画像のラベリングと領域のサイズ測定を行い、その結果に基づいて領域を「大・中・小」のカテゴリに分類し、それぞれ異なる色で可視化する方法について解説します。skimage.measureモジュールのlabelとregionprops_table関数を活用した画像解析テクニックを紹介します。
解説
モジュールのインポートなど
バージョン
画像データの作成
2次元平面にランダムに点を配置し、ガウシアンフィルタを適用して凹凸のある画像を生成します。この画像を大津のしきい値(threshold_otsu)で2値化し、バイナリ画像を作成します。ガウシアンフィルタのsigma値を調整することで、2値化後の円形構造のサイズを変化させることができます。
これらの作成した画像を加算して表示すると、以下のようになります。

境界に接した部分の除去
境界に接している部分はclear_border関数で除去することができます。視覚化すると以下のようになります。

2値化像のラベリング
labelを使って2値化画像にラベル付けし、各領域を個別に評価できるようにします。背景を透明にするため、値が0の箇所をnp.nanに変換します。図示すると以下のようになります。

regionprops_tableによる情報の取得
regionprops_tableを使用することで、ラベル画像の各領域について様々な特性情報を取得できます。この例では、’label’パラメータでラベル番号、’area’パラメータで面積を抽出しています。取得したデータをpandasのDataFrameに格納することで、整理された見やすい表形式で結果を確認できます。
小さい面積の部分の抽出
df[df["area"]<767].label
で面積が767より小さいラベル番号を取得します。まず、要素がすべて0でラベル画像と同じサイズの画像を準備します。次に、小さい面積のラベル番号に合致する部分を加算していくことで、小さい面積の領域を抽出した画像を作成する。
中間の面積の部分の抽出
中間の面積に該当する部分も同様にして抽出します。
大きい面積の部分の抽出
大きい面積に該当する部分も同様にして抽出します。
合成画像の生成
複数の画像を加算して合成します。特に中間面積の領域と大面積の領域については、値を適切に変更してから加算処理を行います。
合成画像の表示
BoundaryNormでlevelを設定することで離散的なカラーマップを表示します。

参考


コメント