こんにちは。のっくん(@yamagablog)です。
この記事では、画像に写っている物体の輪郭抽出の方法をご説明します。
「Pythonで物体の輪郭を抽出したい」
「Pythonで画像処理をしてみたい」
そんな方に読んでいただければと思います。
目次
ステップ
輪郭を抽出するステップ
・画像を読み込む
・グレースケールにする
・ブラーでボヤかす
・2値化する
・輪郭を検出する
・グレースケールにする
・ブラーでボヤかす
・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・機械学習・深層学習アプリ」
以上です。お疲れ様でした。