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

python

はじめに

skimage.morphology の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の適用 

gradientの低勾配部分にmarkerがセットされているので、この状態でwatershedセグメンテーションを行うことで、うまい具合に分離される。

画像の表示

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

その他の例 1

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

元画像

セグメント化した画像

その他の例 2

元画像

セグメント化した画像

その他の例 3

元画像

セグメント化した画像

その他の例 4

元画像

セグメント化した画像

その他の例の詳細なコードはgistに置いた。

参考

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

コメント