
まくまく
プラグラミング言語「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は、円の中心を検出する閾値です。この値を高くすれば、誤検出を防ぐことができます。ただし高く設定しすぎると、未検出が発生する可能性があります。