[scikit-image] 62. 隣接領域グラフ(RAG)による色が似ている領域の結合(skimage.feature graph merge_hierarchical)

python

はじめに

skimage.feature graphのmerge_hierarchicalを用いて、隣接領域グラフ(RAG)を構築し、似ている色領域を結合する例について説明する。

コード

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

解説

モジュールのインポート

画像の読み込み

画像には、マミラリア属の雷電丸を用いる。画像のサイズは512 x 512となっている。

k平均法によるセグメント化

segmentation.slic()により、k-meansクラスタリングを上記のRGB画像に適用して、セグメント化を行う。compactnessn_segmentsを変化させることでセグメント化の調整ができる。詳細については、下記記事で示した。

[matplotlib animation] 53. skimage.segmentation.slic()のcompactnessおよびn_segments変化アニメーション
カラー画像をk平均法でクラスタリングするskimage segmentation slic を使ってセグメント化する際、パラメータとしてcompactnessおよびn_segmentsを設定する必要がある。ここでは、これらのパラメータがセグメント化の結果に及ぼす影響について調査した。

セグメント化画像に対する色と境界の設定

label2rgbでセグメント化された領域の色を設定する。kind='avg' とすることで各セグメント領域の平均の色を設定できる。

mark_boundariescolor(0,0,0)としているので、境界の色が黒色になる。

領域隣接グラフ(RAG)の計算

k平均法でセグメント化したlabelsを用いて、graph.rag_mean_colorにより、平均色による領域隣接グラフを計算する。

RAGを用いた領域の結合

graph.merge_hierarchicalにより、領域の結合を行う。threshで指定した値を超えるまで領域の結合が行われる。

merge_funcは結合する領域の平均色を求める関数で以下のようになる。

weight_funcは、平均色を再計算してノードの差を求める関数で以下のようになる。

src, dstはそれぞれsourceとdestinationの略である。

threshを変化させた場合

上記と同じ処理をthreshを50として行う。

結果の表示

threshを高く設定した画像はより多くの領域が結合していることがわかる。

参考

RAG Merging — skimage v0.18.0.dev0 docs
Module: segmentation — skimage v0.18.0.dev0 docs
Module: color — skimage v0.18.0.dev0 docs
Module: segmentation — skimage v0.18.0.dev0 docs
Module: future.graph — skimage v0.18.0.dev0 docs
Module: future.graph — skimage v0.18.0.dev0 docs

コメント