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")
画像を平滑化(白色雑音の除去)
gauss_img = cv2.GaussianBlur(img , ksize = (7,7),sigmaX = 0)
二値化
- 引数:
- 返り値:[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)