【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)  

    # ブロブ面積最大のインデックス
    max_index = np.argmax(data[:,4])

    # 面積最大ブロブの各種情報を表示
    print("外接矩形の左上x座標", data[:,0][max_index])
    print("外接矩形の左上y座標", data[:,1][max_index])
    print("外接矩形の幅", data[:,2][max_index])
    print("外接矩形の高さ", data[:,3][max_index])
    print("面積", data[:,4][max_index])
    print("中心座標:\n",center[max_index])

if __name__ == '__main__':
    main()

実行結果

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

■結果

外接矩形の左上x座標 120
外接矩形の左上y座標 111
外接矩形の幅 72
外接矩形の高さ 72
面積 4050
中心座標: [ 155.51234568  146.51234568]

おすすめ記事

PythonでOpenCV入門 サンプル集
【Python】画像処理プログラミング入門
【画像処理入門】アルゴリズム&プログラミング

関連記事