You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

霍夫圆变换参数调优求助:无法准确定位图像中的圆形

霍夫变换圆形检测优化方案

问题场景

尝试用霍夫变换定位图像中的圆形,但检测效果极差,图像本身清晰度尚可,当前代码如下:

kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5,5))
morph = cv2.morphologyEx(drilling_gray_image, cv2.MORPH_CLOSE, kernel, iterations=2)

cv2_imshow(morph)
plt.figure(figsize=(20, 4))
plt.imshow(morph, cmap='gray', vmin=0, vmax=255)

_, bin_image = cv2.threshold(morph, 128, 255, cv2.THRESH_BINARY)
plt.figure(figsize=(20, 4))
plt.imshow(bin_image, cmap='gray', vmin=0, vmax=255)

rows = bin_image.shape[0]
circles = cv2.HoughCircles(bin_image, cv2.HOUGH_GRADIENT, minDist=10, dp=rows / 16, param1=100, param2=200, minRadius=0, maxRadius=0)
print(circles)

result = drilling_gray_image.copy()
if circles is not None:
  circles = np.uint16(np.around(circles))
  for i in circles[0, :]:
    center = (i[0], i[1])
    # circle center
    cv2.circle(result, center, 1, (0, 100, 100), 3)
    # circle outline
    radius = i[2]
    cv2.circle(result, center, radius, (255, 0, 255), 3)

plt.figure(figsize=(20, 4))
plt.imshow(result, cmap='gray', vmin=0, vmax=255)

优化步骤

1. 替换二值化方式

固定阈值128无法适配图像局部明暗差异,改用Otsu自动阈值法或自适应二值化:

# Otsu自动阈值(适合全局明暗均匀的图)
_, bin_image = cv2.threshold(morph, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)

# 自适应二值化(适合明暗不均的图)
# bin_image = cv2.adaptiveThreshold(morph, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2)

2. 修正霍夫变换核心参数

原参数中param2=200阈值过高,直接过滤掉了有效圆形的累加信号;dp=rows/16会导致检测分辨率过低。调整后参数如下:

rows = bin_image.shape[0]
circles = cv2.HoughCircles(
    bin_image, 
    cv2.HOUGH_GRADIENT, 
    dp=1.2,  # 降低dp值,提升检测精度
    minDist=rows//8,  # 最小圆心间距,避免重复检测
    param1=50,  # 降低Canny高阈值,保留更多有效边缘
    param2=30,  # 大幅降低累加器阈值,捕捉圆形信号
    minRadius=20,  # 根据实际圆形尺寸设置最小半径,过滤噪点
    maxRadius=100  # 设置最大半径,减少无效计算
)

3. 优化形态学操作

原操作的核尺寸和迭代次数可能过度模糊边缘,调整为:

kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3,3))
morph = cv2.morphologyEx(drilling_gray_image, cv2.MORPH_CLOSE, kernel, iterations=1)

4. 改用边缘图输入霍夫变换

先对形态学处理后的图像做Canny边缘检测,用边缘图替代二值图,检测精度更高:

edges = cv2.Canny(morph, 50, 150)
circles = cv2.HoughCircles(edges, cv2.HOUGH_GRADIENT, dp=1.2, minDist=rows//8, param1=50, param2=30, minRadius=20, maxRadius=100)

内容的提问来源于stack exchange,提问作者p4rzival

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 00:07:24