# 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 冗長な点情報を削除して返す