You need to enable JavaScript to run this app. OpenCV图像处理:如何删除图像多余片段得到闭合蓝色区域轮廓
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 11:48:03