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

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

ラベリングとブロブ解析

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

関連記事
原理の詳細
OpenCVの導入方法 【Python3】OpenCV3をインストール
Python版OpenCV入門 Python版OpenCV入門 サンプル集
画像処理の原理 【画像処理入門】アルゴリズム&プログラミング

ソースコード(Python3+OpenCV3)

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

# -*- 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】画像処理プログラミング入門
【画像処理入門】アルゴリズム&プログラミング

関連記事