霍夫圓變換原理
1、從平面座標到極座標轉換是三個參數從C(x0,y0,r)其中x0,y0是圓心
2、假設平面座標的任意一個圓上的點,轉換到極座標中:C(x0,y0,r)處有最大值,霍夫變換正是利用這個原理實現元的檢測。
(上面的一段話,個人不是很理解,先記下來,慢慢理解。)
現實考量:
1、因爲霍夫圓檢測對噪聲比較敏感,所以首先要對圖像做中值濾波。
2、基於效率考慮,OpenCV中實現的霍夫變換圓檢測是基於圖像梯度的實現,分爲兩步
a、檢測邊緣,發現可能的圓心
b、基於第一步的基礎上從候選圓心畫圓。
import cv2 as cv
import numpy as np
def detect_circle_demo(image):
# 中值濾波
dst = cv.pyrMeanShiftFiltering(image, 10, 100)
# 灰度轉換
cimage = cv.cvtColor(dst, cv.COLOR_BGR2GRAY)
# param1、param2分別是高低閾值
circles = cv.HoughCircles(cimage, cv.HOUGH_GRADIENT, 1, 20, param1=50, param2=30, minRadius=0, maxRadius=0)
circles = np.uint16(np.around(circles))
for i in circles[0, :]:
# 繪製圓
cv.circle(image, (i[0], i[1]), i[2], (0, 0, 255), 2)
# 繪製圓心
cv.circle(image, (i[0], i[1]), 2, (255, 0, 0), 2)
cv.imshow('circles', image)
src = cv.imread('C:/Users/Y/Pictures/Saved Pictures/coins.jpg')
cv.namedWindow('input image', cv.WINDOW_AUTOSIZE)
cv.imshow('input image', src)
detect_circle_demo(src)
cv.waitKey(0)
cv.destroyAllWindows()