[OpenCV4.5.0] 輪郭抽出

まず花の写真を用意します。 コスモスかな。

二値化

import cv2
import matplotlib.pyplot as plt

img = cv2.imread("flower.jpg")
img = cv2.resize(img, (300, 169))

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # gray化
gray = cv2.GaussianBlur(gray, (7, 7), 0) # Gaussianぼかし
im2 = cv2.threshold(gray, 140, 240, cv2.THRESH_BINARY_INV)[1] # threshold閾値処理 グレースケール画像を2値画像化

cv2.imwrite("threshold.png", im2)

GaussianBlurは細かな箇所を抽出しないようにぼかす。
findContoursで輪郭を抽出する。

import cv2
import matplotlib.pyplot as plt

img = cv2.imread("flower.jpg")
img = cv2.resize(img, (300, 169))

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # gray化
gray = cv2.GaussianBlur(gray, (7, 7), 0) # Gaussianぼかし
im2 = cv2.threshold(gray, 140, 240, cv2.THRESH_BINARY_INV)[1] # threshold閾値処理 グレースケール画像を2値画像化

# cv2.imwrite("threshold.png", im2)
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)

cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
cv2.imwrite("find.png", img)

$ python3 app.py
245 91 2 1
182 76 20 18
0 0 300 169

花びらを輪郭にしたかったんですが、雄しべ雌しべが輪郭になってしまいました。
画像を変えてみましょう。

こちらは上手くいきました。
入力値のスクリーニングが鍵やな。