OpenCV 霍夫圓

Ammar Ali 2024年2月15日
OpenCV 霍夫圓

本教程將討論在 Python 中使用 OpenCV 的 HoughCircles() 函式檢測影象中的圓圈。

在 Python 中使用 OpenCV 的 HoughCircles() 函式檢測影象中的圓圈

我們可以使用 OpenCV 的 HoughCircles() 函式來檢測影象中存在的圓圈。HoughCircles() 函式使用 Hough 變換來查詢灰度影象中存在的圓圈。

霍夫變換從影象中提取特徵,然後使用投票程式確定影象中存在的物件的形狀。

HoughCircles() 的第一個引數是我們想要檢測圓圈的影象,它應該是灰度的。第二個引數是用於檢測圓圈的方法。

霍夫模式包含 cv2.HOUGH_STANDARD,經典或標準霍夫變換,cv2.HOUGH_PROBABILISTIC 是概率霍夫變換,如果影象中存在長線性段,cv2.HOUGH_MULTI_SCALE,多尺度經典霍夫變換的變體,cv2.HOUGH_GRADIENTcv2.GRADIENT_ALT

第三個引數是累加器解析度和影象解析度的比值。如果比率為 1,則累加器和影象解析度相等,如果比率為 2,則累加器的寬度和高度將變為一半。

cv2.HOUGH_GRADIENT_ALT 方法的推薦比率為 1.5。第四個引數是兩個圓的中心之間的最小距離。

第五個引數是第一個方法的特定引數。在 cv2.HOUGH_GRADIENTcv2.HOUGH_GRADIENT_ALT 的情況下,第五個引數將用作 Canny 邊緣檢測器的閾值。

第六個引數是第二種方法的具體引數;在 cv2.HOUGH_GRADIENT 的情況下,第六個引數將用作圓心的閾值。

cv2.HOUGH_GRADIENT_ALT 的情況下,第六個引數將用作圓的完美值。第七個引數是最小圓半徑,第八個是最大圓半徑。

例如,讓我們使用 HoughCircles() 函式檢測影象中存在的圓圈,並使用 OpenCV 的 circle() 函式在原始影象上繪製檢測到的圓圈及其中心。

請參閱下面的程式碼。

import numpy as np
import cv2 as cv

src_img = cv.imread("blob1.jpg", 0)
color_img = cv.cvtColor(src_img, cv.COLOR_GRAY2BGR)
circles_img = cv.HoughCircles(
    src_img, cv.HOUGH_GRADIENT, 1, 20, param1=50, param2=30, minRadius=0, maxRadius=0
)
circles_img = np.uint16(np.around(circles_img))
for i in circles_img[0, :]:
    cv.circle(color_img, (i[0], i[1]), i[2], (0, 255, 0), 2)
    cv.circle(color_img, (i[0], i[1]), 2, (0, 0, 255), 3)

cv.imshow("Original Image", src_img)
cv.imshow("Detected Circles", color_img)
cv.waitKey(0)
cv.destroyAllWindows()

輸出:

霍夫圓

我們可以根據給定的影象更改 HoughCircles() 的引數。numpy 庫的 around() 函式用於將圓形值四捨五入到最接近的整數。

我們還可以通過更改 circle() 函式的第四個引數(BGR 三元組)來更改在影象上繪製的圓圈的顏色和圓圈的中心。

作者: Ammar Ali
Ammar Ali avatar Ammar Ali avatar

Hello! I am Ammar Ali, a programmer here to learn from experience, people, and docs, and create interesting and useful programming content. I mostly create content about Python, Matlab, and Microcontrollers like Arduino and PIC.

LinkedIn Facebook

相關文章 - OpenCV Image