OpenCV识别指定颜色并绘制轮廓的代码实现与解析

巷口听风
巷口听风
发布时间:2026-10-11 | 2人浏览过
原创

本文详解利用OpenCV在Python环境中识别图像特定颜色并提取轮廓的完整流程。通过BGR至HSV空间转换设定阈值生成掩膜,结合中值滤波与开运算去除噪声,最后调用轮廓查找接口筛选有效区域并绘制标记。附带可直接运行的代码片段与参数调优指南,适用于计算机视觉入门与自动化目标定位开发。

实现原理与处理流程

OpenCV 默认以 BGR 格式读取图像,但在实际应用中,基于 HSV(色调、饱和度、亮度)颜色空间进行色彩分割更为稳定。HSV 能够将颜色的基本信息从亮度干扰中分离出来,便于精确划定目标色域。

BGR转换为HSV颜色空间的逻辑示意图
OpenCV 将原始图像转换至 HSV 空间以便进行色彩范围筛选

选定目标颜色后,使用 cv2.inRange 设定上下界生成二值掩膜。随后针对掩膜进行形态学优化:cv2.medianBlur 执行中值滤波平滑边缘,消除孤立噪点;cv2.morphologyEx 配合椭圆核执行开运算(先腐蚀后膨胀),进一步清理微小杂质并确保主体区域连通。

卷积核滤波原理示意图
中值滤波依赖卷积核对像素邻域进行非线性平滑处理

处理后的纯净二值图交由 cv2.findContours 提取外部轮廓。根据业务需求过滤面积过小或过大的无效区域,最终使用 cv2.drawContours 在原图上叠加标记线。

二值图像轮廓提取与绘制效果
轮廓查找算法输出边界坐标并按条件覆盖绘制红色描边

代码实现与操作步骤

第1步:准备运行环境

需安装 opencv-python 与 numpy。确保脚本同级目录存在待处理的测试图片。若路径错误或文件损坏,程序将中断并返回错误提示。

第2步:加载图像与预处理

导入库后读取图片,并使用 cv2.resize 等比例缩小至原始大小的 0.7 倍。缩放可提升后续矩阵运算与轮廓遍历的速度,不影响识别逻辑。

第3步:转换色彩空间并生成掩膜

调用 cv2.cvtColor 将图像转为 HSV 格式。针对目标颜色(以黄色为例)配置 NumPy 数组作为阈值边界:

常见颜色的HSV数值参考表
不同颜色的 HSV 取值区间参考,H代表色相,S代表饱和度,V代表明度

代码中使用 yellow_min = np.array([26, 43, 46]) 与 yellow_max = np.array([34, 255, 255]) 划定范围,并通过 cv2.inRange 输出黑白掩膜。白色区域即为目标颜色像素。

第4步:执行降噪与轮廓绘制

对掩膜依次应用中值滤波(窗口大小设为 7)与开运算。随后调用 cv2.findContours 获取所有外部轮廓列表。遍历过程中计算单条轮廓面积,剔除小于 200 或大于 200000 的异常段。符合条件者使用 cv2.drawContours 以 (0, 0, 255)(BGR格式下的纯红色)绘制 2 像素宽度的闭合线条。为保留原始画面底色,绘制前需调用 img.copy() 创建副本。

import cv2
import numpy as np

# 1. 输入图片并调整大小
img = cv2.imread("./color_1.png")
if img is None:
    print("无法加载图片,请检查路径!")
    exit()
img = cv2.resize(img, (0, 0), fx=0.7, fy=0.7)

# 2. 转换 HSV 颜色空间
img_hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

# 3. 定义颜色范围并生成二值掩膜
yellow_min = np.array([26, 43, 46])  # 黄色下界
yellow_max = np.array([34, 255, 255])  # 黄色上界
img_mask = cv2.inRange(img_hsv, yellow_min, yellow_max)

# 4. 中值滤波去噪
img_blur = cv2.medianBlur(img_mask, 7)

# 5. 形态学变换 - 开运算
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5))
img_open = cv2.morphologyEx(img_blur, cv2.MORPH_OPEN, kernel)

# 6. 轮廓提取
contours, _ = cv2.findContours(img_open, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

# 7. 遍历轮廓并绘制
img_result = img.copy()
for contour in contours:
    area = cv2.contourArea(contour)
    if area < 200 or area > 200000:  # 根据面积过滤无效轮廓
        continue
    cv2.drawContours(img_result, [contour], -1, (0, 0, 255), 2)  # 绘制轮廓

# 8. 显示结果
cv2.imshow("Original Image", img)
cv2.imshow("Filtered Contours", img_result)

cv2.waitKey(0)
cv2.destroyAllWindows()

运行结果与完成判断

脚本执行后弹出两个窗口:Original Image 显示缩放后的原图,Filtered Contours 展示处理后的标记结果。

颜色识别与轮廓绘制最终运行结果
终端窗口同步显示原始图像与带红色轮廓标记的处理结果

验证是否成功的标准如下:

  • 掩膜窗口仅高亮目标色块,背景完全呈黑色。
  • 滤波与开运算后,目标区域边缘平滑且无孤立白点碎片。
  • 最终图像中符合面积阈值的封闭图形已被准确描边,未误连相邻色区。

调试排错指南

  • 找不到图片: 确认 cv2.imread() 传入的相对/绝对路径正确,且当前工作目录包含该文件。
  • 颜色识别不准: 光线变化会导致 HSV 浮动。可在控制台临时打印 img_hsv[y][x] 抓取样本值,微调阈值数组的 S 和 V 通道(通常 H 通道变动最大)。
  • 轮廓断裂或粘连: 调整 medianBlur 的奇数窗口值(建议 3~11),或修改 kernel 尺寸。开运算无法解决大面积遮挡,需结合其他分割算法。
  • 绘制颜色偏差: OpenCV 采用 BGR 通道顺序,红色应传 (0, 0, 255) 而非 RGB 标准的 (255, 0, 0)。

总结

通过色彩空间映射、阈值掩膜、形态学净化与轮廓几何分析,可快速搭建基础的视觉目标定位管线。代码中的面积拦截、缩放加速与通道顺序均为工程常用实践。以上就是OpenCV识别指定颜色并绘制轮廓的详细教程,更多关于计算机视觉与图像处理进阶的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表