You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取轮廓区域的颜色范围并进行条件判断

解决方法

你当前的代码基于灰度图提取轮廓,无法直接获取轮廓区域的彩色信息。要实现“检查轮廓区域是否在指定颜色范围”,需要结合彩色原图与轮廓掩码处理,具体步骤如下:

  • 为每个轮廓生成专属掩码,仅保留轮廓覆盖的区域
  • 通过掩码提取原图中对应区域的彩色像素,判断颜色是否符合指定范围
  • 仅对符合颜色条件的轮廓进行绘制

以下是完整实现代码:

import cv2
import numpy as np

# 读取彩色原图
img = cv2.imread('D:/original.png', cv2.IMREAD_COLOR)
# 转灰度图用于轮廓检测
img_grey = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 阈值处理生成二值图
thresh = 100
ret, thresh_img = cv2.threshold(img_grey, thresh, 255, cv2.THRESH_BINARY)

# 查找所有轮廓
contours, hierarchy = cv2.findContours(thresh_img, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

# 指定目标颜色范围(注意:OpenCV图像为BGR格式,顺序是蓝、绿、红)
lower_color = np.array([100, 100, 100], dtype=np.uint8)
upper_color = np.array([200, 200, 200], dtype=np.uint8)

# 创建结果画布,用于绘制符合条件的轮廓
result_img = img.copy()

for contour in contours:
    # 生成当前轮廓的填充掩码
    mask = np.zeros_like(img_grey)
    cv2.drawContours(mask, [contour], -1, 255, thickness=cv2.FILLED)
    
    # 通过掩码提取轮廓区域的彩色像素
    masked_color_area = cv2.bitwise_and(img, img, mask=mask)
    
    # 计算轮廓区域的颜色均值(比逐个像素检查更高效)
    mean_bgr = cv2.mean(masked_color_area, mask=mask)[:3]
    
    # 判断颜色均值是否在指定范围内
    if (lower_color <= mean_bgr).all() and (mean_bgr <= upper_color).all():
        # 绘制符合条件的轮廓(绿色,线宽2)
        cv2.drawContours(result_img, [contour], -1, (0, 255, 0), 2)

# 展示结果
cv2.imshow('Filtered Contours', result_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

关键细节说明

  • 掩码作用:通过填充轮廓生成的掩码,能精准锁定轮廓对应的图像区域,避免无关像素干扰颜色判断。
  • 颜色判断逻辑:使用区域颜色均值判断,平衡了性能与准确性;若要求区域内所有像素都符合颜色范围,可改用cv2.inRange结合掩码统计符合条件的像素占比。
  • 颜色格式注意:OpenCV默认读取图像为BGR通道顺序,指定颜色范围时需对应蓝、绿、红的顺序,不要与RGB格式混淆。

内容的提问来源于stack exchange,提问作者Amin Memar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 08:50:19