如何获取轮廓区域的颜色范围并进行条件判断
解决方法
你当前的代码基于灰度图提取轮廓,无法直接获取轮廓区域的彩色信息。要实现“检查轮廓区域是否在指定颜色范围”,需要结合彩色原图与轮廓掩码处理,具体步骤如下:
- 为每个轮廓生成专属掩码,仅保留轮廓覆盖的区域
- 通过掩码提取原图中对应区域的彩色像素,判断颜色是否符合指定范围
- 仅对符合颜色条件的轮廓进行绘制
以下是完整实现代码:
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
相关产品推荐
相关产品推荐

