OpenCV Python ハフ円変換
【目標】
- ハフ変換で円を検出する方法を学ぶ
- cv2.HoughCircles()
【仮説】
円の数式は
( x − xcenter ) 2 + ( y − ycenter ) 2 = r 2 (x-x_{center})^2 + (y-y_{center})^2 = r^2( ×−バツセンター_ _ _)2+( _−yセンター_ _ _)2=r2
其中( xcenter , ycenter ) (x_{center}, y_{center})( ×センター_ _ _、yセンター_ _ _)は円の中心、rrrは半径です。式から、3 つのパラメーターがあることがわかります。そのため、ハフ変換には 3D アキュムレータが必要ですが、これは非常に効果的ではありません。そのため、OpenCV はトリッカー メソッドを使用し、ハフ勾配メソッドはエッジ勾配情報を使用します。
【コード】
import numpy as np
import cv2
img = cv2.imread("assets/opencv-logo.png", 0)
img = cv2.medianBlur(img, 5)
img_color = cv2.imread("assets/opencv-logo.png", 1)
circles = cv2.HoughCircles(img, method=cv2.HOUGH_GRADIENT, dp=1.2, minDist=3,
param1=150, param2=50, minRadius=30, maxRadius=400)
circles = np.uint16(np.around(circles))
for i in circles[0, :]:
# draw the outer circle
cv2.circle(img_color, (i[0], i[1]), i[2], (0, 255, 0), 2)
# draw the center of the circle
cv2.circle(img_color, (i[0], i[1]), 2, (0, 0, 255), 3)
cv2.imshow("detected circles", img_color)
cv2.waitKey(0)
cv2.destroyAllWindows()
【インターフェース】
- ハフサークル()
cv2.HoughCircles( image, method, dp, minDist[, circles[, param1[, param2[, minRadius[, maxRadius]]]]] ) -> circles
Hough
変換を使用して、グレースケール イメージ上の円を
見つけます。通常は、円の中心を検出する方が適切ですが、半径はあまり正確ではありません。円の中心のみが検出され、半径は検出されず、半径は検出されます。他の方法を使用してください。のカーネルを使用すると、効果が向上します。minRadius
maxRadius
HOUGH_GRADIENT
maxRadius
GaussianBlue()
7*7
1.5 * 1.5
sigma
- image : 単一チャネル 8 ビット グレースケール イメージ
- circles : 返された円の配列 (ベクトル/リスト)、タプル構造( x , y , radius , votes ) (x, y, radius, votes)( x ,y 、半径、_ _ _ _ _投票)_ _ _
- method
HOUGH_GRADIENT
: 検出方法。 、 、HOUGH_STANDARD
、の 4 種類がありますHOUGH_PROBABILISTIC
。HOUGH_MULTI_SCALE
- dp : 変換倍率、アキュムレータ解像度と画像解像度の逆比率。の場合
dp=1
、アキュムレータは入力画像と同じ解像度になります。の場合dp=2
、アキュムレータはその幅と高さの半分です。の場合、非常に小さな円を検出する必要がない限り、HOUGH_GRADIENT_ALT
推奨値は です。dp=1.5
- minDist : 最小距離, 円の中心間の最小距離. パラメータが非常に小さい場合, 複数の隣接する円がより多く検出されます. 設定が大きすぎると, 一部の円が見逃されます.
- param1 : メソッドに依存する最初のパラメーター
HOUGH_GRADIENT
。HOUGH_GRIDIENT_ALT
と の場合は、Canny
エッジ(低い方のしきい値は 2 倍小さくなります)。画像の勾配はアルゴリズムをHOUGH_GRADIENT_ALT
使用して計算されるため、通常はしきい値を高くする必要があることに注意してください。Scharr
- param2 : メソッドに関連する 2 番目のパラメーター. HOUGH_GRADIENT の場合, 円の中心を検出するためのアキュムレータのしきい値です. 小さいほど、偽の円が検出される可能性があります. より大きいアキュムレータ値に対応する円が最初に返されます。HOUGH_GRADIENT_ALT の場合、これは円の「完全性」の尺度であり、1 に近いほど、アルゴリズムによって円が適切に選択されます。ほとんどの場合、小さなものをより適切に検出したい場合は、0.9 が適切です。円、0.85、0.8 以下に下げることができます。また、多くの偽円を避けるために、検索範囲を [minRadius, maxRadius] に制限してみてください。
- minRadius : 最小半径
- maxRadius : 最大半径,
If <= 0
, 画像の最大寸法を使用します,If < 0
,HOUGH_GRADIENT
: 円の中心のみを返し、半径は返しません.HOUGH_GRADIENT_ALT
: 常に半径と円の中心を返します.