[scikit-image] 88. threshold_sauvola, opening, label, regionpropsなどを駆使してサボテンの種の数を調査

matplotlib

はじめに

skimage.filters, morphology, measureなどを使用して、サボテンの種の数を調べたのでその詳細を解説する。

コード

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

解説

モジュールのインポートなど

バージョン

画像の読み込み

獅子王丸の実から種をとった。6個の実からとった種をティッシュ上に広げた画像を用いる。

画像の2値化

skimage.filtersのthreshold_sauvolaで画像をバイナライズする。
threshold_sauvolaについては下記記事で用いた。

[scikit-image] 52. 局所的しきい値処理による画像のバイナリ変換(skimage.filters threshold_niblack, threshold_sauvola)
skimage.filtersのhreshold_niblack, threshold_sauvolaによって、局所的しきい値処理でバイナリ画像を生成する方法について説明する。

結果を示すと以下のようになる。

Openingによるゴミの除去

Openingで2値化像にある小さなゴミを取り除く。結果は以下のようになる。

ラベル画像の生成

skimage.measure のlabelでラベル画像を生成する。
label imageのバックグラウンドは0となる。このまま画像を表示すると見にくいのでNanに変換する。

図示すると以下のようになる。

種それぞれの面積を調べる

面積が100ピクセル以下の物はゴミだと思われるので、100以上の物の数を計測すると、253個となった。

centeroidでそれぞれの種の重心の座標を得られるので、それぞれの種に番号を振った画像を作成すると以下のようになる。

この画像からくっついている種がまだあることがわかるので、watershedを使うことでより正確な種の数が求められると思われる。なお、watershedセグメンテーションについては下記記事で解説した。

[scikit-image] 56. Watershedセグメンテーション(skimage.morphology watershed)
skimage.morphology のwatershedは、画像内の異なるオブジェクトを分離するためのアルゴリズムである。ここでは、watershedアルゴリズムを用いて、重なった円をそれぞれセグメント化した例について説明する。

参考

Module: filters — skimage v0.18.0.dev0 docs
Module: morphology — skimage v0.18.0.dev0 docs
Module: measure — skimage v0.18.0.dev0 docs

コメント