【OpenCV-Python】チュートリアル:3-14 ハフ円変換

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変換を使用して、グレースケール イメージ上の円
見つけます。通常は、円の中心を検出する方が適切ですが、半径はあまり正確ではありません円の中心のみが検出され、半径は検出されず、半径は検出されます。他の方法を使用してください。のカーネルを使用すると、効果が向上します。minRadiusmaxRadiusHOUGH_GRADIENTmaxRadiusGaussianBlue()7*71.5 * 1.5sigma

  • image : 単一チャネル 8 ビット グレースケール イメージ
  • circles : 返された円の配列 (ベクトル/リスト)、タプル構造( x , y , radius , votes ) (x, y, radius, votes)( x ,y 半径_ _ _ _ _投票_ _ _
  • methodHOUGH_GRADIENT : 検出方法。 、 、HOUGH_STANDARDの 4 種類がありますHOUGH_PROBABILISTICHOUGH_MULTI_SCALE
  • dp : 変換倍率、アキュムレータ解像度と画像解像度の逆比率。の場合dp=1、アキュムレータは入力画像と同じ解像度になります。の場合dp=2、アキュムレータはその幅と高さの半分です。の場合、非常に小さな円を検出する必要がない限り、HOUGH_GRADIENT_ALT推奨値は です。dp=1.5
  • minDist : 最小距離, 円の中心間の最小距離. パラメータが非常に小さい場合, 複数の隣接する円がより多く検出されます. 設定が大きすぎると, 一部の円が見逃されます.
  • param1 : メソッドに依存する最初のパラメーターHOUGH_GRADIENTHOUGH_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: 常に半径と円の中心を返します.

【参考】

  1. OpenCV 公式ドキュメント

おすすめ

転載: blog.csdn.net/zhoujinwang/article/details/128155609
おすすめ