[scikit-image] 53. 画像ラベリング:閾値処理と形態学的操作を用いた対象物の識別

python

はじめに

本記事では、scikit-imageライブラリを使用した画像のラベリング技術について詳しく解説します。画像中の対象物を識別し、個別にラベル付けする方法に焦点を当て、threshold_otsuによる二値化処理から始まり、morphologyの操作(opening、closing)を経て、measure.labelでのラベリングまでの一連のプロセスを説明します。実際のコード例と処理結果を示しながら、画像解析の基本テクニックを紹介していきます。

コード

解説

モジュールのインポート

画像データの読み込み

今回の例では、昨年播種したアストロフィツム・ストロンギロゴナムの幼苗を撮影した画像を使用します。

大津の2値化

大津の2値化手法を用いて最適なしきい値を自動的に算出し、このしきい値に基づいて画像処理を行うことでバイナリ(二値)画像を生成します。

クロージングによる穴埋め

クロージング処理(膨張処理の後に収縮処理を行う操作)によって、白い領域内の黒い点を効果的に除去することができます。

オープニングによる小さい領域の除去

オープニング処理(収縮処理の後に膨張処理を行う操作)によって、画像内の小さな白い領域を効果的に除去することができます。

画像の端に接している領域の除去

clear_border関数を使用して、画像の端に接している白い領域を除去することができます。

ラベリングし、ラベルごとに色を変えて表示

label関数はバイナリ画像内の連結している領域ごとにラベル付けを行います。生成されるlabel_imageはバイナリ画像と同じ形状で、整数値の配列となります。また、label2rgb関数を使用することで、ラベリングされた各領域に異なる色を割り当てて視覚化することができます。

ラベリングした領域を四角で囲む

regionprops(label_image)を使用すると、ラベリングした領域に関する多様な情報を取得できます。region.areaでは領域の面積が得られます。この例では、面積が100ピクセル以上の領域に対して、region.bboxを用いてラベル画像を囲む最小の四角形の座標を取得し、緑線でRectangleを描画しました。

regionpropsで得られる情報

areaで面積、labelでラベル番号、centroidで重心の座標を取得できます。その他の機能については下記ページで詳しく解説されています。

skimage.measure — skimage 0.25.2 documentation

ラベリングした画像をそれぞれ表示

region.bboxを使用して面積が100以上のラベル画像を囲む最小の四角形の座標を取得し、それらの座標に基づいて画像を切り取りました。これにより、切り取られた画像のリストが作成されました。

このリストはImagegridを用いて表示され、各画像のタイトルには対応するラベル番号が記載されています。

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

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

参考

Label image regions — skimage 0.25.2 documentation
skimage.filters — skimage 0.25.2 documentation
skimage.segmentation — skimage 0.25.2 documentation
skimage.measure — skimage 0.25.2 documentation
skimage.measure — skimage 0.25.2 documentation
matplotlibでcolor cycleのN番目の色を指定するいくつかの方法 - Qiita
実際の活用場面に即したタイトルにすると__「同じ図に複数データをプロットする際にcolor cycleから同じ色を指定する方法」とでもなりますが、少し一般性を持たせるためにどういう作業をするかに注目して「color cycleのN番目の色を...

コメント