はじめに
skimage.measure の label, regionprops_tableで2値画像のラベリングとサイズ計測を行い、サイズを大中小で分類し、塗り分けて表示する方法について説明する。
解説
モジュールのインポートなど
バージョン
画像データの作成
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を設定することで離散的なカラーマップを表示する。

参考


コメント