如何在Python OpenCV中优化轮廓以获得平滑闭合的圆形形状?
实现方案
核心逻辑是利用你最终需要的是圆形的先验,直接基于有效轮廓点拟合标准外接圆,一步解决顶部畸变、缺口填补、闭合三个需求,不需要对原始轮廓做复杂的逐点修正。
具体实现步骤
- 先收集所有符合面积筛选条件的轮廓坐标点
- 可选操作:过滤掉顶部属于进料管干扰的异常点,避免这部分点影响拟合结果
- 调用OpenCV内置的最小外接圆拟合接口得到标准圆形参数
- 绘制最终的闭合圆形即可
可直接运行的修改后代码
contours, hierarchy = cv2.findContours(mask1, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE) all_valid_points = [] if len(contours) != 0: for contour in contours: if cv2.contourArea(contour) > 500: # 提取当前轮廓的所有坐标点存入列表 all_valid_points.extend(contour[:, 0, :].tolist()) all_valid_points = np.array(all_valid_points, dtype=np.int32) # 过滤顶部畸变区域:去掉y坐标最小的前5%的点,阈值可根据实际畸变范围调整 y_coords = all_valid_points[:, 1] top_filter_threshold = np.percentile(y_coords, 5) filtered_points = all_valid_points[all_valid_points[:, 1] > top_filter_threshold] # 拟合最小外接圆,自动得到标准圆形参数 (circle_x, circle_y), radius = cv2.minEnclosingCircle(filtered_points) center = (int(circle_x), int(circle_y)) radius = int(radius) # 绘制最终的闭合圆形 cv2.circle(cropped_img, center, radius, (0, 0, 255), 2) cv2.imshow("optimized result", cropped_img) cv2.waitKey(0)
参数调整说明
- 若顶部畸变区域占比更大,可将
percentile的第二个参数从5调整为810,若畸变区域很小可以调整为23 - 如果轮廓整体畸变非常轻微,也可以跳过过滤步骤,直接用
all_valid_points拟合圆,接口本身会弱化局部异常点的影响
内容的提问来源于stack exchange,提问作者Divasjyoti Parashar
相关产品推荐
相关产品推荐

