.霍夫圓變換的基本原理和霍夫線變換原理類似傍妒,只是點對應(yīng)的二維極徑、極角空間被三維的圓心和半徑空間取代。在標(biāo)準(zhǔn)霍夫圓變換中拢军,原圖像的邊緣圖像的任意點對應(yīng)的經(jīng)過這個點的所有可能圓在三維空間用圓心和半徑這三個參數(shù)來表示屯吊,其對應(yīng)一條三維空間的曲線送巡。對于多個邊緣點,點越多盒卸,這些點對應(yīng)的三維空間曲線交于一點的數(shù)量越多骗爆,那么他們經(jīng)過的共同圓上的點就越多,類似的我們也就可以用同樣的閾值的方法來判斷一個圓是否被檢測到蔽介,這就是標(biāo)準(zhǔn)霍夫圓變換的原理摘投, 但也正是在三維空間的計算量大大增加的原因,標(biāo)準(zhǔn)霍夫圓變化很難被應(yīng)用到實際中虹蓄。
2.OpenCV實現(xiàn)的是一個比標(biāo)準(zhǔn)霍夫圓變換更為靈活的檢測方法——霍夫梯度法犀呼,該方法運算量相對于標(biāo)準(zhǔn)霍夫圓變換大大減少。其檢測原理是依據(jù)圓心一定是在圓上的每個點的模向量上薇组,這些圓上點模向量的交點就是圓心外臂,霍夫梯度法的第一步就是找到這些圓心,這樣三維的累加平面就又轉(zhuǎn)化為二維累加平面律胀。第二步是根據(jù)所有候選中心的邊緣非0像素對其的支持程度來確定半徑专钉。注:模向量即是圓上點的切線的垂直線挑童。
霍夫圓檢測原理參考:
https://blog.csdn.net/dcrmg/article/details/52506538
import cv2 as cv
import numpy
def hough_circle_demo(image):
# 霍夫圓檢測對噪聲敏感,邊緣檢測消噪
dst = cv.pyrMeanShiftFiltering(image, 10, 100) # 邊緣保留濾波EPF
gray = cv.cvtColor(dst, cv.COLOR_BGR2GRAY)
circles = cv.HoughCircles(gray, cv.HOUGH_GRADIENT, 1, 20, param1=50, param2=30, minRadius=0, maxRadius=0)
circles = numpy.uint16(numpy.around(circles)) #把circles包含的圓心和半徑的值變成整數(shù)
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("circle image", image)
src = cv.imread("./data/coins.png", cv.IMREAD_COLOR)
cv.namedWindow("coins", cv.WINDOW_AUTOSIZE)
cv.imshow("coins", src)
hough_circle_demo(src)
cv.waitKey(0)
cv.destroyAllWindows()
運行結(jié)果
API
1.OpenCV的霍夫圓變換函數(shù)原型為:HoughCircles(image, method, dp, minDist[, circles[, param1[, param2[, minRadius[, maxRadius]]]]]) -> circles
image參數(shù)表示8位單通道灰度輸入圖像矩陣跃须。
method參數(shù)表示圓檢測方法站叼,目前唯一實現(xiàn)的方法是HOUGH_GRADIENT。
dp參數(shù)表示累加器與原始圖像相比的分辨率的反比參數(shù)菇民。例如尽楔,如果dp = 1,則累加器具有與輸入圖像相同的分辨率第练。如果dp=2阔馋,累加器分辨率是元素圖像的一半,寬度和高度也縮減為原來的一半娇掏。
minDist參數(shù)表示檢測到的兩個圓心之間的最小距離呕寝。如果參數(shù)太小,除了真實的一個圓圈之外婴梧,可能錯誤地檢測到多個相鄰的圓圈下梢。如果太大,可能會遺漏一些圓圈塞蹭。
circles參數(shù)表示檢測到的圓的輸出向量孽江,向量內(nèi)第一個元素是圓的橫坐標(biāo),第二個是縱坐標(biāo)番电,第三個是半徑大小岗屏。
param1參數(shù)表示Canny邊緣檢測的高閾值,低閾值會被自動置為高閾值的一半漱办。
param2參數(shù)表示圓心檢測的累加閾值这刷,參數(shù)值越小,可以檢測越多的假圓圈娩井,但返回的是與較大累加器值對應(yīng)的圓圈暇屋。
minRadius參數(shù)表示檢測到的圓的最小半徑。
maxRadius參數(shù)表示檢測到的圓的最大半徑撞牢。
2.OpenCV畫圓的circle函數(shù)原型:circle(img, center, radius, color[, thickness[, lineType[, shift]]]) -> img
img參數(shù)表示源圖像。
center參數(shù)表示圓心坐標(biāo)叔营。
radius參數(shù)表示圓的半徑屋彪。
color參數(shù)表示設(shè)定圓的顏色。
thickness參數(shù):如果是正數(shù)绒尊,表示圓輪廓的粗細(xì)程度。如果是負(fù)數(shù),表示要繪制實心圓筹误。
lineType參數(shù)表示圓線條的類型。
shift參數(shù)表示圓心坐標(biāo)和半徑值中的小數(shù)位數(shù)躯泰。