まず花の写真を用意します。 コスモスかな。
二値化
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
花びらを輪郭にしたかったんですが、雄しべ雌しべが輪郭になってしまいました。
画像を変えてみましょう。
こちらは上手くいきました。
入力値のスクリーニングが鍵やな。