OpenCV图像处理:如何删除图像多余片段得到闭合蓝色区域轮廓
蓝色区域轮廓提取多余片段解决方法
核心修改思路
- 改用HSV颜色空间筛选蓝色区域:放弃灰度阈值方案,直接针对目标特征(蓝色)做筛选,避免灰度图中同亮度非蓝色区域被误判,适配批量处理的稳定性需求
- 修正轮廓提取数据源:原代码提取轮廓后才过滤小噪声,噪声的轮廓信息仍保留在原列表中,修改为过滤噪声后重新提取轮廓
- 增加最大轮廓筛选:目标蓝色区域为图像中最大的连通域,直接取面积最大的轮廓即可自动剔除剩余小噪声
- 补充闭运算填补缺口:针对轮廓不闭合的问题,用形态学闭运算填补目标区域的微小缺口,得到完整闭合区域
修改后完整代码
import cv2 import numpy as np # 读取原图(不要直接读灰度图) img = cv2.imread('VF2.jpg') hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) # HSV蓝色区间筛选,可根据实际图像微调上下限 lower_blue = np.array([90, 50, 50]) upper_blue = np.array([130, 255, 255]) mask = cv2.inRange(hsv, lower_blue, upper_blue) # 形态学处理:先开运算去小噪声,再闭运算补缺口 kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5,5)) morph = cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel) morph = cv2.morphologyEx(morph, cv2.MORPH_CLOSE, kernel) # 提取轮廓,只取外轮廓 cntrs = cv2.findContours(morph, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) cntrs = cntrs[0] if len(cntrs) == 2 else cntrs[1] # 取面积最大的轮廓作为目标 target_cnt = max(cntrs, key=cv2.contourArea) # 计算参数 length = cv2.arcLength(target_cnt, True) # 闭合轮廓周长 area = cv2.contourArea(target_cnt) print('长度 = ', length) print('面积 = ', area) # 可视化验证:在原图上画轮廓 result = img.copy() cv2.drawContours(result, [target_cnt], 0, (0, 0, 255), 2) # 显示结果 cv2.imshow("筛选后的蓝色区域mask", morph) cv2.imshow("最终轮廓结果", result) cv2.waitKey(0) cv2.destroyAllWindows()
效果说明
修改后代码会直接输出唯一的蓝色区域闭合轮廓,无需手动调整阈值适配不同大小的蓝色区域,批量处理稳定性更高。如果你的图像蓝色偏色,可以微调HSV的上下限参数即可适配。
内容的提问来源于stack exchange,提问作者Yuan
相关产品推荐
相关产品推荐

