天天看點

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()      

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

Python+OpenCV圖像處理之圓檢測

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:圓心坐标和半徑值中的小數位數

轉載于:https://www.cnblogs.com/qianxia/p/11102409.html