【Python/OpenCV】ラベリングとブロブ解析

この記事では、Python版OpenCVでラベリングを実装し、ブロブを解析する方法をソースコード付きで解説します。

ラベリングとブロブ解析

画像をラベリング処理し、ラベル付けされた領域の特徴を解析することをブロブ解析といいます。
Python版OpenCVでは、「cv2.connectedComponentsWithStats」を使うことでより詳しいラベルの情報(各ラベルの外接矩形の座標, 大きさ, ラベルの面積・重心)を得ることができます。
今回はこれを使ってブロブ解析を試してみました。

ソースコード

サンプルプログラムのソースコードです。

# -*- coding: utf-8 -*-
import cv2
import numpy as np

def main():
    # 入力画像の取得
    im = cv2.imread("input5.png")

    # グレースケール変換
    gray = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)

    # 2値化
    gray = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)[1]

    # ラベリング処理
    label = cv2.connectedComponentsWithStats(gray)

    # ブロブ情報を項目別に抽出
    n = label[0] - 1
    data = np.delete(label[2], 0, 0)
    center = np.delete(label[3], 0, 0)

    # ラベルの個数nだけ色を用意
    print("ブロブの個数:", n)
    print("各ブロブの外接矩形の左上x座標", data[:,0])
    print("各ブロブの外接矩形の左上y座標", data[:,1])
    print("各ブロブの外接矩形の幅", data[:,2])
    print("各ブロブの外接矩形の高さ", data[:,3])
    print("各ブロブの面積", data[:,4])
    print("各ブロブの中心座標:\n",center)

if __name__ == '__main__':
    main()

実行結果

サンプルプログラムの実行結果です。
■入力画像

■結果

ブロブの個数: 3
各ブロブの外接矩形の左上x座標 [ 30 164 120]
各ブロブの外接矩形の左上y座標 [ 35  60 111]
各ブロブの外接矩形の幅 [ 35 100  72]
各ブロブの外接矩形の高さ [35 13 72]
各ブロブの面積 [ 961 1300 4050]
各ブロブの中心座標:
 [[  47.0842872    52.0842872 ]
 [ 213.5          66.        ]
 [ 155.51234568  146.51234568]]
【Python/OpenCV】最大面積のブロブ解析(座標・大きさなど)
この記事では、Python版OpenCVで面積が最大のブロブを解析(中心座標やサイズなど取得)する方法をソースコード付きで解説します。
【PythonでOpenCV入門】使い方とサンプル集
OpenCV(Intel Open Source Computer Vision Library)とは、インテル社で開発された画像処理・画像認識用のオープンソースライブラリです。Python/C++/Java/Android/Node.js...

コメント