OpenCVで画像から輪郭を上手く抽出する


EIGHT
OpenCVで画像から輪郭を上手く抽出する

pythonのOpenCVで輪郭を上手く抽出することができなかったが、いくつかの改善点により上手く行った経緯をここに書き残しておく。

改善前

これは50×50のスカートの画像である。単にfindcontourしてdrawcontourするだけだとこのように上手く輪郭が抽出されなかった。

そこで、次のような変更をした。

  1. 画像をresizeして200×200にする
  2. thresholdの閾値を30程度まで下げる
  3. 外枠を対象外にする

50×50では非常に荒いdot絵であったものが、1によりある程度形を検出できるようになったことで輪郭判定がしやすくなったと思われる。
また、2により薄い線も検出対象になり、より全体像がわかりやすくなった。閾値がデフォルトのままだと線の薄いところを認識せずに輪郭線が途切れてしまうため、十分に小さくする必要がある。ただし、小さすぎると背景などを認識してしまうので調整が必要である。

結果

このように上手く検出できるようになった。

コード


img = cv2.imread(path, 1)
img = cv2.resize(img, dsize=(200,200)) 
img = cv2.bitwise_not(image)
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, img_binary = cv2.threshold(img_gray, 30, 255,cv2.THRESH_BINARY)
contours, hierarchy = cv2.findContours(img_binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
#黒字の背景に輪郭だけ抽出する
contour_mask = np.zeros_like(img_binary)
img_contour = cv2.drawContours(contour_mask, contours, -1, 255)

#外枠削除
img_contour[0,:] = 0
img_contour[:,0] = 0
img_contour[-1,:] = 0
img_contour[:,-1] = 0


株式会社ファントムへのお問い合わせ

群馬県でPythonを使ったAIやソフトウェアを開発している株式会社ファントムが運営しています。




    Related Articles

    Python

    Pythonのf文字列を使った書式パターン

    Pythonのf文字列を使った書式パターン この記事で紹介したf文字列を使った文字列の操作ですが、文字列に変数を埋め込む際に書式を指定できます。0埋めして文字数を揃えたり、カンマで桁を区切ることも可能です。 カンマで桁区 […]

    Posted on by press
    Python

    Pythonのdatetimeで日付や時刻を扱う

    Pythonのdatetimeで日付や時刻を扱う Pythonには日付や日時を扱うdatetimeモジュールがあります。今回はこのdatetimeモジュールを解説します。 開発環境 現在の日付を取得 現在の時刻を取得 現 […]

    Posted on by press

    最新情報をお届けします!

    メーリングリストに登録すると株式会社ファントムの最新情報をお届けします

    お客様のメールアドレスを共有することはありません