Pythonで図形の外接矩形を描く(OpenCV編)

PythonのOpenCV(cv2)モジュールを使って、図形の外接矩形を描きます。

目次

  1. 外接矩形とは
  2. 外接矩形の座標を計算する
  3. 外接矩形を画像に描く
  4. 外接矩形の描画実施例

外接矩形とは

外接矩形というのは、図形の外側に接する四角形のことです。

外接矩形が描けると、図形の部分だけをクロップしたりすることができるようになります。

本記事では輪郭から外接矩形を描き出します。輪郭の導出の仕方については、 輪郭の導出を解説した記事 を参照してください。カラー画像の場合は輪郭の導出の前に2値化が必要になりますので、 2値化の方法を解説した記事 を参照してください。

外接矩形の座標を計算する

findContoursメソッドで出力される輪郭の情報は、輪郭を表す点の座標の集まりになっています。boundingRectメソッドを使うと、点群から外接矩形の座標を計算できます。

つまり、輪郭線を表す点群の座標の集まりから、その点群の外接矩形の座標を導き出すわけです。

retval = cv2.boundingRect(array)
変数 内容
array tuple 輪郭を表す座標の集まり。(注)
retval tuple 外接矩形の座標を示すタプル。 (x, y , w, h)

(注)グレースケール画像データを引数にすることもできます。

戻り値は、外接矩形の右上の点のx座標、y座標、矩形の幅、高さ、のタプルになります。座標のデータの型はintです。

外接矩形を画像に描く

矩形の座標が計算できたら、その座標の情報を使って矩形を描きます。

cv2.rectangle(img, pt1, pt2, color, [thickness], [lineType], [shift])
変数 内容
img ndarray 矩形を書き込む画像データ。
pt1 tuple 矩形の右上隅の座標。(x, y)
pt2 tuple 矩形の左下隅の座標。(x, y)
color tuple 矩形の線色。(r, g, b)
thickness int 省略可。既定値は1。線幅。
linetype   省略可。既定値はLINE_8。線種。
shift int 省略可。既定値は0。

右上と左下の座標を指定して矩形を書き込みます。

外接矩形の描画実施例

記号の外接矩形を書き込んでみます。

元の画像はこれです。

元画像

コードはこうしました。

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_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

# 輪郭を1つずつ書き込んで出力
for i in range(len(contours)):
    im_con = im.copy()

    x, y, w, h = cv2.boundingRect(contours[i])
    cv2.rectangle(im_con, (x, y), (x + w, y + h), (0, 255, 0), cv2.LINE_4)

    cv2.imwrite('result' + str(i) + '.png', im_con)

出力はこうなりました。

外接矩形1 外接矩形2

広告

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