Pythonで図形の輪郭の大きさを調べる(OpenCV編)

PythonのOpenCV(cv2)モジュールで描いた図形の輪郭の大きさを調べます。

目次

  1. 輪郭が占める面積の計算方法
  2. 計算の実施例

輪郭が占める面積の計算方法

PythonのOpenCV(CV2)モジュールでfindContoursを使うと図形の輪郭が得られます。具体的な方法は 別の投稿 を参照してください。

この輪郭の内側の面積は、contourAreaメソッドで計算できます。

retval = cv2.contourArea(contour, [oriented])
変数 内容
contour ndarray 輪郭のデータ。
oriented bool 省略可。既定値はFalse。方向性を有効にするかどうか。
retval float 輪郭が占める面積。

方向性についてはよくわかりません。

計算の実施例

この画像から全ての輪郭を抽出して、それぞれの面積を計算してみます。

元画像

コードはこんな感じです。

import cv2

im = cv2.imread('test.png')
im_gray = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)
retval, im_bw = cv2.threshold(im_gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)

# 輪郭の検出
contours, hierarchy = cv2.findContours(im_bw, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)

# 輪郭を1つずつ書き込んで出力
for i in range(len(contours)):
    im_con = im.copy()
    print('ID', i, 'Area', cv2.contourArea(contours[i]))
    im_con = cv2.drawContours(im_con, contours, i, (0,255,0), 2)
    cv2.imwrite('result' + str(i) + '.png', im_con)

出力はこうなります。

ID0

ID 0 Area 718.0

ID1

ID 1 Area 5350.5

ID2

ID 2 Area 2.0

ID3

ID 3 Area 2.0

ID4

ID 4 Area 5755.5

ID5

ID 5 Area 14848.0

ID6

ID 6 Area 308.0

ID7

ID 7 Area 622.0

ID8

ID 8 Area 5110.5

ID9

ID 9 Area 7916.0

実用的には、面積が極端に小さいのを取り除くと使いやすそうです。

広告

Pythonで画像処理カテゴリの投稿