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

基于非闭合二值形状的圆与椭圆检测实现葡萄浆果识别

葡萄浆果检测可行方案

方案1:基于霍夫变换的圆形/椭圆形检测(适配现有预处理流程)

该方案无需引入额外模型,可直接基于你已生成的边缘图运行,通过严格的参数控制可保证检出结果的准确率,刚好匹配你仅需30%-40%高可信检出的需求。

实现思路

  • 调用cv2.HoughCircles对边缘图做圆形检测,通过限制半径范围、提高累加器阈值,仅保留置信度最高的圆形检测结果,避免误检
  • 对圆形检测未覆盖的区域,可提取闭合轮廓后用cv2.fitEllipse做椭圆拟合,补充部分偏椭圆形的浆果检出

代码示例(接你现有预处理代码)

# -------------- 圆形检测 --------------
# 可根据你的实际浆果大小调整minRadius、maxRadius,param2越高检测越严格
circles = cv.HoughCircles(edges, cv.HOUGH_GRADIENT, dp=1.2, minDist=20,
                          param1=50, param2=30, minRadius=5, maxRadius=30)
if circles is not None:
    circles = np.uint16(np.around(circles))
    for i in circles[0, :]:
        # 绘制圆和圆心
        cv.circle(img_rgb, (i[0], i[1]), i[2], (0, 255, 0), 2)
        cv.circle(img_rgb, (i[0], i[1]), 2, (0, 0, 255), 3)

# -------------- 补充椭圆检测 --------------
contours, _ = cv.findContours(edges, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)
for cnt in contours:
    # 过滤过小的轮廓
    if cv.contourArea(cnt) < 50:
        continue
    # 轮廓至少有5个点才能拟合椭圆
    if len(cnt) >= 5:
        ellipse = cv.fitEllipse(cnt)
        # 过滤长宽比过大的非浆果轮廓
        if max(ellipse[1]) / min(ellipse[1]) < 1.5:
            cv.ellipse(img_rgb, ellipse, (255, 0, 0), 2)

方案2:闭合轮廓特征筛选(抗干扰性更优)

该方案通过轮廓的几何特征筛选浆果,误检率比霍夫变换更低,适合边缘存在少量干扰的场景。

实现思路

  • 对预处理得到的边缘图执行一次形态学闭运算,连接断裂的浆果轮廓,生成更多闭合的单浆果轮廓
  • 提取所有外部轮廓,通过面积、长宽比、圆形度三个核心特征筛选符合浆果特征的轮廓:
    • 面积:过滤过小的噪声轮廓和过大的整串葡萄轮廓
    • 长宽比:单个浆果的长宽比通常小于1.5
    • 圆形度:计算公式为4 * π * 轮廓面积 / (轮廓周长²),越接近1说明形状越接近圆形,可设置阈值≥0.75筛选
  • 对筛选通过的轮廓做最小外接圆/椭圆拟合,即可直接提取半径、面积、长短轴等所需指标

代码示例(核心筛选逻辑)

# 边缘图闭运算,连接断裂轮廓
closed_edges = cv.morphologyEx(edges, cv.MORPH_CLOSE, kernel=np.ones((3,3), np.uint8), iterations=2)
contours, _ = cv.findContours(closed_edges, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)
for cnt in contours:
    area = cv.contourArea(cnt)
    # 面积过滤,可根据实际浆果大小调整阈值
    if not 50 < area < 1000:
        continue
    # 长宽比过滤
    x,y,w,h = cv.boundingRect(cnt)
    if max(w,h)/min(w,h) > 1.5:
        continue
    # 圆形度过滤
    perimeter = cv.arcLength(cnt, True)
    circularity = 4 * np.pi * area / (perimeter ** 2)
    if circularity < 0.75:
        continue
    # 符合要求的浆果,绘制外接圆
    (cx, cy), radius = cv.minEnclosingCircle(cnt)
    cv.circle(img_rgb, (int(cx), int(cy)), int(radius), (0,255,0), 2)

方案3:轻量深度学习检测(准确率最高,适合有标注数据场景)

如果你有少量标注数据,该方案可以得到比传统CV方法更高的检出准确率:

  • 选用YOLOv8n、YOLOv5n等最小规格的目标检测模型,仅需标注100张左右的葡萄浆果图像即可完成微调
  • 推理时仅保留置信度排名前30%-40%的检测结果,可保证检出结果的准确率接近100%,完全满足你的需求

参数调整建议

由于你不需要检出全部浆果,所有方案都可以将筛选阈值设置得更严格,比如进一步提高圆形度要求、提高霍夫变换的param2阈值,只保留特征最典型的浆果,最大程度降低误检率。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 01:57:00