OpenCVで輪郭抽出

# OpenCVで輪郭抽出

import cv2
import matplotlib.pyplot as plt

#画像を読み込んでリサイズ
img = cv2.imread("flower.jpg")
img = cv2.resize(img, (300,169))

#色空間を2極化
gray = cv2. cvtColor(img, cv2.COLOR_BGR2GRAY)
gray = cv2.GaussianBlur(gray, (7,7), 0)
im2 = cv2.threshold(gray, 140, 240, cv2.THRESH_BINARY_INV)[1]

#画面左型に二極化した画像を描画
plt.subplot(1, 2, 1)
plt.imshow(im2, cmap="gray")

#輪郭を抽出
cnts = cv2.findContours(im2, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)[0]

#抽出した枠を描画
for pt in cnts:
    x, y, w, h = cv2.boundingRect(pt)
    #大きすぎたり小さすぎる領域を除去
    if w < 30 or w > 200: continue
    print(x, y, w, h)
    cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 2)

# 画面右側に抽出結果を描画
plt.subplot(1, 2, 2)
plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
plt.savefig("find_contours.png", dpi=200)
plt.show()
97 64 30 28
101 9 90 81

ぼかし処理

cv2.blur(),cv2.GaussianBlur(), cv2.medianBlur(),cv2.bilateralFilter()

画像の二極化

ret, img = cv2.threshold(img, thresh, maxval,type)

輪郭抽出

contours, hierarchy = cv2.findContours(image, mode, method)

mode

cv2.RETR_LIST 単純輪郭

cv2.RETR_EXTERNAL 最も外側の輪郭のみ検出

cv2.RETR_CCOMP 改装を考慮し2レベルの輪郭を検出

cv2.RETR_TREE すべtねお輪郭を検出し改装構造を保持

method

cv2.CHAIN_APPROX_NONE 輪郭上のすべての点を保持する

cv2.CHAIN_APPROX_SIMPLE 冗長な点情報を削除して返す

タイトルとURLをコピーしました