霍夫變換不僅可以用來檢測直線,同樣也可以用來檢測圓
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:圓心坐標和半徑值中的小數位數