ディープラーニングの自動着色と OpenCV の輪郭抽出を組み合わせて花の数を数えるプログラムを作ってみました。
(1) ディープラーニングの自動着色
ディープラーニングの自動着色については、「深層学習 TensorFlow + keras 植物写真の自動着色(3)」をご覧ください。
OpenCV の輪郭抽出でモノクロ画像の白色と黒色の境界を抽出する予定なので、対象を自動着色で黒色で塗りつぶした画像を使います。
元画像
自動着色した画像
(2) OpenCV プログラム(python)
グレースケールを二値化してノイズ除去、小さい輪郭は誤検出としてカウントしない処理を入れています。
(蕾や陰に隠れた花はカウントしないことにします。)
(一部抜粋)———————————————–
threshold = 4
counter = 0
window_name01 = ‘gray image’
window_name02 = ‘count_image’
cv2.namedWindow(window_name01)
cv2.namedWindow(window_name02)
# 領域に描画
def draw_contours(img, contours):
for i, cnt in enumerate(contours):
# 輪郭の番号を描画する。
cnt = cnt.squeeze(axis=1)
cv2.putText(img, ‘{0}’.format(i+1), (cnt[0][0], cnt[0][1]), cv2.FONT_HERSHEY_COMPLEX, 1.0, (128,128,128))
### メイン ###
# 自動着色結果の画像 countflowers.jp を読み込む(グレースケール変換)
img_gray = cv2.imread(‘countflowers.jpg’, cv2.IMREAD_GRAYSCALE)
if img_gray is None:
print(‘image file error!’)
else :
# 二値化
(retval, new_img) = cv2.threshold(img_gray, threshold, 255, cv2.THRESH_BINARY_INV)
# ノイズ除去
new_img = cv2.morphologyEx(new_img, cv2.MORPH_OPEN, None, iterations=2)
new_img = cv2.morphologyEx(new_img, cv2.MORPH_CLOSE, None, iterations=2)
# 領域を抽出
contours, hierarchy = cv2.findContours(new_img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 小さい輪郭は誤検出とする
contours = list(filter(lambda x: cv2.contourArea(x) > 50, contours))
counter = len(contours)
print(‘count={0}’.format(counter))
# 領域を描画
draw_contours(new_img, contours)
# イメージを表示
cv2.imshow(window_name01, img_gray)
cv2.imshow(window_name02, new_img)
———————————————–
実行結果
(tf) >python countflowers.py
count=7
同じようなことは物体認識でもできると思いますが、
今回は比較的安く簡単な方法として自動着色で処理した画像を輪郭抽出で利用する方法を試してみました。
(2021/3/20 S.Onda)