[scikit-image] 57. 画像の勾配を利用したWatershedセグメンテーション(skimage.morphology watershed, rank.gradient)

python

はじめに

scikit-imageのwatershedアルゴリズムは、画像内の異なるオブジェクトを効果的に分離するための強力なツールです。本記事では、画像の勾配情報を活用してイラストを複数の領域に分割する方法について詳しく解説します。

Watershedアルゴリズムの概要

Watershedアルゴリズムは、地形学的な考え方に基づいています。画像の輝度値を標高に見立て、低い領域(谷)から水を注ぐことをシミュレーションし、水が溢れる境界線(分水嶺)を検出することで領域分割を行います。

コード

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

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

解説

モジュールのインポート

画像の読み込み

用いる画像は下記サイトから拝借しました。

いろいろな鉢植えのサボテンのイラスト
いらすとやは季節のイベント・動物・子供などのかわいいイラストが沢山見つかるフリー素材サイトです。

以下の画像を用います。

plt.imreadを使用して画像を配列として読み込み、rgb2grayでカラー画像をグレースケール画像に変換し、img_as_ubyteで画像を8ビット符号なし整数(0~255)形式に変換します。

medianフィルタの適用

medianフィルタで画像を平滑にします。

マーカーの設定

rank.gradient(denoised, disk(5)) < 9を使用して、平滑化した画像の勾配を計算し、勾配が小さい部分(9未満)のみをTrueとした配列を取得します。この配列はndi.labelによってラベリングされます。markers.max()によって合計ラベル数が判明し、この例では6つの領域がラベリングされた。

watershed用の勾配画像の生成

rank.gradient(image, disk(2))のように、disk(2)というパラメータを使用することでシャープな勾配画像を生成できます。

watershedの適用 

マーカーが勾配の低い部分に設定されているため、この状態でwatershedセグメンテーションを適用すると、画像の領域が効果的に分離されます。

画像の表示

図は左から順に、平滑化した画像、勾配画像、マーカー画像、そしてwatershedを適用した画像(元画像にwatershedによるラベリング結果を重ねて表示)を示しています。

その他の例 1

元画像は上の例と同じサイトから拝借しました。

元画像

セグメント化した画像

その他の例 2

元画像

セグメント化した画像

その他の例 3

元画像

セグメント化した画像

その他の例 4

元画像

セグメント化した画像

詳細なコードサンプルはgistにアップロードしてあります。

まとめ

scikit-imageのwatershedアルゴリズムと画像勾配を組み合わせることで、効果的な画像セグメンテーションが可能になります。特にイラストのような明確な境界を持つ画像では、高精度な領域分割を実現できます。

実際の応用では、対象画像の特性に合わせてパラメータを調整し、前処理や後処理を適切に組み合わせることが重要です。画像処理パイプラインの一部としてwatershedアルゴリズムを活用することで、より高度な画像解析が可能になります。

参考

Markers for watershed transform — skimage 0.25.2 documentation
いろいろな鉢植えのサボテンのイラスト
いらすとやは季節のイベント・動物・子供などのかわいいイラストが沢山見つかるフリー素材サイトです。
skimage.morphology — skimage 0.26.0rc0.dev0 documentation
skimage.measure — skimage 0.26.0rc0.dev0 documentation
skimage.filters.rank — skimage 0.26.0rc0.dev0 documentation

コメント