知っていることだけ

勉強していて役に立つ、理解の助けになるようなポイントを書いていきます。

pythonで機械学習 初心者向け 輪郭抽出

対象読者

前準備

test.jpgとして好きな画像を入れておく。

機械学習

使った関数

importしたもの

import cv2
import matplotlib.pyplot as plt

グレースケールにする.

cv2.thresholdはグレースケール画像を引数にとるため、事前に変換する必要がある。

gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

グレースケール画像の表示

plt.imshow(img, cmap="gray")

画像を平滑化(白色雑音の除去)

  • 引数:
    • ksize:フィルタ窓枠の大きさ. 必ず奇数
    • sigmaX: ガウシアンの標準偏差値. 0だとカーネルのサイズから自動的に計算
gauss_img = cv2.GaussianBlur(img , ksize = (7,7),sigmaX =  0)

二値化

  • 引数:
    • thresh:閾値.
    • maxval:閾値以上(指定により閾値以下のこともある)の値を持つ画素に対して割り当てられる値,
    • type:二値化の方法。cv2.THRESH_BINARY_INVだと白黒かつ反転
  • 返り値:[1]に画像が入っている
im2 = cv2.threshold(gray_img, thresh = 140, maxval = 240, type = cv2.THRESH_BINARY_INV)[1]

輪郭抽出

  • 引数
    • image: 型が CV_8UC1 である画像。非0の画素は1とした2値画像として扱われる。
    • mode: 輪郭を検索する方法。
      cv2.RETR_EXTERNAL: 一番外側の輪郭のみ抽出する。
      cv2.RETR_LIST: すべての輪郭を抽出するが、階層構造は作成しない。
      cv2.RETR_CCOMP: すべての輪郭を抽出し、2階層の階層構造を作成する。
      cv2.RETR_TREE: すべての輪郭を抽出し、ツリーで階層構造を作成する。
      cv2.RETR_LIST、cv2.RETR_CCOMP、cv2.RETR_TREE はいずれもすべての輪郭を抽出するが、返り値の hierarchy の内容が異なる。
    • method: 輪郭を近似する方法。
  • 返り値
    • [0] : image
    • [1] : contours 抽出された輪郭のリスト。各輪郭は (NumPoints, 1, 2) の numpy 配列。
    • [2] : hierarchy (1, NumContours, 4) の numpy 配列。階層構造のリスト。
contours = cv2.findContours(im2, mode = cv2.RETR_LIST, method = cv2.CHAIN_APPROX_SIMPLE)

外接矩形を作成

返り値:長方形の左上の角のx,y座標、幅,高さ

 x,y,w,h = cv2.boundingRect(<輪郭>)

長方形を図示

引数:画像(直接追加される)。左上(pt1),右下(pt2)の角の座標、色(color)

red = (0,0,255)
cv2.rectangle(img,(x,y), (x+w,y+h), red, thickness =3)

参考書籍

protoidea.hatenablog.com