基于非闭合二值形状的圆与椭圆检测实现葡萄浆果识别
葡萄浆果检测可行方案
方案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
相关产品推荐
相关产品推荐

