本章將介紹如何利用霍夫轉換偵測影像中的圓形,並應用於實際案例,例如車輪、零件或硬幣辨識。透過參數調整與前處理,可提升圓形偵測的準確度與穩定性。
標準直線霍夫轉換是將直線表示為 (ρ, θ)
。
對於圓,則使用方程式:
[(x - a)^2 + (y - b)^2 = r^2]
其中:
(a, b)
為圓心座標r
為半徑在參數空間中,若許多邊緣點同時符合相同 (a, b, r)
,則累加器值增加,最終被判定為圓。
OpenCV 提供 cv2.HoughCircles()
來檢測圓形,建議搭配高斯模糊降噪,提升偵測穩定度。
請準備一張圖片 clock.jpg
(可用硬幣、鐘面或其他有圓形物件的圖片)。
import cv2
import numpy as np
# 讀取影像
img = cv2.imread("clock.jpg")
output = img.copy()
# 轉為灰階
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 高斯模糊,降低雜訊
gray_blur = cv2.GaussianBlur(gray, (9, 9), 2)
cv2.imshow("Original", img)
cv2.imshow("Gray Blur", gray_blur)
# 將以下程式碼放在所有顯示語句的最後面
cv2.waitKey()
cv2.destroyAllWindows()
# 使用霍夫轉換找圓
circles = cv2.HoughCircles(
gray_blur,
cv2.HOUGH_GRADIENT,
dp=1,
minDist=30,
param1=100,
param2=30,
minRadius=10,
maxRadius=80
)
# 如果有找到圓,繪製在圖像上
if circles is not None:
circles = np.uint16(np.around(circles))
for (x, y, r) in circles[0, :]:
# 繪製圓形邊界
cv2.circle(output, (x, y), r, (0, 255, 0), 2)
# 標示圓心位置
cv2.circle(output, (x, y), 2, (0, 0, 255), 3)
cv2.imshow("Detected Circles", output)
dp
:累加器解析度與影像解析度比值,通常設為 1 或 2。minDist
:圓心之間的最小距離,避免檢測到過多重疊圓。param1
:邊緣檢測的高閾值 (Canny),影響邊緣偵測敏感度。param2
:累加器門檻值,越低會檢測到更多假圓,越高則只保留明顯圓。minRadius
與 maxRadius
:限制檢測圓的半徑範圍,避免誤判。常見應用:
方法 | 適用場景 | 優點 | 缺點 |
---|---|---|---|
HoughCircles | 圓形物件偵測 | 參數彈性高、可偵測多圓 | 對雜訊敏感、需前處理 |
HoughCircles 適合偵測多個圓形物件,參數可依需求調整。若雜訊多或圓形邊緣不明顯,建議加強前處理(如模糊、二值化)。
霍夫圓轉換是檢測影像中圓形物件的強大工具。只要適當調整參數並加強前處理,就能靈活應用於各種場景,從日常影像處理到工業自動化檢測。