霍夫圆变换参数调优求助:无法准确定位图像中的圆形
霍夫变换圆形检测优化方案
问题场景
尝试用霍夫变换定位图像中的圆形,但检测效果极差,图像本身清晰度尚可,当前代码如下:
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
相关产品推荐
相关产品推荐

