はじめに
この記事では、scikit-imageライブラリの隣接領域グラフ(RAG)機能を活用して、画像内の色が似ている領域を効率的に結合する方法について解説します。skimage.feature.graphモジュールのmerge_hierarchical関数を使用することで、過分割された画像から意味のある領域を抽出し、視覚的に理解しやすい結果を得る手法を紹介します。画像分割とグラフ理論を組み合わせた高度な画像処理テクニックを、コード例とともに分かりやすく説明していきます。
コード

解説
モジュールのインポート
画像の読み込み
この例では、マミラリア属の雷電丸の画像を使用しています。画像サイズは512 × 512ピクセルです。

k平均法によるセグメント化
segmentation.slic()を使用して、k-meansクラスタリングを上記のRGB画像に適用し、セグメント化を行います。compactnessとn_segmentsパラメータを調整することで、セグメント化の精度や粒度を変更できます。詳細については、下記記事で解説しています。

セグメント化画像に対する色と境界の設定
label2rgb関数を使用してセグメント化された領域の色を設定します。kind=’avg’パラメータを指定すると、各セグメント領域に平均色が適用されます。また、mark_boundaries関数のcolorパラメータを(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)を高く設定すると、より多くの領域が結合されることが確認できます。
コードをダウンロード(.pyファイル) コードをダウンロード(.ipynbファイル)まとめ
隣接領域グラフ(RAG)と階層的結合アルゴリズムを組み合わせることで、画像内の視覚的に意味のある領域を効率的に抽出することができます。scikit-imageのmerge_hierarchical関数は、この処理を簡単に実装できるツールを提供しています。適切なパラメータ設定とカスタム関数の実装により、様々な画像処理タスクに応用することが可能です。
このテクニックは、コンピュータビジョンのパイプラインにおいて、特に前処理や特徴抽出のステップで非常に有用です。
コメント