【Python/OpenCV】最大面積のブロブ解析(座標・大きさなど)

この記事では、Python版OpenCVで面積が最大のブロブを解析(中心座標やサイズなど取得)する方法をソースコード付きで解説します。

ラベリングとブロブ解析

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

https://algorithm.joho.info/programming/python/opencv-sample-code-py/”>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入門】使い方とサンプル集
OpenCV(IntelOpenSourceComputerVisionLibrary)とは、インテル社で開発された画像処理・画像認識用のオープンソースライブラリです。Python/C++/Java/Android/Node.jsなどで使用...

コメント