[scikit-image] 55. ランダムウォーカーセグメンテーション(skimage.segmentation random_walker)

python

はじめに

scikit-imageのrandom_walker関数は、ランダムウォーカーアルゴリズムを用いて画像のセグメンテーション(領域分割)を行う機能です。このアルゴリズムは、指定されたシード(マーカー)から始まるランダムウォーカーが最初に到達する確率に基づいて画像のピクセルを分類します。特に、ノイズが多い画像や境界が不明瞭な画像に対して効果的なセグメンテーション手法として知られています。

コード

解説

モジュールのインポート

バージョン

画像の読み込みとグレースケール化

アストロフィツム属・兜丸の画像を用います。

rgb2grayでグレースケール画像とします。

ヒストグラムは以下のようになります。

画像の3値化

ランダムウォーカーアルゴリズムは、複数のラベル付けされた領域からそれぞれが適切に拡散していき、画像のセグメント化を実現します。このアルゴリズムの詳細な原理については下記で解説しています。

skimage.segmentation — skimage 0.25.2 documentation

ここでは、要素の値が0.6未満の領域を1、値が0.9より大きいものを2、それ以外を0としてラベル像を作成しました。

random walker セグメンテーションの適用

dataには画像、markersにはlabel像を指定します。prob_tolは結果の確率が区間[0, 1]に収まるようにするための許容範囲です。ここではエラーが出たため0.1に設定しています。その他の重要なパラメータとしてbetaがあります。betaはランダムウォーカーの拡散挙動を制御する係数で、値が大きいほど拡散が制限されます(デフォルト値は130)。modeは計算方式を指定するもので、’cg’、’cg_j’、’cg_mg’、’bf’から選択できます。実行速度は cg_j > bf > cg の順になります。なお、cg_mgモードを使用するには pyamg module (http://pyamg.github.io/)をインストールする必要がある。 

画像の表示

左に元画像、中央にラベル像、右にランダムウォーカーセグメンテーションの結果を示すと以下のようになります。

3値化を0.6と0.95で行なった場合

ラベル像の3値化を0.6と0.95で行なった場合の結果を示すと以下のようになります。

3値化を0.5と0.9で行なった場合

ラベル像の3値化を0.5と0.9で行なった場合の結果を示すと以下のようになります。

コードをダウンロード(.pyファイル)

コードをダウンロード(.ipynbファイル)

まとめ

ランダムウォーカーセグメンテーションは、確率的なアプローチで画像の領域を分割する効果的な手法です。scikit-imageのrandom_walker関数を使用することで、複雑な背景や不明瞭な境界を持つ画像でも、適切なマーカーを設定することで高精度なセグメンテーションが可能になります。特に医療画像解析や自然画像の物体検出など、精密な領域分割が求められる場面で活用できるツールです。

参考

Random walker segmentation — skimage 0.25.2 documentation
skimage.segmentation — skimage 0.25.2 documentation

コメント