single.php

Pythonで画像検出プログラムを作ってみる(findContours)

覚えたてのPythonを使って画像内の物体を検出するプログラムを作る手順を備忘録的に投稿しておきます。

画像内の苺をカウント

今回は画像内の物体を認識して数を調べるのを目標にします。

サンプルとして、苺の画像を用意しました。下の画像では大小異なるサイズの苺が不規則に並んでいます。この画像で9という数字が検出できれば成功です。

findContoursで計測する手順

VSCodeを使って、Pythonで画像認識をするには次の手順で行います。いきなり苺の画像はハードルが高いので、最初は白い背景に描画した黒丸の数を計測してみます。

1. VSCodeを起動しプロジェクト用のフォルダーを内に[circle.py]ファイルを作成して次のコードを追加します。

import cv2
import numpy as np
#画像読み込み
img = cv2.imread('circle.png', 0)

# 画像内から色の違う部分を探す
contours, hierarchy = cv2.findContours(img, cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE)

#contoursには外側の枠まで入っている
#for i in range(0, len(contours) - 1):
#    img = cv2.drawContours(img, [contours[i]], 0, 192, 5)

count = 0
for cnt in contours:
    #外枠を排除するために原点(0,0)を含む配列は除外
    if [cnt][0][0][0][0] != 0 | [cnt][0][0][0][1] != 0:
        img = cv2.drawContours(img, [cnt], 0, 192, 5)
        count = count + 1

print("The number of circle is :", count)

cv2.imwrite('circle-result.png', img)

2. 同じフォルダーに画像ファイル[circle.png]をコピーします。

3. VSCodeの[実行|デバッグの開始]メニューを選択します。

3. コードが実行され、次のような結果が表示されます。

The number of circle is :9

4. フォルダー内の[circle-result.png]を確認すると、検出された部分に枠線が追加されています。

苺を計測する手順

黒い丸を検出したプログラムを改良して、苺で画像認識をするには次の手順で行います。苺の場合は、背景色との色の差が1つ1つ違うのと、種の部分まで色の差を拾ってしまうので、検出する方法を少し工夫します。

操作の流れとしては、画像をグレースケールで読み込み、閾値を設定して二値化を行います。設定する値は、何度がプログラムを実行して適当な数値を見つける必要があります。

1. VSCodeを起動しプロジェクト用のフォルダーを内に[FindStrawberry.py]ファイルを作成して次のコードを追加します。

import cv2
import numpy as np
#画像読み込み
img = cv2.imread('strawberry.jpg', 0)
img_org = cv2.imread('strawberry.jpg')

#閾値
threshold = 180
#閾値で二値化
ret, img = cv2.threshold(img, threshold, 255, cv2.THRESH_BINARY)

# 画像内から色の違う部分を探す
contours, hierarchy = cv2.findContours(img, cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE)

count = 0
for cnt in contours:
    #小さなエリアは無視
    if cv2.contourArea(cnt) < 1500:
        continue

    #外枠を排除するために原点(0,0)を含む配列は除外
    if [cnt][0][0][0][0] != 0 | [cnt][0][0][0][1] != 0:
        img = cv2.drawContours(img_org, [cnt], 0, 255, 5)
        count = count + 1

print("The number of strawberry is :", count)

cv2.imwrite('strawberry-result.jpg', img)

2. 同じフォルダーに画像ファイル[strawberry.jpg]をコピーします。

3. VSCodeの[実行|デバッグの開始]メニューを選択します。

3. コードが実行され、次のような結果が表示されます。

The number of strawberry is :6

4. フォルダー内の[strawberry-result.png]を確認すると、検出された部分に枠線が追加されています。

他の画像でも検証

他にも苺の画像を用意して、同様に認識できるか確認してみます。認識できないようであれば、二値化を行う際の閾値を変更してテストをしてみます。

色々試してみて、苺の個数が確実に検出できる閾値を見つければ、検出精度を上げることができます。

まとめ

Pythonで利用できる[CV2]を利用して簡単に画像から輪郭線を検出して物を認識させるプログラムを作ることができます。

苺のような複雑な形状でも、二値化する際の閾値を設定することで認識させることができるので、画像から何かを検出するプログラムを簡単に作成することがでできます。

Pythonで画像認識プログラムを作成するのに興味がある方の参考になれば幸いです。

スポンサーリンク

最後までご覧いただき、ありがとうございます。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です