OpenCV 霍夫圆检测
圓的表示式是:
其中aa和bb表示圓心坐標,rr表示圓半徑,因此標準的霍夫圓檢測就是在這三個參數組成的三維空間累加器上進行圓形檢測,此時效率就會很低,所以OpenCV中使用霍夫梯度法進行圓形的檢測。
霍夫梯度法將霍夫圓檢測范圍兩個階段,第一階段檢測圓心,第二階段利用圓心推導出圓半徑。
-
圓心檢測的原理:圓心是圓周法線的交匯處,設置一個閾值,在某點的相交的直線的條數大于這個閾值就認為該交匯點為圓心。
-
圓半徑確定原理:圓心到圓周上的距離(半徑)是相同的,確定一個閾值,只要相同距離的數量大于該閾值,就認為該距離是該圓心的半徑。
原則上霍夫變換可以檢測任何形狀,但復雜的形狀需要的參數就多,霍夫空間的維數就多,因此在程序實現上所需的內存空間以及運行效率上都不利于把標準霍夫變換應用于實際復雜圖形的檢測中。霍夫梯度法是霍夫變換的改進,它的目的是減小霍夫空間的維度,提高效率。
cv2.HoughCircles()函數:
circles = cv.HoughCircles(image, method, dp, minDist, param1=100, param2=100, minRadius=0,maxRadius=0 )-
image:輸入圖像,應輸入灰度圖像
-
method:使用霍夫變換圓檢測的算法,它的參數是CV_HOUGH_GRADIENT
-
dp:霍夫空間的分辨率,dp=1時表示霍夫空間與輸入圖像空間的大小一致,dp=2時霍夫空間是輸入圖像空間的一半,以此類推
-
minDist為圓心之間的最小距離,如果檢測到的兩個圓心之間距離小于該值,則認為它們是同一個圓心
-
param1:邊緣檢測時使用Canny算子的高閾值,低閾值是高閾值的一半。
-
param2:檢測圓心和確定半徑時所共有的閾值
-
minRadius和maxRadius為所檢測到的圓半徑的最小值和最大值
返回:
- circles:輸出圓向量,包括三個浮點型的元素——圓心橫坐標,圓心縱坐標和圓半徑
由于霍夫圓檢測對噪聲比較敏感,所以首先對圖像進行中值濾波。
import cv2 as cv import matplotlib.pyplot as plt import numpy as np# 1 讀取圖像,并轉換為灰度圖 planets = cv.imread("./1.jpg") gay_img = cv.cvtColor(planets, cv.COLOR_BGRA2GRAY)# 2 進行中值模糊,去噪點 img = cv.medianBlur(gay_img, 7)# 3 霍夫圓檢測 circles = cv.HoughCircles(img, cv.HOUGH_GRADIENT, 1.4, 100, param1=200, param2=90, minRadius=0, maxRadius=400)# 4.整數化,#把circles包含的圓心和半徑的值變成整數 circles = np.uint16(np.around(circles)) # 5 將檢測結果繪制在圖像上 for i in circles[0, :]: # 遍歷矩陣每一行的數據# 繪制圓形cv.circle(planets, (i[0], i[1]), i[2], (0, 255, 0), 2)# 繪制圓心cv.circle(planets, (i[0], i[1]), 2, (0, 0, 255), -1)# 6 圖像顯示 plt.figure(figsize=(10, 8), dpi=100) plt.imshow(planets[:, :, ::-1]) plt.title('霍夫變換圓檢測') plt.xticks([]), plt.yticks([]) plt.show()注意:在使用circle()函數時,傳遞的circles包含的圓心和半徑的值需要變成整數,否則會出現以下錯誤
原圖
總結
以上是生活随笔為你收集整理的OpenCV 霍夫圆检测的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OpenCV 霍夫线检测
- 下一篇: OpenCV Harris角点检测