Python+OpenCV圖像處理之圓檢測


霍夫變換不僅可以用來檢測直線,同樣也可以用來檢測圓

python實現

import cv2
import numpy as np


__author__ = "boboa"


def detect_circles_demo(image):
    dst = cv2.pyrMeanShiftFiltering(image, 10, 100)  # 均值偏移濾波
    cimage = cv2.cvtColor(dst, cv2.COLOR_BGR2GRAY)
    circles = cv2.HoughCircles(cimage, cv2.HOUGH_GRADIENT, 1, 20, param1=50, param2=40, minRadius=0, maxRadius=0)
    # 整數化,#把circles包含的圓心和半徑的值變成整數
    circles = np.uint16(np.around(circles))
    for i in circles[0, :]:
        # 畫出外邊圓
        cv2.circle(image, (i[0], i[1]), i[2], (0, 255, 0), 2)
        # 畫出圓心
        cv2.circle(image, (i[0], i[1]), 2, (0, 0, 255), 3)
    cv2.imshow("circles", image)


if __name__ == "__main__":
    img = cv2.imread("image/circles.jpg")
    cv2.namedWindow("input image", cv2.WINDOW_AUTOSIZE)
    cv2.imshow("input image", img)
    detect_circles_demo(img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

運行結果如下,效果並不是很好,可能是參數設置的不好,利用霍夫變換來檢測圓很容易受到噪聲的干擾,而且不能檢測橢圓,找不到同心圓

cv2.HoughCircles(image, method, dp, minDist, circles, param1, param2, minRadius, maxRadius)

參數:
  image:輸入圖像,必須是灰度圖像

  method:檢測方法,常用CV_HOUGH_GRADIENT

  dp:檢測內側圓心的累加器圖像的分辨率於輸入圖像之比的倒數,如dp=1,累加器和輸入圖像具有相同的分辨率,如果dp=2,累計器便有輸入圖像一半那么大的寬度和高度

  minDist: 兩個圓心之間的最小距離

  param1: 是method方法的參數,在CV_HOUGH_GRADIENT表示傳入canny邊緣檢測的閾值

  param2:對當前唯一的方法霍夫梯度法cv2.HOUGH_GRADIENT,它表示在檢測階段圓心的累加器閾值

                    它越小,就越可以檢測到更多根本不存在的圓,而它越大的話,能通過檢測的圓就更加接近完美的圓形了

  minRadius:默認值0,圓半徑的最小值

  maxRadius:默認值0,圓半徑的最大值

 

cv2.circle是畫圓函數(img, center, radius, color[, thickness[, lineType[, shift]]]) -> img

參數:img:源圖像

     center:圓心坐標

     radius:圓的半徑

     color:設定圓的顏色

     thickness:如果是正數,表示圓輪廓的粗細程度。如果是負數,表示要繪制實心圓

     lineType:圓線條的類型

     shift:圓心坐標和半徑值中的小數位數

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM