【Python】物体の輪郭を抽出する

 

こんにちは。のっくん(@yamagablog)です。

この記事では、画像に写っている物体の輪郭抽出の方法をご説明します。

「Pythonで物体の輪郭を抽出したい」

「Pythonで画像処理をしてみたい」

そんな方に読んでいただければと思います。

 

[toc]

 

ステップ

輪郭を抽出するステップ
・画像を読み込む
・グレースケールにする
・ブラーでボヤかす
・2値化する
・輪郭を検出する

使用する画像ですが、私のプロフィール画像にしました。

コード

 

import cv2
import matplotlib.pyplot as plt

# 画像を読み込んでリサイズする
img = cv2.imread("profile.jpg")
img = cv2.resize(img,(300,300))

# グレースケールにする
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

# ブラーと2値化
gray = cv2.GaussianBlur(gray,(7,7),0)
im2 = cv2.threshold(gray,140,240,cv2.THRESH_BINARY_INV)[1]

# 二値化した画像を左にプロット
plt.subplot(1,2,1)
plt.imshow(im2,cmap="gray")

#輪郭を検出
cnts = cv2.findContours(im2,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)[1]

for pt in cnts:
    x,y,w,h = cv2.boundingRect(pt)
    # 幅が40以下のものをスキップ
    if w < 40:
        continue
    print(x,y,w,h)
    # 四角形を赤色で描く
    cv2.rectangle(img,(x,y),(x+w,y+h),(0,0,255),2)

# 輪郭抽出の結果を右にプロット
plt.subplot(1,2,2)
plt.imshow(cv2.cvtColor(img,cv2.COLOR_BGR2RGB))
plt.show()

subplotの引数の意味は以下の通り。

plt.subplot(行数, 列数, 何番目のプロットか)

 

結果

 

うまく赤色で輪郭が抽出できました。

左上の数字は、輪郭の座標(x軸、y軸、幅、高さ)です。左上がy軸の0になってます。

 

参考

 

「AI・機械学習・深層学習アプリ」

 

以上です。お疲れ様でした。

ABOUTこの記事をかいた人

個人アプリ開発者。Python、Swift、Unityのことを発信します。月間2.5万PVブログ運営。 Twitter:@yamagablog