如何使用OpenCV仅检测图像中填充区域的轮廓
基于OpenCV检测指定颜色填充区域轮廓的实现方案
输入示例图像:
你需要检测的是固定蓝色的填充区域,通过颜色阈值分割+轮廓提取的方案即可实现,无需额外的边缘检测处理,实现逻辑如下:
实现步骤
- 色彩空间转换:将OpenCV默认读取的BGR格式图像转换为HSV格式,HSV空间对单一颜色的分割效果更稳定
- 生成目标区域掩码:配置蓝色对应的HSV阈值范围,用
inRange接口输出仅保留蓝色填充区域的二值掩码 - 掩码降噪:对二值掩码做开运算,去除散点噪声,避免提取到无效的小轮廓
- 轮廓提取:调用
findContours接口提取掩码中的外轮廓 - 结果绘制:将提取到的轮廓绘制到原图上输出
完整可运行代码
import cv2 import numpy as np # 读取本地输入图像 img = cv2.imread("your_input_image_path.png") # BGR转HSV色彩空间 hsv_img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) # 蓝色对应的HSV阈值范围,可根据实际图像的色彩偏差微调 lower_blue = np.array([95, 40, 40]) upper_blue = np.array([135, 255, 255]) # 生成蓝色区域二值掩码,蓝色区域为白色,其余区域为黑色 blue_mask = cv2.inRange(hsv_img, lower_blue, upper_blue) # 开运算去除掩码中的小噪点 kernel = np.ones((3, 3), np.uint8) processed_mask = cv2.morphologyEx(blue_mask, cv2.MORPH_OPEN, kernel, iterations=1) # 提取掩码的外轮廓,仅保留轮廓关键点降低内存占用 contours, _ = cv2.findContours(processed_mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # 可选:过滤面积过小的误检轮廓 min_area = 100 valid_contours = [cnt for cnt in contours if cv2.contourArea(cnt) > min_area] # 在原图上绘制轮廓,红色、线宽2 cv2.drawContours(img, valid_contours, -1, (0, 0, 255), 2) # 展示和保存结果 cv2.imshow("detection result", img) cv2.imwrite("contour_result.png", img) cv2.waitKey(0) cv2.destroyAllWindows()
常见调整项
- 出现蓝色区域漏检时,适当放宽
lower_blue的下限或者upper_blue的上限 - 出现非目标区域误检时,增大形态学运算的核尺寸,或者调高轮廓过滤的最小面积阈值
min_area
内容的提问来源于stack exchange,提问作者Naji Naji
相关产品推荐
相关产品推荐

