Python OpenCV / 円を検出する

まくまく
まくまく
プラグラミング言語「PYTHON」を使ってみよう!!業務自動化・効率化の実例を踏まえ、解説できればと思っています。対象は、プログラムを学び始めた初心者向けとなります。

今回の内容

  • openCVを用いて画像内の円を検出する
  • 検出した円を描く



使用するのはopenCV

使用するのは、画像処理ライブラリのopenCVです。ここではopenCVがインストールされているのを前提として書き進めていきます。

サンプルコード

#ライブラリをインポート
import cv2
import numpy as np
#画像を読み込み、グレースケールに変換
img = cv2.imread('circletest.jpg',0)
cimg = cv2.cvtColor(img,cv2.COLOR_GRAY2BGR)
#円を検出
circles = cv2.HoughCircles(img,cv2.HOUGH_GRADIENT,1,10,param1=50,param2=30,minRadius=0,maxRadius=0)
circles = np.uint16(np.around(circles))
#検出した円を画像に描き、ファイルを書き出しする
for i in circles[0,:]:
    cv2.circle(cimg,(i[0],i[1]),i[2],(0,255,0),2)
    cv2.circle(cimg,(i[0],i[1]),2,(0,0,255),3)
    cv2.imwrite('detected-circles.jpg',cimg)

元画像


元画像はこちらです。ここに描かれている円を検出します。

処理後


上のプログラムを実行すると、円だけを検出することができました。赤い点は中心点です。

引数の値を変更

cv2.HoughCirclesの引数の値を変更した場合の検出精度をみていきましょう。

cv2.HoughCirclesは、(image, method, dp, minidist, param1, param2, miniRadius, maxRadius)の順に並んでいます。

miniDistを50から10へ


miniDistを50から10へ変更したところ、円が重複されて検出されました。

miniDistでは、検出される円の距離を指定します。この数値を高くすれば、近い円は検出されないため重複を防ぐことができます。

param2を30から10へ


param2を30から10へ変更したところ、誤検出が多くなりました。

param2は、円の中心を検出する閾値です。この値を高くすれば、誤検出を防ぐことができます。ただし高く設定しすぎると、未検出が発生する可能性があります。



タイトルとURLをコピーしました