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

OpenCV HoughCircles检测时钟圆形超界问题:原因排查与解决方案

我正在使用OpenCV的HoughCircles对时钟图像进行简单圆形检测,但无论如何调整参数,甚至增加额外模糊处理,检测结果始终不正确,检测出的圆形超出图像范围。以下是所用代码:

import cv2
import numpy as np
from google.colab.patches import cv2_imshow

#edge detection
image = cv2.imread('cl.jpg')

image = cv2.resize(image, (int(image.shape[0]/3), int(image.shape[1]/3)))

image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
image = cv2.GaussianBlur(image, (3, 3), 0)
canny = cv2.Canny(image, 30, 150)

#circle detection
img = cv2.medianBlur(image,7)
cimg = cv2.cvtColor(img,cv2.COLOR_GRAY2BGR)

circles = cv2.HoughCircles(canny,cv2.HOUGH_GRADIENT,1,10,
                            param1=30,param2=50,minRadius=0,maxRadius=0)

circles = np.uint16(np.around(circles))
for i in circles[0,:]:
  max_circle = max(circles[0,:], key=lambda x:x[2])

  i = max_circle
  #outer circle
  cv2.circle(cimg,(i[0],i[1]),i[2],(0,255,0),2)
  #center of the circle
  cv2.circle(cimg,(i[0],i[1]),2,(0,0,255),3)
print(max_circle)

cv2_imshow(cimg)
问题分析
  • Resize参数顺序错误:cv2.resize的第二个参数格式是(目标宽度, 目标高度),但你写的是(int(image.shape[0]/3), int(image.shape[1]/3))——image.shape[0]是图像高度,shape[1]是宽度,这会直接导致图像拉伸变形,圆形被拉成椭圆,HoughCircles自然无法正确识别,甚至检测出超出图像范围的错误圆形。
  • 预处理冗余混乱:你先后做了GaussianBlur和medianBlur,还分别用Canny边缘图和medianBlur后的图做交叉处理,流程重复会干扰边缘检测结果。
  • HoughCircles参数与逻辑问题:minRadius=0, maxRadius=0会让函数无限制检测任意大小的圆,极易出现超大异常圆;同时循环逻辑冗余,每次循环都重复查找最大半径的圆并绘制,完全没必要。
最优解决方法
  1. 修正Resize参数顺序:把resize参数改成(int(image.shape[1]/3), int(image.shape[0]/3)),保证图像比例不变,避免圆形变形。
  2. 简化预处理流程:统一用medianBlur去除噪声(比GaussianBlur更适合处理椒盐噪声),再做Canny边缘检测;或者直接将模糊后的灰度图传入HoughCircles,因为HOUGH_GRADIENT算法内部会自动计算边缘。
  3. 合理限制圆半径范围:根据时钟图像的实际尺寸,设置minRadius和maxRadius的区间,比如假设时钟占图像大部分区域,可设minRadius=int(图像高度/4), maxRadius=int(图像高度/2),从根源上避免检测出超出图像的圆。
  4. 优化绘制逻辑:找到最大半径的圆后只绘制一次,无需遍历所有检测结果做重复操作。
修改后的代码
import cv2
import numpy as np
from google.colab.patches import cv2_imshow

# 读取图像并按比例缩放
image = cv2.imread('cl.jpg')
# 修正resize参数:(宽度, 高度)
image = cv2.resize(image, (int(image.shape[1]/3), int(image.shape[0]/3)))
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# 预处理:中值模糊去噪+平滑边缘
blurred = cv2.medianBlur(gray, 7)
canny = cv2.Canny(blurred, 50, 150)

# 圆形检测:限制半径范围,调整参数
circles = cv2.HoughCircles(
    canny,
    cv2.HOUGH_GRADIENT,
    dp=1,
    minDist=20,  # 增大圆心最小距离,避免重复检测
    param1=50,
    param2=30,   # 降低阈值更容易检测到目标圆,可根据实际图像微调
    minRadius=int(blurred.shape[0]/4),
    maxRadius=int(blurred.shape[0]/2)
)

# 绘制检测结果
cimg = cv2.cvtColor(blurred, cv2.COLOR_GRAY2BGR)
if circles is not None:
    circles = np.uint16(np.around(circles))
    max_circle = max(circles[0,:], key=lambda x: x[2])
    cv2.circle(cimg, (max_circle[0], max_circle[1]), max_circle[2], (0,255,0), 2)
    cv2.circle(cimg, (max_circle[0], max_circle[1]), 2, (0,0,255), 3)
    print(max_circle)

cv2_imshow(cimg)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 23:55:12