Pythonでいろいろやってみる

Pythonを使った画像処理や機械学習などの簡単なプログラムを載せています。

円の数を数える

やること
  • ファイル名を指定して画像ファイル読み出す
  • ファイル名を指定して画像ファイルをグレースケールで読み出し二値化する
  • 二値化画像から輪郭抽出し、輪郭の個数を表示。元画像に輪郭を赤で重ね書きし別ウィンドウで表示する
  • キー入力で表示用ウィンドウを破棄し終了
使った関数
  • cv2.imread : 画像ファイルの読み出し
    第2引数にcv2.IMREAD_GRAYSCALE(または0)を指定することでグレースケール変換し読み出す
  • cv2.threshold : 画像の閾値処理
  • cv2.findContours:輪郭抽出処理
  • cv2.drawContours:輪郭描画処理
  • cv2.imshow : 画像を別ウィンドウに表示する
  • len:コンテナ型オブジェクトのサイズを取得する
環境
  • windows10 home
  • Anaconda 3/ jupyter notebook 5.6.0
  • Python 3.7.0
  • OpenCV 4.0.0

準備

画像ファイルはランダムな位置に複数の円を描画するで作成した10個の円の画像を、"random_circle.png"というファイル名で、jupyter notebookファイル(***.ipynb)と同じディレクトリに保存しました。

f:id:T_A_T:20190304213751p:plain
元画像

コード

※cv2.findContoursの戻り値はこのブログで使っているOpenCV 4では2つですが、前バージョンOpenCV 3では3つで書式が異なります

import cv2  #OpenCVのインポート

fname="random_circle.png" #開く画像ファイル名
threshold=127 #二値化閾値

img_color= cv2.imread(fname) #画像を読み出しオブジェクトimg_colorに代入
img_gray = cv2.imread(fname,cv2.IMREAD_GRAYSCALE) #画像をグレースケールで読み出しオブジェクトimg_grayに代入

ret, img_binary= cv2.threshold(img_gray, threshold, 255, cv2.THRESH_BINARY) #オブジェクトimg_grayを閾値threshold(127)で二値化しimg_binaryに代入
contours, hierarchy = cv2.findContours(img_binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) #img_binaryを輪郭抽出
cv2.drawContours(img_color, contours, -1, (0,0,255), 2) #抽出した輪郭を赤色でimg_colorに重ね書き
print(len(contours)) #抽出した輪郭の個数を表示する

cv2.imshow("contours",img_color) #別ウィンドウを開き(ウィンドウ名 "contours")オブジェクトimg_colorを表示

cv2.waitKey(0) #キー入力待ち
cv2.destroyAllWindows() #ウインドウを閉じる

cv2.findContoursの戻り値contoursには各輪郭の座標データがNumpyのarray形式で収められています。コンテナ型オブジェクトのサイズを求めるlen関数で求めたcontoursのサイズが輪郭の個数になります

実行結果

抽出された輪郭の個数が表示されます

10

別ウィンドウが開き、赤で輪郭抽出した画像が表示されます

f:id:T_A_T:20190304213949p:plain
輪郭抽出結果

以下のサイトを参考にさせていただきました

OpenCV-Python Tutorials >> 輪郭: 初めの一歩
OpenCV公式 >> Contours : Getting Started

ブログランキングに参加しています

にほんブログ村 IT技術ブログへ
にほんブログ村